Hex Artifact Content

Artifact f720f246a4ff95ca7b91a05cb19cff2bcbd2c490:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 23 20 20 20 20 64  time = 0;.#    d
1760: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1770: 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 7b 20 69  UG_PRINTTIME { i
1780: 66 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  f (cackey_debug_
1790: 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29  start_time == 0)
17a0: 20 7b 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f   { cackey_debug_
17b0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17c0: 65 28 4e 55 4c 4c 29 3b 20 7d 3b 20 66 70 72 69  e(NULL); }; fpri
17d0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
17e0: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 22  _fd(), "[%lu]: "
17f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1800: 29 20 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20  ) (time(NULL) - 
1810: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61  cackey_debug_sta
1820: 72 74 5f 74 69 6d 65 29 29 3b 20 7d 0a 23 20 20  rt_time)); }.#  
1830: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
1840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1850: 49 4e 54 54 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20  INTTIME /**/.#  
1860: 65 6e 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65  endif..#  define
1870: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1880: 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 43 41 43  INTF(x...) { CAC
1890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
18a0: 49 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63  IME; fprintf(cac
18b0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
18c0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66  "%s():%i: ", __f
18d0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
18e0: 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ; fprintf(cackey
18f0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 78 29 3b  _debug_fd(), x);
1900: 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f   fprintf(cackey_
1910: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22  debug_fd(), "\n"
1920: 29 3b 20 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ); fflush(cackey
1930: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a  _debug_fd()); }.
1940: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1960: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67  f, x, y) { unsig
1970: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46  ned char *TMPBUF
1980: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ; unsigned long 
1990: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75  idx; TMPBUF = (u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
19b0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55  (x); CACKEY_DEBU
19c0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72  G_PRINTTIME; fpr
19d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
19e0: 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69  g_fd(), "%s():%i
19f0: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1a00: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f  {%02x", __func__
1a10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23  , __LINE__, f, #
1a20: 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1a30: 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 5b 30  g) (y), TMPBUF[0
1a40: 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d 20 31  ]); for (idx = 1
1a50: 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 64 78  ; idx < (y); idx
1a60: 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 63 61  ++) { fprintf(ca
1a70: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1a80: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1a90: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69  F[idx]); }; fpri
1aa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1ab0: 5f 66 64 28 29 2c 20 22 7d 29 5c 6e 22 29 3b 20  _fd(), "})\n"); 
1ac0: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1ad0: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1ae0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
1af0: 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b 20  BUG_PERROR(x) { 
1b00: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1b10: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1b20: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f  :%i: ", __func__
1b30: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 43 41 43  , __LINE__); CAC
1b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
1b50: 49 4d 45 3b 20 70 65 72 72 6f 72 28 78 29 3b 20  IME; perror(x); 
1b60: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1b70: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1b80: 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b  define free(x) {
1b90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1ba0: 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28  INTF("FREE(%p) (
1bb0: 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78  %s)", (void *) x
1bc0: 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20  , #x); free(x); 
1bd0: 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  }..static FILE *
1be0: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1bf0: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
1c00: 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b  FILE *fd = NULL;
1c10: 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b  ..char *logfile;
1c20: 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c  ...if (fd != NUL
1c30: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64  L) {...return(fd
1c40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c  );..}.../*.. * L
1c50: 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69  og to stderr ini
1c60: 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e  tially so we can
1c70: 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77   use debugging w
1c80: 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66  ithin.. * this f
1c90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
1ca0: 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20  getting into an 
1cb0: 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20  infinite loop.. 
1cc0: 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b  */..fd = stderr;
1cd0: 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74  ...logfile = get
1ce0: 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55  env("CACKEY_DEBU
1cf0: 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66  G_LOGFILE");..if
1d00: 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c   (logfile != NUL
1d10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1d20: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d30: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
1d40: 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67  riable: %s", log
1d50: 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c  file);....logfil
1d60: 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69  e = strchr(logfi
1d70: 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28  le, '=');...if (
1d80: 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  logfile == NULL)
1d90: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20   {....logfile = 
1da0: 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1db0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a  EBUG_LOGFILE");.
1dc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f  ..} else {....lo
1dd0: 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  gfile++;...}..}.
1de0: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1df0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e10: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20  Found log file: 
1e20: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e30: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67  ..fd = fopen(log
1e40: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a  file, "a");..}..
1e50: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29  .if (fd == NULL)
1e60: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72   {...fd = stderr
1e70: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d  ;..}...if (fd ==
1e80: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43   stderr) {...CAC
1e90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65  ("Returning stde
1eb0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  rr");..} else {.
1ec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ee0: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66   %p", (void *) f
1ef0: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  d);..}...return(
1f00: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  fd);.}..static v
1f10: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
1f20: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
1f30: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
1f40: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
1f50: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
1f60: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
1f70: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
1f80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f90: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69  PRINTTIME;..fpri
1fa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1fb0: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a  _fd(), "%s():%i:
1fc0: 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b   ", func, line);
1fd0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1fe0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 4d 41  _debug_fd(), "MA
1ff0: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
2000: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
2010: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2020: 29 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73  ), "\n");..fflus
2030: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
2040: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  d());...return(r
2050: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
2060: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
2070: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
2080: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
2090: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
20a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
20b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
20c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
20d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73  = realloc(ptr, s
20e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  ize);...if (retv
20f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 43  al != ptr) {...C
2100: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2110: 54 54 49 4d 45 3b 0a 09 09 66 70 72 69 6e 74 66  TTIME;...fprintf
2120: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2130: 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  (), "%s():%i: ",
2140: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09   func, line);...
2150: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2160: 65 62 75 67 5f 66 64 28 29 2c 20 22 52 45 41 4c  ebug_fd(), "REAL
2170: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
2180: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
2190: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
21a0: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b  bug_fd(), "\n");
21b0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
21c0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
21d0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
21e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
21f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2200: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2210: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2220: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2230: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2240: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2250: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2260: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2280: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2290: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
22a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
22b0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
22c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
22d0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
22e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f0: 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74  INTTIME;..fprint
2300: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
2310: 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22  d(), "%s():%i: "
2320: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09  , func, line);..
2330: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2340: 65 62 75 67 5f 66 64 28 29 2c 20 22 53 54 52 44  ebug_fd(), "STRD
2350: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
2360: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72  ", retval);..fpr
2370: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2380: 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09  g_fd(), "\n");..
2390: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
23a0: 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74  bug_fd());...ret
23b0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
23c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
23e0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
2400: 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61  g) {..switch (ta
2410: 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49  g) {...case GSCI
2420: 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09  S_TAG_CARDID:...
2430: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2440: 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63  AG_CARDID");...c
2450: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43  ase GSCIS_TAG_CC
2460: 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  C_VER:....return
2470: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  ("GSCIS_TAG_CCC_
2480: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  VER");...case GS
2490: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a  CIS_TAG_CCG_VER:
24a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24b0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b  S_TAG_CCG_VER");
24c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
24d0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65  G_CARDURL:....re
24e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24f0: 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73  CARDURL");...cas
2500: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
2510: 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  15:....return("G
2520: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22  SCIS_TAG_PKCS15"
2530: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2540: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
2550: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  EL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54  SCIS_TAG_REG_DAT
2570: 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73  A_MODEL");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
2590: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
25a0: 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  ("GSCIS_TAG_ACR_
25b0: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TABLE");...case 
25c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25d0: 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  PDU:....return("
25e0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25f0: 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  PDU");...case GS
2600: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2610: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
2630: 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20  CTION");...case 
2640: 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09  GSCIS_TAG_CT:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2660: 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_CT");...case 
2670: 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09  GSCIS_TAG_ST:...
2680: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2690: 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_ST");...case 
26a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
26b0: 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  C:....return("GS
26c0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22  CIS_TAG_NEXTCCC"
26d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
26e0: 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_FNAME:....re
26f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2700: 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  FNAME");...case 
2710: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a  GSCIS_TAG_MNAME:
2720: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2730: 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09  S_TAG_MNAME");..
2740: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2750: 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  LNAME:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  ("GSCIS_TAG_LNAM
2770: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2780: 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09  S_TAG_SUFFIX:...
2790: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
27a0: 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63  AG_SUFFIX");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ase GSCIS_TAG_GO
27c0: 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65  VT_AGENCY:....re
27d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
27e0: 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09  GOVT_AGENCY");..
27f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2800: 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72  BUREAU:....retur
2810: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
2820: 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EAU");...case GS
2830: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2840: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2850: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2860: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
2880: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2890: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
28a0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
28b0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09  CIS_TAG_TITLE:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63  TAG_TITLE");...c
28e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
28f0: 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72  ILDING:....retur
2900: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49  n("GSCIS_TAG_BUI
2910: 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20  LDING");...case 
2920: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2930: 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72  _ADDR1:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2950: 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63  ICE_ADDR1");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2970: 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72  FICE_ADDR2:....r
2980: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2990: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b  _OFFICE_ADDR2");
29a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29b0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09  G_OFFICE_CITY:..
29c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
29d0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22  TAG_OFFICE_CITY"
29e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
29f0: 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45  TAG_OFFICE_STATE
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a10: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a20: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2a30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a  CIS_TAG_OFFICE_Z
2a40: 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IP:....return("G
2a50: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2a60: 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ZIP");...case GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72  OUNTRY:....retur
2a90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2aa0: 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09  ICE_COUNTRY");..
2ab0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ac0: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09  OFFICE_PHONE:...
2ad0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22  AG_OFFICE_PHONE"
2af0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b00: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b10: 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  _EXT:....return(
2b20: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b30: 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09  E_PHONE_EXT");..
2b40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b50: 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72  OFFICE_FAX:....r
2b60: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b70: 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09  _OFFICE_FAX");..
2b80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b90: 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09  OFFICE_EMAIL:...
2ba0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2bb0: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22  AG_OFFICE_EMAIL"
2bc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bd0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a  TAG_OFFICE_ROOM:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2bf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2c00: 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  M");...case GSCI
2c10: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45  S_TAG_NONGOV_AGE
2c20: 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NCY:....return("
2c30: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2c40: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73  _AGENCY");...cas
2c50: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  e GSCIS_TAG_SSN_
2c60: 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72  DESIGNATOR:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c80: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22  _SSN_DESIGNATOR"
2c90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ca0: 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75  TAG_SSN:....retu
2cb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53  rn("GSCIS_TAG_SS
2cc0: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  N");...case GSCI
2cd0: 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65  S_TAG_DOB:....re
2ce0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2cf0: 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DOB");...case GS
2d00: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a  CIS_TAG_GENDER:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09  _TAG_GENDER");..
2d30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d40: 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  USERID:....retur
2d50: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45  n("GSCIS_TAG_USE
2d60: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2d70: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a  CIS_TAG_DOMAIN:.
2d80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d90: 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09  _TAG_DOMAIN");..
2da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2db0: 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74  PASSWORD:....ret
2dc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50  urn("GSCIS_TAG_P
2dd0: 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73  ASSWORD");...cas
2de0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2df0: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2e00: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45  "GSCIS_TAG_ISSUE
2e10: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2e20: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09  CIS_TAG_SERNO:..
2e30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2e40: 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63  TAG_SERNO");...c
2e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2e60: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
2e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2e80: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58  ase GSCIS_TAG_EX
2ea0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  PIRE_DATE:....re
2eb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2ec0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65  CARD_TYPE:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f00: 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63  CARD_TYPE");...c
2f10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ase GSCIS_TAG_SE
2f20: 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09  CURITY_CODE:....
2f30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f40: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22  G_SECURITY_CODE"
2f50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f60: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a  TAG_CARDID_AID:.
2f70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2f80: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22  _TAG_CARDID_AID"
2f90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fa0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fc0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
2fd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2fe0: 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45  S_TAG_CERT_ISSUE
2ff0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
3000: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  ("GSCIS_TAG_CERT
3010: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
3020: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3030: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45  CERT_EXPIRE_DATE
3040: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3050: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49  IS_TAG_CERT_EXPI
3060: 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09  RE_DATE");..}...
3070: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
3080: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
3090: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
30a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
30b0: 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20  ERR_TO_STR(LONG 
30c0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74  retcode) {..swit
30d0: 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09  ch (retcode) {..
30e0: 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55  .case SCARD_S_SU
30f0: 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CCESS:....return
3100: 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  ("SCARD_S_SUCCES
3110: 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  S");...case SCAR
3120: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  D_E_CANCELLED:..
3130: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3140: 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09  E_CANCELLED");..
3150: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3160: 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72  NT_DISPOSE:....r
3170: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3180: 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09  ANT_DISPOSE");..
3190: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
31a0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
31b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
31c0: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
31d0: 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63  NT_BUFFER");...c
31e0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
31f0: 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75  LID_ATR:....retu
3200: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
3210: 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73  LID_ATR");...cas
3220: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
3230: 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74  D_HANDLE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3250: 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09  ALID_HANDLE");..
3260: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3270: 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a  VALID_PARAMETER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3290: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41  D_E_INVALID_PARA
32a0: 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20  METER");...case 
32b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
32c0: 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72  TARGET:....retur
32d0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
32e0: 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63  ID_TARGET");...c
32f0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3300: 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65  LID_VALUE:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3320: 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09  VALID_VALUE");..
3330: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3340: 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75  _MEMORY:....retu
3350: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  rn("SCARD_E_NO_M
3360: 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20  EMORY");...case 
3370: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3380: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3390: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
33a0: 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  WN_READER");...c
33b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45  ase SCARD_E_TIME
33c0: 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OUT:....return("
33d0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22  SCARD_E_TIMEOUT"
33e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33f0: 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  E_SHARING_VIOLAT
3400: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
3410: 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f  SCARD_E_SHARING_
3420: 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63  VIOLATION");...c
3430: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  ase SCARD_E_NO_S
3440: 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74  MARTCARD:....ret
3450: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
3460: 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63  SMARTCARD");...c
3470: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3480: 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  OWN_CARD:....ret
3490: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
34a0: 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63  NOWN_CARD");...c
34b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ase SCARD_E_PROT
34c0: 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72  O_MISMATCH:....r
34d0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50  eturn("SCARD_E_P
34e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b  ROTO_MISMATCH");
34f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3500: 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65  NOT_READY:....re
3510: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3520: 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73  T_READY");...cas
3530: 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  e SCARD_E_SYSTEM
3540: 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72  _CANCELLED:....r
3550: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3560: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22  YSTEM_CANCELLED"
3570: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3580: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35a0: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
35b0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
35c0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41  ARD_E_READER_UNA
35d0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74  VAILABLE:....ret
35e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
35f0: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22  DER_UNAVAILABLE"
3600: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3610: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
3620: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3630: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54  CARD_W_UNSUPPORT
3640: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
3650: 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50  e SCARD_W_UNRESP
3660: 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09  ONSIVE_CARD:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3680: 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52  UNRESPONSIVE_CAR
3690: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
36a0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
36b0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
36c0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
36d0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
36e0: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
36f0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3700: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
3710: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3720: 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44  D_W_REMOVED_CARD
3730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3740: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52  RD_W_REMOVED_CAR
3750: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3760: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
3770: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  L:....return("SC
3780: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3790: 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ALL");...case SC
37a0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53  ARD_E_READER_UNS
37b0: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
37c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
37d0: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  DER_UNSUPPORTED"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37f0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3800: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3810: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45  CARD_E_DUPLICATE
3820: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
3830: 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  e SCARD_E_CARD_U
3840: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
3850: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3860: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  ARD_UNSUPPORTED"
3870: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3880: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09  E_NO_SERVICE:...
3890: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38a0: 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09  _NO_SERVICE");..
38b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45  .case SCARD_E_SE
38c0: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09  RVICE_STOPPED:..
38d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38e0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
38f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3900: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
3910: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75  FEATURE:....retu
3920: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55  rn("SCARD_E_UNSU
3930: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22  PPORTED_FEATURE"
3940: 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f  );.#ifdef SCARD_
3950: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a  W_INSERTED_CARD.
3960: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49  ..case SCARD_W_I
3970: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09  NSERTED_CARD:...
3980: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
3990: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29  _INSERTED_CARD")
39a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
39b0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
39c0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63  RS_AVAILABLE...c
39d0: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  ase SCARD_E_NO_R
39e0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
39f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a00: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3a10: 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e  AVAILABLE");.#en
3a20: 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  dif..}...return(
3a30: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
3a40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3a50: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3a60: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
3a70: 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29  (uint16_t objid)
3a80: 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69   {..switch (obji
3a90: 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30  d) {...case 0x20
3aa0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3ab0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3ac0: 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09  GENERALINFO");..
3ad0: 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09  .case 0x2100:...
3ae0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3af0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b00: 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  SONALINFO");...c
3b10: 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72  ase 0x3000:....r
3b20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3b30: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3b40: 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20  NTROL");...case 
3b50: 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x4000:....retur
3b60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b70: 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63  JID_LOGIN");...c
3b80: 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72  ase 0x5000:....r
3b90: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ba0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
3bb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30  ");...case 0x600
3bc0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3bd0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
3be0: 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63  IOMETRICS");...c
3bf0: 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72  ase 0x7000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
3c20: 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65  IGCERT");...case
3c30: 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75   0x0200:....retu
3c40: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3c50: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22  BJID_CAC_PERSON"
3c60: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32  );...case 0x0202
3c70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3c80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3c90: 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  C_BENEFITS");...
3ca0: 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09  case 0x0203:....
3cb0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cc0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
3cd0: 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  ERBENEFITS");...
3ce0: 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09  case 0x0201:....
3cf0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d00: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d10: 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65  SONNEL");...case
3d20: 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75   0x02FE:....retu
3d30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3d40: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
3d50: 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e  ");..}....return
3d60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
3d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3d80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
3d90: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
3da0: 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74  STR(uint8_t appt
3db0: 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  ype) {..switch (
3dc0: 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73  apptype) {...cas
3dd0: 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72  e 0x00:....retur
3de0: 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73  n("NONE");...cas
3df0: 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72  e 0x01:....retur
3e00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e10: 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63  P_GENERIC");...c
3e20: 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74  ase 0x02:....ret
3e30: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e40: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3e50: 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72  e 0x03:....retur
3e60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e70: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3e90: 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09  ;...case 0x04:..
3ea0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3eb0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3ec0: 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09  ..case 0x05:....
3ed0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ee0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3ef0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3f00: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
3f10: 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  06:....return("C
3f20: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f30: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
3f40: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3f50: 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e   0x07:....return
3f60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3f70: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
3f80: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3f90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3fa0: 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  KI");..}...retur
3fb0: 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a  n("INVALID");.}.
3fc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3fd0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3fe0: 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f  _FUNC_ATTRIBUTE_
3ff0: 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42  TO_STR(CK_ATTRIB
4000: 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b  UTE_TYPE attr) {
4010: 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29 20  ..switch (attr) 
4020: 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  {...case CKA_CLA
4030: 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SS:....return("C
4040: 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61  KA_CLASS");...ca
4050: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
4060: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b  .return("CKA_TOK
4070: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
4080: 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74  _PRIVATE:....ret
4090: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45  urn("CKA_PRIVATE
40a0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c  ");...case CKA_L
40b0: 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABEL:....return(
40c0: 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09  "CKA_LABEL");...
40d0: 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41  case CKA_APPLICA
40e0: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  TION:....return(
40f0: 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e  "CKA_APPLICATION
4100: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4110: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
4120: 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09  "CKA_VALUE");...
4130: 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f  case CKA_OBJECT_
4140: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
4150: 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a  KA_OBJECT_ID");.
4160: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
4170: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
4180: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54  return("CKA_CERT
4190: 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a  IFICATE_TYPE");.
41a0: 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
41b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
41c0: 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  A_ISSUER");...ca
41d0: 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  se CKA_SERIAL_NU
41e0: 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  MBER:....return(
41f0: 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42  "CKA_SERIAL_NUMB
4200: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4210: 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72  _AC_ISSUER:....r
4220: 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53  eturn("CKA_AC_IS
4230: 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  SUER");...case C
4240: 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74  KA_OWNER:....ret
4250: 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29  urn("CKA_OWNER")
4260: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54  ;...case CKA_ATT
4270: 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75  R_TYPES:....retu
4280: 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50  rn("CKA_ATTR_TYP
4290: 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ES");...case CKA
42a0: 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74  _TRUSTED:....ret
42b0: 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44  urn("CKA_TRUSTED
42c0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b  ");...case CKA_K
42d0: 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  EY_TYPE:....retu
42e0: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45  rn("CKA_KEY_TYPE
42f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4300: 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72  UBJECT:....retur
4310: 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29  n("CKA_SUBJECT")
4320: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ;...case CKA_ID:
4330: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4340: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ID");...case CKA
4350: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72  _SENSITIVE:....r
4360: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49  eturn("CKA_SENSI
4370: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
4380: 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72  KA_ENCRYPT:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59  eturn("CKA_ENCRY
43a0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
43b0: 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _DECRYPT:....ret
43c0: 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54  urn("CKA_DECRYPT
43d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57  ");...case CKA_W
43e0: 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  RAP:....return("
43f0: 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61  CKA_WRAP");...ca
4400: 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09  se CKA_UNWRAP:..
4410: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e  ..return("CKA_UN
4420: 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43  WRAP");...case C
4430: 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75  KA_SIGN:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a  rn("CKA_SIGN");.
4450: 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f  ..case CKA_SIGN_
4460: 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75  RECOVER:....retu
4470: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43  rn("CKA_SIGN_REC
4480: 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  OVER");...case C
4490: 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65  KA_VERIFY:....re
44a0: 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59  turn("CKA_VERIFY
44b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
44c0: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09  ERIFY_RECOVER:..
44d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
44e0: 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a  RIFY_RECOVER");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56  ..case CKA_DERIV
4500: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4510: 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61  A_DERIVE");...ca
4520: 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54  se CKA_START_DAT
4530: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4540: 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a  A_START_DATE");.
4550: 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44  ..case CKA_END_D
4560: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4570: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a  CKA_END_DATE");.
4580: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
4590: 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  US:....return("C
45a0: 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09  KA_MODULUS");...
45b0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
45c0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
45d0: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49  ("CKA_MODULUS_BI
45e0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
45f0: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4600: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4610: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4630: 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a  RIVATE_EXPONENT:
4640: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4650: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54  PRIVATE_EXPONENT
4660: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4670: 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72  RIME_1:....retur
4680: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29  n("CKA_PRIME_1")
4690: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
46a0: 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_2:....return(
46b0: 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a  "CKA_PRIME_2");.
46c0: 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e  ..case CKA_EXPON
46d0: 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e  ENT_1:....return
46e0: 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  ("CKA_EXPONENT_1
46f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4700: 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65  XPONENT_2:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4720: 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_2");...case C
4730: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a  KA_COEFFICIENT:.
4740: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4750: 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09  OEFFICIENT");...
4760: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a  case CKA_PRIME:.
4770: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4780: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
4790: 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09  KA_SUBPRIME:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50  return("CKA_SUBP
47b0: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
47c0: 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75  KA_BASE:....retu
47d0: 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a  rn("CKA_BASE");.
47e0: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
47f0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4800: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  ("CKA_PRIME_BITS
4810: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4820: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09  UB_PRIME_BITS:..
4830: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4840: 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a  B_PRIME_BITS");.
4850: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
4860: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4870: 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  ("CKA_VALUE_BITS
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4890: 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74  ALUE_LEN:....ret
48a0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c  urn("CKA_VALUE_L
48b0: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
48c0: 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09  _EXTRACTABLE:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54  .return("CKA_EXT
48e0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
48f0: 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09  se CKA_LOCAL:...
4900: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43  .return("CKA_LOC
4910: 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AL");...case CKA
4920: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4930: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4940: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4950: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43  ABLE");...case C
4960: 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54  KA_ALWAYS_SENSIT
4970: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
4980: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49  CKA_ALWAYS_SENSI
4990: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
49a0: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
49b0: 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28  NISM:....return(
49c0: 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43  "CKA_KEY_GEN_MEC
49d0: 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65  HANISM");...case
49e0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
49f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4a00: 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09  MODIFIABLE");...
4a10: 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50  case CKA_ECDSA_P
4a20: 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e  ARAMS:....return
4a30: 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41  ("CKA_ECDSA_PARA
4a40: 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  MS");...case CKA
4a50: 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65  _EC_POINT:....re
4a60: 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49  turn("CKA_EC_POI
4a70: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4a80: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a  _SECONDARY_AUTH:
4a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4aa0: 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29  SECONDARY_AUTH")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54  ;...case CKA_AUT
4ac0: 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09  H_PIN_FLAGS:....
4ad0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48  return("CKA_AUTH
4ae0: 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09  _PIN_FLAGS");...
4af0: 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54  case CKA_HW_FEAT
4b00: 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  URE_TYPE:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54  urn("CKA_HW_FEAT
4b20: 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  URE_TYPE");...ca
4b30: 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  se CKA_RESET_ON_
4b40: 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  INIT:....return(
4b50: 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e  "CKA_RESET_ON_IN
4b60: 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  IT");...case CKA
4b70: 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72  _HAS_RESET:....r
4b80: 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52  eturn("CKA_HAS_R
4b90: 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43  ESET");...case C
4ba0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45  KA_VENDOR_DEFINE
4bb0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4bc0: 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44  A_VENDOR_DEFINED
4bd0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
4be0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23  "UNKNOWN");.}..#
4bf0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
4c00: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
4c10: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
4c20: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4c30: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
4c40: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
4c50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
4c60: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
4c70: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
4c80: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
4c90: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
4ca0: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
4cb0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
4cc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cd0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
4ce0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
4cf0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
4d00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4d10: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
4d20: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4d30: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
4d40: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
4d50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4d60: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
4d70: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4d80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
4d90: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4da0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4db0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4dc0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
4dd0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4de0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4df0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
4e10: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e20: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e30: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e40: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
4e90: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4ea0: 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a  ISABLED".#endif.
4eb0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4ec0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  csc_identity {..
4ed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70  unsigned char ap
4ee0: 70 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36  plet[7];..uint16
4ef0: 5f 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f  _t file;...size_
4f00: 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
4f10: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  n;..unsigned cha
4f20: 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
4f30: 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a  ..ssize_t keysiz
4f40: 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  e;.};..struct ca
4f50: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a  ckey_identity {.
4f60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4f70: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
4f80: 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43  sc_identity;...C
4f90: 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74  K_ATTRIBUTE *att
4fa0: 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f  ributes;..CK_ULO
4fb0: 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f  NG attributes_co
4fc0: 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  unt;.};..struct 
4fd0: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b  cackey_session {
4fe0: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09  ..int active;...
4ff0: 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
5000: 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74  D;...CK_STATE st
5010: 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66  ate;..CK_FLAGS f
5020: 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  lags;..CK_ULONG 
5030: 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09  ulDeviceError;..
5040: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
5050: 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f  lication;..CK_NO
5060: 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73  TIFY Notify;...s
5070: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5080: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
5090: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
50a0: 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  g identities_cou
50b0: 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68  nt;...int search
50c0: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54  _active;..CK_ATT
50d0: 52 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63  RIBUTE_PTR searc
50e0: 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f  h_query;..CK_ULO
50f0: 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f  NG search_query_
5100: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64  count;..unsigned
5110: 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72   long search_cur
5120: 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e  r_id;...int sign
5130: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
5140: 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e  HANISM_TYPE sign
5150: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f  _mechanism;..CK_
5160: 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75  BYTE_PTR sign_bu
5170: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
5180: 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09  g sign_buflen;..
5190: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
51a0: 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72  gn_bufused;..str
51b0: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
51c0: 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69  ity *sign_identi
51d0: 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70  ty;...int decryp
51e0: 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45  t_active;..CK_ME
51f0: 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63  CHANISM_TYPE dec
5200: 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a  rypt_mechanism;.
5210: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63  .CK_VOID_PTR dec
5220: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a  rypt_mech_parm;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70  .CK_ULONG decryp
5240: 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a  t_mech_parmlen;.
5250: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
5260: 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74  dentity *decrypt
5270: 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73  _identity;.};..s
5280: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5290: 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  t {..int active;
52a0: 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a  ..int internal;.
52b0: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
52c0: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
52d0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
52e0: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
52f0: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
5300: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
5310: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
5320: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a  n_need_hw_lock;.
5330: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
5340: 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b  ;...CK_FLAGS tok
5350: 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69  en_flags;...unsi
5360: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
5370: 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  ;...DWORD protoc
5380: 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69  ol;...unsigned i
5390: 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f  nt cached_certs_
53a0: 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63  count;..struct c
53b0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
53c0: 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74  ity *cached_cert
53d0: 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65  s;.};..typedef e
53e0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
53f0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20  V_APP_GENERIC = 
5400: 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x01,..CACKEY_TL
5410: 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20  V_APP_SKI     = 
5420: 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x02,..CACKEY_TL
5430: 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20  V_APP_PKI     = 
5440: 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  0x04.} cackey_tl
5450: 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65  v_apptype;..type
5460: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
5470: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e  EY_TLV_OBJID_GEN
5480: 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d  ERALINFO       =
5490: 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x2000,..CACKEY
54a0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45  _TLV_OBJID_PROPE
54b0: 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30  RSONALINFO   = 0
54c0: 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2100,..CACKEY_T
54d0: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43  LV_OBJID_ACCESSC
54e0: 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33  ONTROL     = 0x3
54f0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5500: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20  _OBJID_LOGIN    
5510: 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30           = 0x400
5520: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5530: 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20  BJID_CARDINFO   
5540: 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c         = 0x5000,
5550: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5560: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20  ID_BIOMETRICS   
5570: 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09       = 0x6000,..
5580: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5590: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20  _DIGITALSIGCERT 
55a0: 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41     = 0x7000,..CA
55b0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
55c0: 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20  AC_PERSON       
55d0: 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b   = 0x0200,..CACK
55e0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
55f0: 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d  _BENEFITS      =
5600: 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59   0x0202,..CACKEY
5610: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
5620: 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30  THERBENEFITS = 0
5630: 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54  x0203,..CACKEY_T
5640: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
5650: 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30  SONNEL     = 0x0
5660: 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  201,..CACKEY_TLV
5670: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
5680: 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46  RT       = 0x02F
5690: 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f  E.} cackey_tlv_o
56a0: 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65  bjectid;..typede
56b0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
56c0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
56d0: 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41  SENT    = 1,..CA
56e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c              = 0,
5700: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5710: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20  GENERIC         
5720: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -1,..CACKEY_PC
5730: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20  SC_E_BADPIN     
5740: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b       = -2,..CACK
5750: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
5760: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a            = -3,.
5770: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  .CACKEY_PCSC_E_N
5780: 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d  EEDLOGIN       =
5790: 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -4,..CACKEY_PCS
57a0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20  C_E_TOKENABSENT 
57b0: 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45      = -6,..CACKE
57c0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20  Y_PCSC_E_RETRY  
57d0: 20 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20           = -7.} 
57e0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72  cackey_ret;..str
57f0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
5800: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e  ardurl {..unsign
5810: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72  ed char        r
5820: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74  id[5];..cackey_t
5830: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70  lv_apptype   app
5840: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  type;..cackey_tl
5850: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65  v_objectid  obje
5860: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  ctid;..cackey_tl
5870: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69  v_objectid  appi
5880: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  d;..unsigned cha
5890: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a  r        pinid;.
58a0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
58b0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74  y_tlv_entity;.st
58c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
58d0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f  entity {..uint8_
58e0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  t tag;..size_t l
58f0: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ength;...union {
5900: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a  ...void *value;.
5910: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5920: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c  tlv_cardurl *val
5930: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69  ue_cardurl;...ui
5940: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65  nt8_t value_byte
5950: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63  ;..};...struct c
5960: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
5970: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20   *_next;.};../* 
5980: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61  CACKEY Global Ha
5990: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
59a0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67  void *cackey_big
59b0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  lock = NULL;.sta
59c0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
59d0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79  y_session cackey
59e0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a  _sessions[128];.
59f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5a00: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79  ckey_slot cackey
5a10: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61  _slots[128];.sta
5a20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69  tic int cackey_i
5a30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
5a40: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5a50: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
5a60: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   0;.CK_C_INITIAL
5a70: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f  IZE_ARGS cackey_
5a80: 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61  args;../** Extra
5a90: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f   certificates to
5aa0: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65   include in toke
5ab0: 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63  n **/.struct cac
5ac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
5ad0: 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20  y extra_certs[] 
5ae0: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61  = {.#include "ca
5af0: 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72  ckey_builtin_cer
5b00: 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53  ts.h".};../* PCS
5b10: 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73  C Global Handles
5b20: 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41   */.static LPSCA
5b30: 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79  RDCONTEXT cackey
5b40: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
5b50: 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73  ULL;..static uns
5b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65  igned long cacke
5b70: 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69  y_getversion(voi
5b80: 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73  d) {..static uns
5b90: 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61  igned long retva
5ba0: 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e  l = 255;..unsign
5bb0: 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20  ed long major = 
5bc0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  0;..unsigned lon
5bd0: 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68  g minor = 0;..ch
5be0: 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20  ar *major_str = 
5bf0: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e  NULL;..char *min
5c00: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a  or_str = NULL;..
5c10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5c20: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
5c30: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d  ...if (retval !=
5c40: 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   255) {...CACKEY
5c50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
5c60: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28  eturning 0x%lx (
5c70: 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61  cached).", retva
5c80: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
5c90: 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  tval);..}...retv
5ca0: 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  al = 0;..#ifdef 
5cb0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
5cc0: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74          major_st
5cd0: 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53  r = PACKAGE_VERS
5ce0: 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  ION;..if (major_
5cf0: 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20  str) {..        
5d00: 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28  major = strtoul(
5d10: 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f  major_str, &mino
5d20: 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69  r_str, 10);....i
5d30: 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a  f (minor_str) {.
5d40: 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f  ...minor = strto
5d50: 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31  ul(minor_str + 1
5d60: 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d  , NULL, 10);...}
5d70: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28  ..}...retval = (
5d80: 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28  major << 16) | (
5d90: 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e  minor << 8);.#en
5da0: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
5db0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
5dc0: 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74  ning 0x%lx", ret
5dd0: 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
5de0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43  etval);.}../* PC
5df0: 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63  /SC Related Func
5e00: 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53  tions */./*. * S
5e10: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76  YNPOSIS. *     v
5e20: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
5e30: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
5e40: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5e50: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5e60: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5e70: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
5e80: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
5e90: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
5ea0: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66  on disconnects f
5eb0: 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20  rom all cards.. 
5ec0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
5ed0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
5ee0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
5ef0: 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  id) {..uint32_t 
5f00: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
5f10: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
5f20: 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64  ed.");...for (id
5f30: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
5f40: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
5f50: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
5f60: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
5f70: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
5f80: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5f90: 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f  internal) {..../
5fa0: 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20  * Skip internal 
5fb0: 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74  slots */....cont
5fc0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
5fd0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
5fe0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
5ff0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43  nected) {....CAC
6000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6010: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ("SCardDisconnec
6020: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20  t(%lu) called", 
6030: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6040: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  idx);.....SCardD
6050: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79  isconnect(cackey
6060: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
6070: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
6080: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09  VE_CARD);...}...
6090: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
60a0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a  s[idx].label) {.
60b0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
60c0: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
60d0: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
60e0: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
60f0: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
6100: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6110: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
6120: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
6130: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
6140: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
6150: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
6160: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
6170: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
6180: 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  = 0;....if (cack
6190: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
61a0: 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45  tive) {....CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
61c0: 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73  Marking active s
61d0: 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67  lot %lu as being
61e0: 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e   reset", (unsign
61f0: 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09  ed long) idx);..
6200: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  .}....cackey_slo
6210: 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73  ts[idx].slot_res
6220: 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43  et = 1;..}...CAC
6230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6240: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a  ("Returning");..
6250: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
6260: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6270: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6280: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6290: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
62a0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
62b0: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
62c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
62d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
62e0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
62f0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6300: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6310: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6320: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6330: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e  is function conn
6340: 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53  ects to the PC/S
6350: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6360: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ager and updates
6370: 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62   the. *     glob
6380: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a  al handle.. *. *
6390: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
63a0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
63b0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
63c0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f  .LONG scard_est_
63d0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66  context_ret;.#if
63e0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
63f0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f  VALIDCONTEXT..LO
6400: 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  NG scard_isvalid
6410: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
6420: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6430: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
6440: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6450: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
6460: 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63   {...cackey_pcsc
6470: 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63  _handle = malloc
6480: 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
6490: 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09  pcsc_handle));..
64a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
64b0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
64c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
64d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
64e0: 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  to malloc() fail
64f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
6500: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
6510: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
6520: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
6530: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6540: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
6550: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
6560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6570: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6580: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
6590: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
65a0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
65b0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
65c0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
65d0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
65e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
65f0: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
6600: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6610: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6620: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
6630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6640: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
6650: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
6660: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
6670: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
6680: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
6690: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
66a0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
66b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
66c0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
66d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
66e0: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
66f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6700: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
6710: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
6720: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
6730: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6740: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6750: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6760: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a  ENERIC);...}..}.
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
6790: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
67a0: 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61  RINTF("SCardIsVa
67b0: 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  lidContext() cal
67c0: 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73  led");..scard_is
67d0: 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72  valid_ret = SCar
67e0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
67f0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
6800: 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64  dle);..if (scard
6810: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20  _isvalid_ret != 
6820: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6830: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6840: 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65  G_PRINTF("Handle
6850: 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61   has become inva
6860: 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69  lid (SCardIsVali
6870: 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c  dContext = %s/%l
6880: 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65  i), trying to re
6890: 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20  -establish...", 
68a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
68b0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
68c0: 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  R(scard_isvalid_
68d0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
68e0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b  rd_isvalid_ret);
68f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6900: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
6910: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
6920: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
6930: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6940: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
6950: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
6960: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
6970: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
6980: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6990: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
69a0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
69b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
69c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
69d0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
69e0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
69f0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
6a00: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
6a10: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6a20: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
6a30: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
6a40: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
6a50: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6a60: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
6a70: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6a80: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
6a90: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6aa0: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6ab0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
6ac0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
6ad0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
6ae0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
6af0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6b00: 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  C);...}....CACKE
6b10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6b20: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20  Handle has been 
6b30: 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29  re-established")
6b40: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ;..}.#endif...CA
6b50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6b60: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63  F("Sucessfully c
6b70: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53  onnected to PC/S
6b80: 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  C, returning in 
6b90: 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74  success");...ret
6ba0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6bb0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
6bc0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
6bd0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6be0: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
6bf0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
6c00: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
6c10: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
6c20: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
6c30: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
6c40: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
6c50: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
6c60: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
6c70: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
6c80: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6c90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73  his function dis
6ca0: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68  connects from th
6cb0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
6cc0: 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75  on manager and u
6cd0: 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68  pdates. *     th
6ce0: 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e  e global handle.
6cf0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
6d00: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
6d10: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
6d20: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73  (void) {..LONG s
6d30: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6d40: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
6d50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6d60: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
6d70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6d80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
6d90: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6da0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61  _S_OK);..}...sca
6db0: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
6dc0: 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73  et = SCardReleas
6dd0: 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79  eContext(*cackey
6de0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a  _pcsc_handle);..
6df0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6e00: 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65  _handle) {...fre
6e10: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
6e20: 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65  ndle);.....cacke
6e30: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6e40: 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  NULL;..}...if (s
6e50: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6e60: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6e70: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74  SUCCESS) {...ret
6e80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6e90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
6ea0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6eb0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6ec0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6ed0: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
6ee0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
6ef0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6f00: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
6f10: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6f20: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6f30: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6f40: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6f50: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6f60: 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
6f70: 6c 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62  lot has having b
6f80: 65 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61  een reset, to la
6f90: 74 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75  ter be cleaned u
6fa0: 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75  p.. *     Cleanu
6fb0: 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  p only happens w
6fc0: 68 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c  hen a PKCS#11 cl
6fd0: 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e  ient calls C_Fin
6fe0: 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a  dObjectsInit.. *
6ff0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
7000: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
7010: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
7020: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7030: 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d  ) {..if (slot ==
7040: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
7050: 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  n;..}...CACKEY_D
7060: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
7070: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
7080: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7090: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61  nnected) {...SCa
70a0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
70b0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
70c0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
70d0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74  ..}...slot->slot
70e0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f  _reset = 1;..slo
70f0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7100: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f  nected = 0;..slo
7110: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
7120: 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
7130: 52 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  RED;...CACKEY_DE
7140: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
7150: 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75  rning.");...retu
7160: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
7170: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e  POSIS. *     LON
7180: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  G cackey_reconne
7190: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
71a0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
71b0: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f  , DWORD default_
71c0: 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52  protocol, LPDWOR
71d0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
71e0: 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  col);. *. * ARGU
71f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
7200: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
7210: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
7220: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
7230: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f  to. *. *     DWO
7240: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7250: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50  col. *         P
7260: 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d  rotocol to attem
7270: 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 20  pt first. *. *  
7280: 20 20 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63     LPDWORD selec
7290: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20  ted_protocol. * 
72a0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 72          [OUT] Pr
72b0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 0a  otocol selected.
72c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
72d0: 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65  UE. *     The re
72e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
72f0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7300: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
7310: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
7320: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
7330: 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e  round SCardRecon
7340: 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20  nect(). *. *    
7350: 20 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e   The SCardReconn
7360: 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63  ect() function c
7370: 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  all will be call
7380: 65 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68  ed first with th
7390: 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65  e. *     dwPrefe
73a0: 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66  rredProtocols of
73b0: 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63   "default_protoc
73c0: 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61  ol".  If that ca
73d0: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20  ll returns. *   
73e0: 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f    SCARD_E_PROTO_
73f0: 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61  MISMATCH try aga
7400: 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63  in with a protoc
7410: 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66  ol of T=0, and f
7420: 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68  ailing. *     th
7430: 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73  at T=1.. *. */.s
7440: 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65  tatic LONG cacke
7450: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
7460: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7470: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44  lot *slot, DWORD
7480: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7490: 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63  l, LPDWORD selec
74a0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ted_protocol) {.
74b0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
74c0: 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f 63 6f  _ret;...scard_co
74d0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
74e0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
74f0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
7500: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66  HARE_SHARED, def
7510: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53  ault_protocol, S
7520: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
7530: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7540: 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64  ol);...if (scard
7550: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7560: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7570: 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TCH) {...CACKEY_
7580: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7590: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
75a0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
75b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
75c0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
75d0: 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63   T=0")...scard_c
75e0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
75f0: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
7600: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7610: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
7620: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c  ARD_PROTOCOL_T0,
7630: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7640: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
7650: 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63  ocol);....if (sc
7660: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7670: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7680: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43  SMATCH) {....CAC
7690: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
76a0: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
76b0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
76c0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
76d0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
76e0: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63  just T=1")....sc
76f0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7700: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7710: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7720: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7730: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7740: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T1, SCARD_RESE
7750: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64  T_CARD, selected
7760: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a  _protocol);...}.
7770: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72  .}...return(scar
7780: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a  d_conn_ret);.}..
7790: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
77a0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
77b0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
77c0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
77d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
77e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
77f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
7800: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
7810: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
7820: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
7830: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
7840: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7850: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
7860: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
7870: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
7880: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
7890: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
78a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
78b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
78c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
78d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
78e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
78f0: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
7900: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
7910: 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  t;..DWORD protoc
7920: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ol;..LONG scard_
7930: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
7940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7950: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7960: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
7970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7980: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
7990: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
79a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
79b0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
79c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
79d0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
79e0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
79f0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
7a00: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
7a10: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
7a20: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
7a30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a40: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
7a50: 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
7a60: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
7a70: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
7a80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7a90: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7aa0: 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20  ../* Connect to 
7ab0: 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65  reader, if neede
7ac0: 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d  d */..if (!slot-
7ad0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7ae0: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
7af0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
7b00: 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20  CardConnect(%s) 
7b10: 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70  called", slot->p
7b20: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73  csc_reader);...s
7b30: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7b40: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7b50: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7b60: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7b70: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7b80: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7b90: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
7ba0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
7bb0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7bc0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7bd0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7be0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7bf0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7c00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7c10: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7c20: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7c30: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7c40: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7c50: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a  with just T=0").
7c60: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7c70: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7c80: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7c90: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7ca0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7cb0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7cc0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7cd0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7ce0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7cf0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7d00: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7d10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7d20: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
7d30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7d40: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7d50: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7d60: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7d70: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
7d80: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
7d90: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7da0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7db0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7dc0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7dd0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7de0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7df0: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
7e00: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7e10: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
7e20: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7e30: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  == SCARD_W_UNPOW
7e40: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09  ERED_CARD) {....
7e50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7e60: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
7e70: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7e80: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
7e90: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  ARD, trying to r
7ea0: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a  e-connect...");.
7eb0: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7ec0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
7ed0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
7ee0: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
7ef0: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
7f00: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43  SHARE_DIRECT, SC
7f10: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
7f20: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
7f30: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
7f40: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
7f50: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
7f60: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7f70: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7f80: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
7f90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7fb0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7fc0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7fd0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7fe0: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64   T=0").....scard
7ff0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8000: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8010: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8020: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8030: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
8040: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
8050: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
8060: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
8070: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  col);......if (s
8080: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09  ISMATCH) {......
80b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
80c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
80d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
80e0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
80f0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
8100: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09   just T=1").....
8110: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
8120: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
8130: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
8140: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8150: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8160: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
8170: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
8180: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8190: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09  &protocol);.....
81a0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64  }....}.....scard
81b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  _conn_ret = cack
81c0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
81d0: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c  d(slot, protocol
81e0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
81f0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
8200: 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44  onn_ret != SCARD
8210: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
8220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8230: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
8240: 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c   to card failed,
8250: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
8260: 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e  ilure (SCardConn
8270: 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22  ect() = %s/%li)"
8280: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
8290: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
82a0: 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  STR(scard_conn_r
82b0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
82c0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09  d_conn_ret);....
82d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
82e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
82f0: 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73  ..}....slot->pcs
8300: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
8310: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72   = 1;...slot->tr
8320: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8330: 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 0;...slot->tra
8340: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8350: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f  _lock = 0;...slo
8360: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
8370: 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74  otocol;..}...ret
8380: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8390: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
83a0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
83b0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
83c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
83d0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
83e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
83f0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8400: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
8410: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
8420: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
8430: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
8440: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
8450: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8460: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
8470: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
8480: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8490: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
84a0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
84b0: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61  *     The transa
84c0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
84d0: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67  terminated using
84e0: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61   "cackey_end_tra
84f0: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f  nsaction". *. */
8500: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
8510: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
8520: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
8530: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8540: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
8550: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ret cackey_conn_
8560: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  ret;..LONG scard
8570: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
8580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8590: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
85a0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
85b0: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
85c0: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
85d0: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65   (cackey_conn_re
85e0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
85f0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
8600: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8610: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
8620: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
8630: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8640: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8650: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8660: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8670: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b  ansaction_depth+
8680: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  +;...if (slot->t
8690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
86a0: 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74   > 1 && !slot->t
86b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
86c0: 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43  hw_lock) {...CAC
86d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86e0: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74  ("Already in a t
86f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66  ransaction, perf
8700: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e  orming no action
8710: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69   (new depth = %i
8720: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
8730: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
8740: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8750: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
8760: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8770: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
8780: 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e   0;...scard_tran
8790: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67  s_ret = SCardBeg
87a0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  inTransaction(sl
87b0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a  ot->pcsc_card);.
87c0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
87d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
87e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
87f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8800: 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69  ("Unable to begi
8810: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
8820: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8830: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8840: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8850: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
8860: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8870: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67  "Sucessfully beg
8880: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  an transaction o
8890: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
88a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
88b0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
88c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
88d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
88e0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
88f0: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
8900: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
8910: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8920: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
8930: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8940: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8950: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8960: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8970: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8980: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8990: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
89a0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
89b0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
89c0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
89d0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
89e0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
89f0: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
8a00: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
8a10: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
8a20: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
8a30: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8a40: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8a50: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8a60: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8a70: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
8a80: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8a90: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8aa0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8ab0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
8ac0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8ad0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
8ae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8af0: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
8b00: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
8b10: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
8b20: 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69   on card");....i
8b30: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
8b40: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8b50: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8b60: 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61  G_PRINTF("Decrea
8b70: 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  sing transaction
8b80: 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e   depth and askin
8b90: 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65  g for a hardware
8ba0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78   lock on the nex
8bb0: 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  t begin transact
8bc0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
8bd0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
8be0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8bf0: 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74  th);.....slot->t
8c00: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8c10: 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74  --;.....if (slot
8c20: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8c30: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73  pth > 0) {.....s
8c40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8c50: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
8c60: 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  1;....}...}....r
8c70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8c80: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8c90: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8ca0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8cb0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
8cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
8cd0: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
8ce0: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
8cf0: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
8d00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8d10: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8d20: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8d30: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
8d40: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8d50: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
8d60: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
8d70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
8d80: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
8d90: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
8da0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
8db0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
8dc0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
8dd0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
8de0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
8df0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8e00: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8e10: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
8e20: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
8e30: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
8e40: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
8e50: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
8e60: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
8e70: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
8e80: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
8e90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8ea0: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
8eb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
8ec0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8ed0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8ee0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8ef0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
8f00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
8f10: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
8f20: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
8f30: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8f40: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8f50: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8f60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8f70: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
8f80: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
8f90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
8fa0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
8fb0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
8fc0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8fd0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
8fe0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
8ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9000: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9010: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9020: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
9030: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
9040: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9050: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
9060: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
9070: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
9080: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9090: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
90a0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
90b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
90c0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
90d0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
90e0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
90f0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
9100: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9110: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
9120: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
9130: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
9140: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
9150: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
9160: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
9170: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
9180: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9190: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
91a0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
91b0: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
91c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
91d0: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
91e0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
91f0: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
9200: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9210: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
9220: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
9230: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
9240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9250: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
9260: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
9270: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
9280: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9290: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
92a0: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
92b0: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
92c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
92d0: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
92e0: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
92f0: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
9300: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9310: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
9320: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
9330: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
9340: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
9350: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
9360: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
9370: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
9380: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
9390: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
93a0: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
93b0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
93c0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
93d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
93e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
93f0: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
9400: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
9410: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9420: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
9430: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
9440: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
9450: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
9460: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
9470: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
9480: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
9490: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
94a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
94b0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
94c0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
94d0: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
94e0: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
94f0: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9500: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9510: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
9520: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
9530: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9540: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
9550: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
9560: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
9570: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
9580: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
9590: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
95a0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
95b0: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
95c0: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
95d0: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
95e0: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
95f0: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
9600: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
9610: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
9620: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
9630: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9640: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
9650: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9660: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
9670: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
9680: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
9690: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
96a0: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
96b0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
96c0: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
96d0: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
96e0: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
96f0: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
9700: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
9710: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
9720: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
9730: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
9740: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
9750: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
9760: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9770: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
9780: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
9790: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
97a0: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
97b0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
97c0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
97d0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
97e0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
97f0: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20  OK           On 
9800: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9820: 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72  ERIC      On err
9830: 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  or. *     CACKEY
9840: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
9850: 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64  ENT  If the send
9860: 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75  ing failed becau
9870: 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a  se the token is.
9880: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e    absent. *. * N
98b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
98c0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63   function will c
98d0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43  onnect to the PC
98e0: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
98f0: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20  anager via. *   
9900: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f    cackey_pcsc_co
9910: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65  nnect() if neede
9920: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20  d.. *. *     It 
9930: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
9940: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20  the card in the 
9950: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20  reader attached 
9960: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20  to the slot. *  
9970: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49     specified.  I
9980: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74  t will reconnect
9990: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20   to the card if 
99a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
99b0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e  *     goes away.
99c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
99d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
99e0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
99f0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
9a00: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
9a10: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
9a20: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
9a30: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
9a40: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
9a50: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
9a60: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e  d int lc, unsign
9a70: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
9a80: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20  nsigned int le, 
9a90: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9aa0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
9ab0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
9ac0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
9ad0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
9ae0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
9af0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
9b00: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
9b10: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53  pdata_len;..LPCS
9b20: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20  CARD_IO_REQUEST 
9b30: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f  pioSendPci;..DWO
9b40: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57  RD protocol;..DW
9b50: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65  ORD xmit_len, re
9b60: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  cv_len;..LONG sc
9b70: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63  ard_xmit_ret, sc
9b80: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
9b90: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31  .BYTE xmit_buf[1
9ba0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31  024], recv_buf[1
9bb0: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f  024];..int pcsc_
9bc0: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73  connect_ret, pcs
9bd0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09  c_getresp_ret;..
9be0: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
9bf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9c00: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
9c10: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
9c20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9c30: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
9c40: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72  ecified.");....r
9c50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9c60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9c70: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
9c80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
9c90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
9ca0: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
9cb0: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
9cc0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
9cd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9ce0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
9cf0: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
9d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
9d10: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
9d20: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9d30: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
9d40: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63  * Determine whic
9d50: 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65  h protocol to se
9d60: 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69  nd using */..swi
9d70: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
9d80: 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43  col) {...case SC
9d90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
9da0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9db0: 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f  _PRINTF("Protoco
9dc0: 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72  l to send datagr
9dd0: 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09  am is T=0");....
9de0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9df0: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
9e00: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43  break;...case SC
9e10: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a  ARD_PROTOCOL_T1:
9e20: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9e30: 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f  _PRINTF("Protoco
9e40: 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72  l to send datagr
9e50: 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09  am is T=1");....
9e60: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9e70: 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09  ARD_PCI_T1;.....
9e80: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
9e90: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
9ea0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
9eb0: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
9ec0: 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a  , aborting.");..
9ed0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9ee0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9ef0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d  ;..}.../* Transm
9f00: 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20  it */..xmit_len 
9f10: 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  = 0;..xmit_buf[x
9f20: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61  mit_len++] = cla
9f30: 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ss;..xmit_buf[xm
9f40: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74  it_len++] = inst
9f50: 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62  ruction;..xmit_b
9f60: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9f70: 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78   p1;..xmit_buf[x
9f80: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b  mit_len++] = p2;
9f90: 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09  ..if (data) {...
9fa0: 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a  if (lc > 255) {.
9fb0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9fc0: 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21  PRINTF("CAUTION!
9fd0: 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72    Using an Lc gr
9fe0: 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69  eater than 255 i
9ff0: 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20  s untested.  Lc 
a000: 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09  = %u", lc);.....
a010: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a020: 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20  n++] = 0x82; /* 
a030: 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a  XXX UNTESTED */.
a040: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a050: 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20  _len++] = (lc & 
a060: 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
a070: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a080: 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66  en++] = lc & 0xf
a090: 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  f;...} else {...
a0a0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a0b0: 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a  en++] = lc;...}.
a0c0: 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
a0d0: 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29  idx < lc; idx++)
a0e0: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a0f0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74  mit_len++] = dat
a100: 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a  a[idx];...}..}..
a110: 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29  .if (le != 0x00)
a120: 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35   {...if (le > 25
a130: 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  6) {....CACKEY_D
a140: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55  EBUG_PRINTF("CAU
a150: 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20  TION!  Using an 
a160: 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  Le greater than 
a170: 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e  256 is untested.
a180: 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b    Le = %u", le);
a190: 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  .....xmit_buf[xm
a1a0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32  it_len++] = 0x82
a1b0: 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45  ; /* XXX UNTESTE
a1c0: 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66  D */....xmit_buf
a1d0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28  [xmit_len++] = (
a1e0: 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20  le & 0xff00) >> 
a1f0: 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  8;....xmit_buf[x
a200: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20  mit_len++] = le 
a210: 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65  & 0xff;...} else
a220: 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20   if (le == 256) 
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 30 78 30 30  it_len++] = 0x00
a250: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
a260: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a270: 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09  n++] = le;...}..
a280: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  }.../* Begin Sma
a290: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
a2a0: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
a2b0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
a2c0: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61  slot);...if (cla
a2d0: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53  ss == GSCIS_CLAS
a2e0: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73  S_ISO7816 && ins
a2f0: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49  truction == GSCI
a300: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26  S_INSTR_VERIFY &
a310: 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a  & p1 == 0x00) {.
a320: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a330: 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41  RINTF("Sending A
a340: 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e  PDU: <<censored>
a350: 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  >");..} else {..
a360: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a370: 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20  INTBUF("Sending 
a380: 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66  APDU:", xmit_buf
a390: 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a  , xmit_len);..}.
a3a0: 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a  ..recv_len = siz
a3b0: 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09  eof(recv_buf);..
a3c0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
a3d0: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73   SCardTransmit(s
a3e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
a3f0: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74  pioSendPci, xmit
a400: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
a410: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20  NULL, recv_buf, 
a420: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66  &recv_len);...if
a430: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
a440: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f   == SCARD_E_NOT_
a450: 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09  TRANSACTED) {...
a460: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a470: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
a480: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
a490: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
a4a0: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c  ) = %s/%lx), wil
a4b0: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75  l ask calling fu
a4c0: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20  nction to retry 
a4d0: 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63  (not resetting c
a4e0: 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  ard)...", CACKEY
a4f0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
a500: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
a510: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
a520: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
a530: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
a540: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63  ./* Begin Smartc
a550: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
a560: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
a570: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
a580: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a590: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
a5a0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  );..}...if (scar
a5b0: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
a5c0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
a5d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a5e0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
a5f0: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
a600: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
a610: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c  it() = %s/%lx)",
a620: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
a630: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
a640: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
a650: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
a660: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
a670: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
a680: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72  EBUG_PRINTF("Mar
a690: 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76  king slot as hav
a6a0: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29  ing been reset")
a6b0: 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ;...cackey_mark_
a6c0: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
a6d0: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78  ;....if (scard_x
a6e0: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  mit_ret == SCARD
a6f0: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
a700: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a710: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
a720: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
a730: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
a740: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
a750: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
a760: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
a770: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
a780: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
a790: 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
a7a0: 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72  .....if (scard_r
a7b0: 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  econn_ret == SCA
a7c0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
a7d0: 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72  ..../* Update pr
a7e0: 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c  otocol */.....sl
a7f0: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70  ot->protocol = p
a800: 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69  rotocol;.....swi
a810: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
a820: 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61 73 65  col) {......case
a830: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
a840: 54 30 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e  T0:.......pioSen
a850: 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49  dPci = SCARD_PCI
a860: 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  _T0;........brea
a870: 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41  k;......case SCA
a880: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a  RD_PROTOCOL_T1:.
a890: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69  ......pioSendPci
a8a0: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b   = SCARD_PCI_T1;
a8b0: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
a8c0: 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
a8d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a8e0: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
a8f0: 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20  protocol found, 
a900: 62 75 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20  but too late to 
a910: 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75  do anything abou
a920: 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69  t it now -- tryi
a930: 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09  ng anyway.");...
a940: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
a950: 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74  }....../* Re-est
a960: 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69  ablish transacti
a970: 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72  on, if it was pr
a980: 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20  esent */.....if 
a990: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
a9a0: 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
a9b0: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
a9c0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
a9d0: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
a9e0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
a9f0: 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  ock = 1;......ca
aa00: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
aa10: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
aa20: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
aa30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
aa40: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
aa50: 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29  retransmitting")
aa60: 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20  ;......recv_len 
aa70: 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75  = sizeof(recv_bu
aa80: 66 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d  f);.....scard_xm
aa90: 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72  it_ret = SCardTr
aaa0: 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73  ansmit(slot->pcs
aab0: 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50  c_card, pioSendP
aac0: 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  ci, xmit_buf, xm
aad0: 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65  it_len, NULL, re
aae0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
aaf0: 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61  n);......if (sca
ab00: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
ab10: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
ab20: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
ab30: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72  BUG_PRINTF("Retr
ab40: 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72  ansmit failed, r
ab50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ab60: 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e  ure after discon
ab70: 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64  necting the card
ab80: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20   (SCardTransmit 
ab90: 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b  = %s/%li)", CACK
aba0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
abb0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
abc0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
abd0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
abe0: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61  _ret);.......SCa
abf0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
ac00: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
ac10: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
ac20: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ......slot->pcsc
ac30: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
ac40: 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e  = 0;......./* En
ac50: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
ac60: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09  saction */......
ac70: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
ac80: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
ac90: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
aca0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
acb0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
acc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
acd0: 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09  ABSENT);.....}..
ace0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
acf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ad00: 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e  TF("Disconnectin
ad10: 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53  g card");......S
ad20: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
ad30: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
ad40: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
ad50: 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  );.....slot->pcs
ad60: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
ad70: 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e   = 0;....../* En
ad80: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
ad90: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73  saction */.....s
ada0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
adb0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09  _depth = 1;.....
adc0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
add0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
ade0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
adf0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
ae00: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ae10: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
ae20: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
ae30: 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  SENT);....}...} 
ae40: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
ae50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
ae60: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72  isconnecting car
ae70: 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  d");.....SCardDi
ae80: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
ae90: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
aea0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
aeb0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
aec0: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
aed0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
aee0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
aef0: 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  */....slot->tran
af00: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
af10: 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  1;....cackey_end
af20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
af30: 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  t);.....CACKEY_D
af40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
af50: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
af60: 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43  e");....return(C
af70: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
af80: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
af90: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
afa0: 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74 75 72  _PRINTBUF("Retur
afb0: 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63  ned Value:", rec
afc0: 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29  v_buf, recv_len)
afd0: 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  ;...if (recv_len
afe0: 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e   < 2) {.../* Min
aff0: 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65  imal response le
b000: 6e 67 74 68 20 69 73 20 32 20 62 79 74 65 73 2c  ngth is 2 bytes,
b010: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b020: 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45  ilure */...CACKE
b030: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b040: 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61  Response too sma
b050: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ll, returning in
b060: 20 66 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c   failure (recv_l
b070: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  en = %lu)", (uns
b080: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76  igned long) recv
b090: 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64  _len);..../* End
b0a0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b0b0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
b0c0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b0d0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74  on(slot);....ret
b0e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b0f0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
b100: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65  ./* Determine re
b110: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61  sult code */..ma
b120: 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  jor_rc = recv_bu
b130: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b  f[recv_len - 2];
b140: 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63  ..minor_rc = rec
b150: 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d  v_buf[recv_len -
b160: 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f   1];..if (respco
b170: 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64  de) {...*respcod
b180: 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c  e = (major_rc <<
b190: 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a   8) | minor_rc;.
b1a0: 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d  .}.../* Adjust m
b1b0: 65 73 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f  essage buffer */
b1c0: 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b  ..recv_len -= 2;
b1d0: 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20  .../* Add bytes 
b1e0: 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  to return value 
b1f0: 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61  */..tmp_respdata
b200: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72  _len = 0;..if (r
b210: 65 73 70 64 61 74 61 20 26 26 20 72 65 73 70 64  espdata && respd
b220: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70  ata_len) {...tmp
b230: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
b240: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a  *respdata_len;..
b250: 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
b260: 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  = *respdata_len;
b270: 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  ....if (recv_len
b280: 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
b290: 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
b2a0: 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b  copy = recv_len;
b2b0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
b2c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70  EBUG_PRINTF("Cop
b2d0: 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74  ying %lu bytes t
b2e0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 28 72 65  o the buffer (re
b2f0: 63 76 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20  cv'd %lu bytes, 
b300: 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74  but only %lu byt
b310: 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62  es left in our b
b320: 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e  uffer)", (unsign
b330: 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74  ed long) bytes_t
b340: 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65  o_copy, (unsigne
b350: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
b360: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b370: 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  ) *respdata_len)
b380: 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70  ;....memcpy(resp
b390: 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20  data, recv_buf, 
b3a0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
b3b0: 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79  ..respdata += by
b3c0: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09  tes_to_copy;....
b3d0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  *respdata_len = 
b3e0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09  bytes_to_copy;..
b3f0: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
b400: 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  n -= bytes_to_co
b410: 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  py;..} else {...
b420: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20  if (recv_len != 
b430: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
b440: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72  EBUG_PRINTF("Thr
b450: 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62  owing away %lu b
b460: 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f  ytes, nowhere to
b470: 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e   put them!", (un
b480: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63  signed long) rec
b490: 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  v_len);...}..}..
b4a0: 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d  .if (major_rc ==
b4b0: 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65   0x61) {.../* We
b4c0: 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f   need to READ */
b4d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b4e0: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
b4f0: 65 61 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a  ead required");.
b500: 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20  ...if (minor_rc 
b510: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69  == 0x00) {....mi
b520: 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f  nor_rc = CACKEY_
b530: 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09  APDU_MTU;...}...
b540: 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  .pcsc_getresp_re
b550: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
b560: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
b570: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
b580: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
b590: 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20  RESPONSE, 0x00, 
b5a0: 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d  0x00, 0, NULL, m
b5b0: 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64  inor_rc, respcod
b5c0: 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d  e, respdata, &tm
b5d0: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b  p_respdata_len);
b5e0: 0a 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ....if (pcsc_get
b5f0: 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b  resp_ret != CACK
b600: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
b610: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b620: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
b630: 65 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74  ead failed!  Ret
b640: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b650: 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  e");...../* End 
b660: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
b670: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
b680: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b690: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66  on(slot);.....if
b6a0: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
b6b0: 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
b6c0: 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09  C_E_RETRY) {....
b6d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b6e0: 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09  CSC_E_RETRY);...
b6f0: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
b700: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
b710: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RIC);...}....if 
b720: 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b  (respdata_len) {
b730: 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65  ....*respdata_le
b740: 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74  n += tmp_respdat
b750: 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  a_len;...}..../*
b760: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
b770: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
b780: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
b790: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
b7a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b7b0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
b7c0: 69 6e 20 73 75 63 63 65 73 73 20 28 62 75 66 66  in success (buff
b7d0: 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65  er read complete
b7e0: 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41  )");...return(CA
b7f0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
b800: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61  ..}.../* End Sma
b810: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b820: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
b830: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
b840: 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  ot);...if (major
b850: 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09  _rc == 0x90) {..
b860: 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09  ./* Success */..
b870: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b880: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
b890: 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f  in success (majo
b8a0: 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a  r_rc = 0x90)");.
b8b0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b8c0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
b8d0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b8e0: 50 52 49 4e 54 46 28 22 41 50 44 55 20 52 65 74  PRINTF("APDU Ret
b8f0: 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20  urned an error, 
b900: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b910: 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  lure");...return
b920: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
b930: 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20  ENERIC);.}../*. 
b940: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
b950: 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79    ssize_t cackey
b960: 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75 63 74  _get_data(struct
b970: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
b980: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
b990: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
b9a0: 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65  t count, unsigne
b9b0: 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a  d char oid[3]);.
b9c0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
b9d0: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
b9e0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
b9f0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
ba00: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
ba10: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
ba20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
ba30: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
ba40: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
ba50: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75  *     size_t cou
ba60: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  nt. *         Nu
ba70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
ba80: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
ba90: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
baa0: 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a  ned char oid[3].
bab0: 20 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74   *         3-byt
bac0: 65 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a  e OID to read. *
bad0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
bae0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
baf0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
bb00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
bb10: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
bb20: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
bb30: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
bb40: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
bb50: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
bb60: 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  t cackey_get_dat
bb70: 61 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  a(struct cackey_
bb80: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
bb90: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
bba0: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
bbb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f   unsigned char o
bbc0: 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67 6e  id[3]) {..unsign
bbd0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f  ed char *buffer_
bbe0: 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  p;..size_t init_
bbf0: 63 6f 75 6e 74 3b 0a 0a 09 73 69 7a 65 5f 74 20  count;...size_t 
bc00: 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f  offset = 0, max_
bc10: 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e  offset, max_coun
bc20: 74 2c 20 73 69 7a 65 3b 0a 09 75 6e 73 69 67 6e  t, size;..unsign
bc30: 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d 20  ed char cmd[] = 
bc40: 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78 30  {0x5C, 0x03, 0x0
bc50: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
bc60: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
bc70: 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  de;..int send_re
bc80: 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43  t;..int idx;...C
bc90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bca0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
bcb0: 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f  .init_count = co
bcc0: 75 6e 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65  unt;...max_offse
bcd0: 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f  t = count;..max_
bce0: 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41  count = CACKEY_A
bcf0: 50 44 55 5f 4d 54 55 3b 0a 0a 09 63 6d 64 5b 32  PDU_MTU;...cmd[2
bd00: 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64  ] = oid[0];..cmd
bd10: 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63  [3] = oid[1];..c
bd20: 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a  md[4] = oid[2];.
bd30: 0a 09 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69  ../* 256 to indi
bd40: 63 61 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  cate the largest
bd50: 20 6d 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d   message size --
bd60: 20 6e 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68   not clear if th
bd70: 69 73 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74  is will work wit
bd80: 68 20 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a  h all messages *
bd90: 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
bda0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
bdb0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
bdc0: 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50  _ISO7816, NISTSP
bdd0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
bde0: 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30  ET_DATA, 0x3F, 0
bdf0: 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  xFF, sizeof(cmd)
be00: 2c 20 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73  , cmd, 256, &res
be10: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26  pcode, buffer, &
be20: 63 6f 75 6e 74 29 3b 0a 0a 09 69 66 20 28 73 65  count);...if (se
be30: 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  nd_ret == CACKEY
be40: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b  _PCSC_E_RETRY) {
be50: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
be60: 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e  PRINTF("ADPU Sen
be70: 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74  ding failed, ret
be80: 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65  rying read buffe
be90: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63  r");....return(c
bea0: 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73  ackey_get_data(s
beb0: 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 69 6e 69  lot, buffer, ini
bec0: 74 5f 63 6f 75 6e 74 2c 20 6f 69 64 29 29 3b 0a  t_count, oid));.
bed0: 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  .}...if (send_re
bee0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
bef0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 72  _S_OK) {...if (r
bf00: 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38  espcode == 0x6A8
bf10: 36 29 20 7b 0a 2f 2a 20 58 58 58 20 54 4f 44 4f  6) {./* XXX TODO
bf20: 20 50 49 56 20 2a 2f 0a 09 09 7d 0a 0a 09 09 43   PIV */...}....C
bf30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bf40: 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f  TF("cackey_send_
bf50: 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72  apdu() failed, r
bf60: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
bf70: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
bf80: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6f 66 66 73 65  (-1);..}...offse
bf90: 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 23 69 66  t += count;..#if
bfa0: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
bfb0: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
bfc0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
bfd0: 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53  f (offset > _POS
bfe0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
bff0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c000: 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78  RINTF("Offset ex
c010: 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
c020: 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
c030: 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
c040: 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20  = %li, offset = 
c050: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
c060: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
c070: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c080: 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75  offset);....retu
c090: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
c0a0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  dif.#endif...if 
c0b0: 28 6f 66 66 73 65 74 20 3c 20 32 29 20 7b 0a 09  (offset < 2) {..
c0c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c0d0: 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 20 44  INTF("APDU GET D
c0e0: 41 54 41 20 72 65 74 75 72 6e 65 64 20 25 6c 75  ATA returned %lu
c0f0: 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 69 73   bytes, which is
c100: 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20 61   too short for a
c110: 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73   BER-TLV respons
c120: 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  e", (unsigned lo
c130: 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09  ng) offset);....
c140: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
c150: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66  .buffer_p = buff
c160: 65 72 3b 0a 09 69 66 20 28 2a 62 75 66 66 65 72  er;..if (*buffer
c170: 5f 70 20 21 3d 20 30 78 35 33 29 20 7b 0a 09 09  _p != 0x53) {...
c180: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c190: 4e 54 46 28 22 41 50 44 55 20 47 45 54 20 44 41  NTF("APDU GET DA
c1a0: 54 41 20 64 69 64 20 6e 6f 74 20 72 65 74 75 72  TA did not retur
c1b0: 6e 20 61 20 42 45 52 2d 54 4c 56 20 77 69 74 68  n a BER-TLV with
c1c0: 20 74 61 67 20 35 33 2e 20 20 54 61 67 20 3d 20   tag 53.  Tag = 
c1d0: 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
c1e0: 20 69 6e 74 29 20 2a 62 75 66 66 65 72 5f 70 29   int) *buffer_p)
c1f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
c200: 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b  ..}..buffer_p++;
c210: 0a 0a 09 69 66 20 28 28 2a 62 75 66 66 65 72 5f  ...if ((*buffer_
c220: 70 20 26 20 30 78 38 30 29 20 3d 3d 20 30 78 38  p & 0x80) == 0x8
c230: 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b  0) {...size = 0;
c240: 0a 09 09 69 64 78 20 3d 20 28 2a 62 75 66 66 65  ...idx = (*buffe
c250: 72 5f 70 20 26 20 30 78 37 66 29 3b 0a 0a 09 09  r_p & 0x7f);....
c260: 69 66 20 28 28 28 62 75 66 66 65 72 5f 70 20 2d  if (((buffer_p -
c270: 20 62 75 66 66 65 72 29 20 2b 20 69 64 78 29 20   buffer) + idx) 
c280: 3e 3d 20 6f 66 66 73 65 74 29 20 7b 0a 09 09 09  >= offset) {....
c290: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c2a0: 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42  NTF("Malformed B
c2b0: 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20  ER value -- not 
c2c0: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61  enough bytes ava
c2d0: 69 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c  ilable to read l
c2e0: 65 6e 67 74 68 22 29 3b 0a 0a 09 09 09 72 65 74  ength");.....ret
c2f0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
c300: 66 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20  for (; idx > 0; 
c310: 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66  idx--) {....buff
c320: 65 72 5f 70 2b 2b 3b 0a 09 09 09 73 69 7a 65 20  er_p++;....size 
c330: 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c  <<= 8;....size |
c340: 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 09 7d  = *buffer_p;...}
c350: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a  ..} else {...siz
c360: 65 20 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09  e = *buffer_p;..
c370: 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 0a  }..buffer_p++;..
c380: 09 69 66 20 28 28 28 62 75 66 66 65 72 5f 70 20  .if (((buffer_p 
c390: 2d 20 62 75 66 66 65 72 29 20 2b 20 73 69 7a 65  - buffer) + size
c3a0: 29 20 21 3d 20 6f 66 66 73 65 74 29 20 7b 0a 09  ) != offset) {..
c3b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c3c0: 49 4e 54 46 28 22 45 6e 74 69 72 65 20 62 75 66  INTF("Entire buf
c3d0: 66 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73 75  fer is not consu
c3e0: 6d 65 64 21 22 29 3b 0a 0a 09 09 69 66 20 28 28  med!");....if ((
c3f0: 28 62 75 66 66 65 72 5f 70 20 2d 20 62 75 66 66  (buffer_p - buff
c400: 65 72 29 20 2b 20 73 69 7a 65 29 20 3e 20 6f 66  er) + size) > of
c410: 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  fset) {....CACKE
c420: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c430: 45 6e 63 6f 64 65 64 20 73 69 7a 65 20 69 73 20  Encoded size is 
c440: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
c450: 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20   amount of data 
c460: 72 65 61 64 2c 20 64 72 6f 70 70 69 6e 67 22 29  read, dropping")
c470: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
c480: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 65 6d 6d 6f  ;...}..}...memmo
c490: 76 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65  ve(buffer, buffe
c4a0: 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41  r_p, size);...CA
c4b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c4c0: 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72 65  BUF("GET DATA re
c4d0: 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20 73  sult", buffer, s
c4e0: 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ize);...CACKEY_D
c4f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
c500: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
c510: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
c520: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
c530: 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74  ng) size);...ret
c540: 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  urn(size);.}../*
c550: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
c560: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
c570: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
c580: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
c590: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
c5a0: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
c5b0: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
c5c0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
c5d0: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
c5e0: 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20  al_offset);. *. 
c5f0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
c600: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
c610: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
c620: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
c630: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
c640: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
c650: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a  ed char *buffer.
c660: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
c670: 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20   Buffer. *. *   
c680: 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20    size_t count. 
c690: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
c6a0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
c6b0: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
c6c0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
c6d0: 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20  char t_or_v. *  
c6e0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68         Select th
c6f0: 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20  e T-buffer (01) 
c700: 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29  or V-buffer (02)
c710: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20   to read from.  
c720: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
c730: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
c740: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63  . *         Spec
c750: 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74  ify the offset t
c760: 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64  o begin the read
c770: 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52   from. *. *. * R
c780: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
c790: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
c7a0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
c7b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
c7c0: 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d  ually read, or -
c7d0: 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  1 on error.. *. 
c7e0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
c7f0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
c800: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
c810: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72  _read_buffer(str
c820: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c830: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
c840: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
c850: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69  ze_t count, unsi
c860: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
c870: 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c  , size_t initial
c880: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73 69  _offset) {..unsi
c890: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74 5f  gned char *init_
c8a0: 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20  buffer;..size_t 
c8b0: 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a  init_count;..siz
c8c0: 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c  e_t init_initial
c8d0: 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f  _offset;...size_
c8e0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
c8f0: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
c900: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  unt;..unsigned c
c910: 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e  har cmd[2];..uin
c920: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
c930: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
c940: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c950: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
c960: 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20 3d  ...init_buffer =
c970: 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63   buffer;..init_c
c980: 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69  ount = count;..i
c990: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
c9a0: 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66  et = initial_off
c9b0: 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65  set;...max_offse
c9c0: 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f  t = count;..max_
c9d0: 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41  count = CACKEY_A
c9e0: 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74  PDU_MTU;...if (t
c9f0: 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f  _or_v != 1 && t_
ca00: 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43  or_v != 2) {...C
ca10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ca20: 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72  TF("Invalid T or
ca30: 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65   V parameter spe
ca40: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
ca50: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ca60: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
ca70: 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f  }...cmd[0] = t_o
ca80: 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  r_v;...while (1)
ca90: 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20   {...if (offset 
caa0: 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b  >= max_offset) {
cab0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
cac0: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
cad0: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
cae0: 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74  ning what we got
caf0: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b  ...");.....break
cb00: 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d  ;...}....count =
cb10: 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66   max_offset - of
cb20: 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e  fset;...if (coun
cb30: 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t > max_count) {
cb40: 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
cb50: 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d  count;...}....cm
cb60: 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09  d[1] = count;...
cb70: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
cb80: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
cb90: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
cba0: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
cbb0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44  GSCIS_INSTR_READ
cbc0: 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69  _BUFFER, ((initi
cbd0: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
cbe0: 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  et) >> 8) & 0xff
cbf0: 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  , (initial_offse
cc00: 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78  t + offset) & 0x
cc10: 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c  ff, sizeof(cmd),
cc20: 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73   cmd, 0x00, &res
cc30: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20  pcode, buffer + 
cc40: 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b  offset, &count);
cc50: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
cc60: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
cc70: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43 41  E_RETRY) {....CA
cc80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cc90: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
cca0: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
ccb0: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
ccc0: 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
ccd0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
cce0: 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 2c  ot, init_buffer,
ccf0: 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f   init_count, t_o
cd00: 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61  r_v, init_initia
cd10: 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a  l_offset));...}.
cd20: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
cd30: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
cd40: 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65  _OK) {....if (re
cd50: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36  spcode == 0x6A86
cd60: 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f  ) {.....if (max_
cd70: 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  count == 1) {...
cd80: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
cd90: 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  .....max_count =
cda0: 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a   max_count / 2;.
cdb0: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
cdc0: 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
cdd0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
cde0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20  key_send_apdu() 
cdf0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
ce00: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ce10: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
ce20: 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d  ..}....offset +=
ce30: 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63   count;....if (c
ce40: 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74  ount < max_count
ce50: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
ce60: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72  BUG_PRINTF("Shor
ce70: 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20  t read -- count 
ce80: 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25  = %i, cmd[1] = %
ce90: 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c  i", (int) count,
cea0: 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a   (int) cmd[1]);.
ceb0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
cec0: 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
ced0: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
cee0: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
cef0: 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20  MAX..if (offset 
cf00: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
cf10: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
cf20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
cf30: 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  set exceeds maxi
cf40: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
cf50: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
cf60: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66   (max = %li, off
cf70: 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  set = %lu)", (lo
cf80: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
cf90: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
cfa0: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
cfb0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
cfc0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
cfd0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cfe0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
cff0: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
d000: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
d010: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d020: 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  ffset);...return
d030: 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (offset);.}../*.
d040: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d050: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
d060: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
d070: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
d080: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
d090: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
d0a0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
d0b0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
d0c0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
d0d0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d0e0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
d0f0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
d100: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
d110: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
d120: 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75  id. *         Bu
d130: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d140: 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c  Applet ID to sel
d150: 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ect. *. *     si
d160: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20  ze_t aid_len. * 
d170: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
d180: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22  f bytes in the "
d190: 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29  aid" (Applet ID)
d1a0: 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a   parameter. *. *
d1b0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
d1c0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
d1d0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
d1e0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
d1f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
d200: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
d210: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
d220: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
d230: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
d240: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
d250: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
d260: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
d270: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d280: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
d290: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
d2a0: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
d2b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
d2c0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
d2d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
d2e0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
d2f0: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
d300: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
d310: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
d320: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
d330: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
d340: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
d350: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
d360: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
d370: 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  0, aid_len, aid,
d380: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
d390: 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  L, NULL);...if (
d3a0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
d3b0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
d3c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d3d0: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
d3e0: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
d3f0: 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20 61  etrying select a
d400: 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74 75  pplet");....retu
d410: 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  rn(cackey_select
d420: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69  _applet(slot, ai
d430: 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d  d, aid_len));..}
d440: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d450: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
d460: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
d470: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
d480: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70  iled to open app
d490: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
d4a0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
d4b0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
d4c0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
d4d0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
d4e0: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
d4f0: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
d500: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
d510: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
d520: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
d530: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
d540: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
d550: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
d560: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d570: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
d580: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
d590: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
d5a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d5b0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
d5c0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
d5d0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
d5e0: 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20 20  uint16_t ef. *  
d5f0: 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c         Elemental
d600: 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a   File to select.
d610: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
d620: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
d630: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
d640: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
d650: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
d660: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
d670: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
d680: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 73  ES. *     This s
d690: 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e  elects an Elemen
d6a0: 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20 75  tary File (EF) u
d6b0: 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  nder the current
d6c0: 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20 20  ly selected. *  
d6d0: 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69 6c     Dedicated Fil
d6e0: 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20  e (DF). *. *    
d6f0: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73 20   Typically this 
d700: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
d710: 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63 6f  selecting the co
d720: 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75 73  rrect Applet (us
d730: 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  ing. *     cacke
d740: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 29  y_select_applet)
d750: 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20 2a   for VM cards. *
d760: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
d770: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
d780: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
d790: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d7a0: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
d7b0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
d7c0: 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69  r fid_buf[2];..i
d7d0: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
d7e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d7f0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
d800: 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c 65  ./* Open the ele
d810: 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mentary file */.
d820: 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65  .fid_buf[0] = (e
d830: 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  f >> 8) & 0xff;.
d840: 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66  .fid_buf[1] = ef
d850: 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
d860: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d870: 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a 20  Selecting file: 
d880: 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65  %04lx", (unsigne
d890: 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73  d long) ef);...s
d8a0: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
d8b0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
d8c0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
d8d0: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
d8e0: 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c 20  R_SELECT, 0x02, 
d8f0: 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 64  0x0C, sizeof(fid
d900: 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c 20  _buf), fid_buf, 
d910: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
d920: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
d930: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
d940: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
d950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d960: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
d970: 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  pen file, return
d980: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
d990: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
d9a0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
d9b0: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
d9c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
d9d0: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
d9e0: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
d9f0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
da00: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
da10: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
da20: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
da30: 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  e_tlv(struct cac
da40: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
da50: 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  root);. *. * ARG
da60: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
da70: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
da80: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20  entity *root. * 
da90: 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66 20          Root of 
daa0: 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f 20  the TLV list to 
dab0: 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20 2a  start freeing. *
dac0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
dad0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
dae0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
daf0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72  This function fr
db00: 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b  ees the TLV link
db10: 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72 6e  ed listed return
db20: 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22  ed from. *     "
db30: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22  cackey_read_tlv"
db40: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
db50: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
db60: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
db70: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
db80: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
db90: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
dba0: 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09  *curr, *next;...
dbb0: 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c  if (root == NULL
dbc0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
dbd0: 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20 72  ...for (curr = r
dbe0: 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72 20  oot; curr; curr 
dbf0: 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78 74  = next) {...next
dc00: 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a   = curr->_next;.
dc10: 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 2d  ...switch (curr-
dc20: 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  >tag) {....case 
dc30: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
dc40: 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53 43  BLE:....case GSC
dc50: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
dc60: 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  TE:.....if (curr
dc70: 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  ->value) {......
dc80: 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65  free(curr->value
dc90: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
dca0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
dcb0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
dcc0: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
dcd0: 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09 09  ue_cardurl) {...
dce0: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
dcf0: 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09  lue_cardurl);...
dd00: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
dd10: 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72 29  .}....free(curr)
dd20: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
dd30: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
dd40: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
dd50: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
dd60: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
dd70: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
dd80: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
dd90: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
dda0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
ddb0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
ddc0: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
ddd0: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
dde0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
ddf0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
de00: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  lv_entity *curr_
de10: 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20  entity, *root = 
de20: 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55  NULL, *last = NU
de30: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  LL;..unsigned ch
de40: 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar tlen_buf[2], 
de50: 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20  tval_buf[1024], 
de60: 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *tval;..unsigned
de70: 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32   char vlen_buf[2
de80: 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 32  ], vval_buf[8192
de90: 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *vval;..unsig
dea0: 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
deb0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
dec0: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 73 73 69   tmpbuflen;..ssi
ded0: 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b  ze_t tlen, vlen;
dee0: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
def0: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  et;..size_t offs
df00: 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74  et_t = 0, offset
df10: 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  _v = 0;..unsigne
df20: 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a  d char tag;..siz
df30: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64  e_t length;.#ifd
df40: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e  ef HAVE_LIBZ..in
df50: 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  t uncompress_ret
df60: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
df70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
df80: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61  Called.");...rea
df90: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
dfa0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
dfb0: 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   tlen_buf, sizeo
dfc0: 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20  f(tlen_buf), 1, 
dfd0: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
dfe0: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
dff0: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(tlen_buf)) {.
e000: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e010: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e020: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e030: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e040: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e050: 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62  ..tlen = (tlen_b
e060: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c  uf[1] << 8) | tl
e070: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61  en_buf[0];...rea
e080: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
e090: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
e0a0: 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   vlen_buf, sizeo
e0b0: 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20  f(vlen_buf), 2, 
e0c0: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
e0d0: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
e0e0: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(vlen_buf)) {.
e0f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e100: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e110: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e120: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e130: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e140: 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62  ..vlen = (vlen_b
e150: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c  uf[1] << 8) | vl
e160: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43  en_buf[0];...CAC
e170: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e180: 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25  ("Tag Length = %
e190: 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74 68  lu, Value Length
e1a0: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
e1b0: 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20 28  ed long) tlen, (
e1c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76  unsigned long) v
e1d0: 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f 74  len);...offset_t
e1e0: 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76   += 2;..offset_v
e1f0: 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65   += 2;...if (tle
e200: 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f  n > sizeof(tval_
e210: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
e220: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
e230: 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ag length is too
e240: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
e250: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
e260: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
e270: 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e  ..}...if (vlen >
e280: 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66   sizeof(vval_buf
e290: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
e2a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75  BUG_PRINTF("Valu
e2b0: 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  e length is too 
e2c0: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
e2d0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e2e0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e2f0: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
e300: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
e310: 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75  er(slot, tval_bu
e320: 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73  f, tlen, 1, offs
e330: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
e340: 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a  _ret != tlen) {.
e350: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e360: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
e370: 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62   read entire T-b
e380: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
e390: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e3a0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e3b0: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
e3c0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
e3d0: 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75  er(slot, vval_bu
e3e0: 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73  f, vlen, 2, offs
e3f0: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
e400: 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a  _ret != vlen) {.
e410: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e420: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
e430: 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62   read entire V-b
e440: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
e450: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e460: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e470: 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c  .}...tval = tval
e480: 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76  _buf;..vval = vv
e490: 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  al_buf;..while (
e4a0: 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e  tlen > 0 && vlen
e4b0: 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20   > 0) {...tag = 
e4c0: 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b  *tval;...tval++;
e4d0: 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66  ...tlen--;....if
e4e0: 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29   (*tval == 0xff)
e4f0: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28   {....length = (
e500: 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20  tval[2] << 8) | 
e510: 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c  tval[1];....tval
e520: 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d   += 3;....tlen -
e530: 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 3;...} else {.
e540: 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61  ...length = *tva
e550: 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  l;....tval++;...
e560: 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09  .tlen--;...}....
e570: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e580: 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30  NTF("Tag: %s (%0
e590: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
e5a0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
e5b0: 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e  TR(tag), (unsign
e5c0: 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09  ed int) tag);...
e5d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e5e0: 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20  NTBUF("Value:", 
e5f0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
e600: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
e610: 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20 28  NULL;...switch (
e620: 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47  tag) {....case G
e630: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
e640: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
e650: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
e660: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
e670: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
e680: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
e690: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
e6a0: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  (*curr_entity->v
e6b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b 0a  alue_cardurl));.
e6c0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
e6d0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
e6e0: 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76 61  ardurl->rid, vva
e6f0: 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72 5f  l, 5);.....curr_
e700: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
e710: 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 3d  rdurl->apptype =
e720: 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63 75   vval[5];.....cu
e730: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
e740: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
e750: 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c 3c  id = (vval[6] <<
e760: 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09   8) | vval[7];..
e770: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
e780: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
e790: 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d 20  ppid = (vval[8] 
e7a0: 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d 3b  << 8) | vval[9];
e7b0: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
e7c0: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
e7d0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
e7e0: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
e7f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
e800: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
e810: 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  ABLE:.....curr_e
e820: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
e830: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
e840: 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66  ty));.....tmpbuf
e850: 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68   = malloc(length
e860: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  );......memcpy(t
e870: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
e880: 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  gth);......curr_
e890: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
e8a0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
e8b0: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  ty->length = len
e8c0: 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  gth;.....curr_en
e8d0: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
e8e0: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
e8f0: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
e900: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
e910: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e920: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
e930: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
e940: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
e950: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
e960: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
e970: 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  Z.....tmpbuflen 
e980: 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09  = length * 2;...
e990: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
e9a0: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  c(tmpbuflen);...
e9b0: 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
e9c0: 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 74  t = uncompress(t
e9d0: 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c 65  mpbuf, &tmpbufle
e9e0: 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  n, vval, length)
e9f0: 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ;.....if (uncomp
ea00: 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b  ress_ret != Z_OK
ea10: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
ea20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
ea30: 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72 65  iled to decompre
ea40: 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28 29  ss, uncompress()
ea50: 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d 20   returned %i -- 
ea60: 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69 72  resorting to dir
ea70: 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f 6d  ect copy", uncom
ea80: 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09  press_ret);.....
ea90: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
eaa0: 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63 70  ngth;......memcp
eab0: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
eac0: 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a 0a  length);.....}..
ead0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
eae0: 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d  _PRINTBUF("Decom
eaf0: 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d  pressed to:", tm
eb00: 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
eb10: 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43 4b  ;.#else.....CACK
eb20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb30: 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53 75  "Missing ZLIB Su
eb40: 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72 74  pport, this cert
eb50: 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65 6c  ificate is likel
eb60: 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a  y useless...");.
eb70: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
eb80: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65 6d   length;.....mem
eb90: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
eba0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69  , length);.#endi
ebb0: 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  f......curr_enti
ebc0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
ebd0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ebe0: 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66 6c  length = tmpbufl
ebf0: 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  en;.....curr_ent
ec00: 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70  ity->value = tmp
ec10: 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  buf;.....curr_en
ec20: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
ec30: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
ec40: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ec50: 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75  G_PKCS15:.....cu
ec60: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
ec70: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
ec80: 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63  entity));......c
ec90: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
eca0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
ecb0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79  entity->value_by
ecc0: 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09  te = vval[0];...
ecd0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
ece0: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
ecf0: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
ed00: 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a  vval += length;.
ed10: 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74 68  ..vlen -= length
ed20: 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65 6e  ;....if (curr_en
ed30: 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  tity != NULL) {.
ed40: 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
ed50: 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74 20  ULL) {.....root 
ed60: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
ed70: 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73 74  ..}.....if (last
ed80: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
ed90: 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63 75  last->_next = cu
eda0: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
edb0: 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72 5f  ....last = curr_
edc0: 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a  entity;...}..}..
edd0: 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d  .return(root);.}
ede0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
edf0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
ee00: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
ee10: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
ee20: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
ee30: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
ee40: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
ee50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
ee60: 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
ee70: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
ee80: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
ee90: 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
eea0: 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61 72  t, int free_star
eeb0: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
eec0: 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ;...if (start ==
eed0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
eee0: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  n;..}...for (idx
eef0: 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e   = 0; idx < coun
ef00: 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
ef10: 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72   (start[idx].cer
ef20: 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66  tificate) {....f
ef30: 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63  ree(start[idx].c
ef40: 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d  ertificate);...}
ef50: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73  ..}...if (free_s
ef60: 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73  tart) {...free(s
ef70: 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tart);..}...retu
ef80: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  rn;.}..static st
ef90: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
efa0: 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
efb0: 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 73 74 72  y_copy_certs(str
efc0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
efd0: 69 64 65 6e 74 69 74 79 20 2a 64 65 73 74 2c 20  identity *dest, 
efe0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
eff0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74 61  sc_identity *sta
f000: 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  rt, size_t count
f010: 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b  ) {..size_t idx;
f020: 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d 20  ...if (start == 
f030: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
f040: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
f050: 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (dest == NULL) {
f060: 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c 6c 6f 63  ...dest = malloc
f070: 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 29 20 2a  (sizeof(*dest) *
f080: 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f   count);..}...fo
f090: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
f0a0: 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
f0b0: 7b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b  {...memcpy(dest[
f0c0: 69 64 78 5d 2e 61 70 70 6c 65 74 2c 20 73 74 61  idx].applet, sta
f0d0: 72 74 5b 69 64 78 5d 2e 61 70 70 6c 65 74 2c 20  rt[idx].applet, 
f0e0: 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d  sizeof(dest[idx]
f0f0: 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 64 65 73  .applet));...des
f100: 74 5b 69 64 78 5d 2e 66 69 6c 65 20 3d 20 73 74  t[idx].file = st
f110: 61 72 74 5b 69 64 78 5d 2e 66 69 6c 65 3b 0a 09  art[idx].file;..
f120: 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69  .dest[idx].certi
f130: 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61  ficate_len = sta
f140: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
f150: 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b  ate_len;...dest[
f160: 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73  idx].keysize = s
f170: 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a  tart[idx].keysiz
f180: 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e  e;....dest[idx].
f190: 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61  certificate = ma
f1a0: 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e 63  lloc(dest[idx].c
f1b0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
f1c0: 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69  ...memcpy(dest[i
f1d0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c  dx].certificate,
f1e0: 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74   start[idx].cert
f1f0: 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69 64  ificate, dest[id
f200: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
f210: 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  en);..}...return
f220: 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (dest);.}../*. *
f230: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
f240: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
f250: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
f260: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
f270: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
f280: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
f290: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
f2a0: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
f2b0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
f2c0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
f2d0: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
f2e0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75  slot *slot, stru
f2f0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f300: 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20  dentity *certs, 
f310: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63  unsigned long *c
f320: 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
f330: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f340: 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
f350: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
f360: 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c  v_entity *ccc_tl
f370: 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61  v, *ccc_curr, *a
f380: 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72  pp_tlv, *app_cur
f390: 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  r;..unsigned cha
f3a0: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47  r ccc_aid[] = {G
f3b0: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20 70  SCIS_AID_CCC}, p
f3c0: 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54  iv_aid[] = {NIST
f3d0: 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41  SP800_73_3_PIV_A
f3e0: 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ID};..unsigned c
f3f0: 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69  har *piv_oid, pi
f400: 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d 20  v_oid_pivauth[] 
f410: 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  = {NISTSP800_73_
f420: 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c 20  3_OID_PIVAUTH}, 
f430: 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72  piv_oid_signatur
f440: 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30  e[] = {NISTSP800
f450: 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54  _73_3_OID_SIGNAT
f460: 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65  URE}, piv_oid_ke
f470: 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  ymgt[] = {NISTSP
f480: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59  800_73_3_OID_KEY
f490: 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  MGT};..unsigned 
f4a0: 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d  char curr_aid[7]
f4b0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
f4c0: 20 62 75 66 66 65 72 5b 38 31 39 32 5d 3b 0a 09   buffer[8192];..
f4d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
f4e0: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tidx = 0;..cacke
f4f0: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
f500: 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20  n_ret;..ssize_t 
f510: 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 63  read_ret;..int c
f520: 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a  erts_resizable;.
f530: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20 73  .int send_ret, s
f540: 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69 6e 74 20  elect_ret;..int 
f550: 70 69 76 5f 6b 65 79 2c 20 70 69 76 20 3d 20 30  piv_key, piv = 0
f560: 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41  ;..int idx;...CA
f570: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f580: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
f590: 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c  if (count == NUL
f5a0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
f5b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e  BUG_PRINTF("coun
f5c0: 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72  t is NULL, retur
f5d0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
f5e0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
f5f0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72  L);..}...if (cer
f600: 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts != NULL) {...
f610: 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29  if (*count == 0)
f620: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
f630: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
f640: 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30  sted we return 0
f650: 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d   objects, short-
f660: 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72  circuit");.....r
f670: 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
f680: 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 73 6c 6f 74  }..}...if (!slot
f690: 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ->slot_reset) {.
f6a0: 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
f6b0: 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 69  ed_certs) {....i
f6c0: 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c  f (certs == NULL
f6d0: 29 20 7b 0a 09 09 09 09 63 65 72 74 73 20 3d 20  ) {.....certs = 
f6e0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
f6f0: 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d 3e 63 61  erts) * slot->ca
f700: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
f710: 29 3b 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20  );.....*count = 
f720: 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
f730: 74 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 7d 20  ts_count;.....} 
f740: 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 2a  else {.....if (*
f750: 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63 61  count > slot->ca
f760: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
f770: 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20  ) {......*count 
f780: 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  = slot->cached_c
f790: 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 09 09  erts_count;.....
f7a0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  }....}.....cacke
f7b0: 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 63 65 72  y_copy_certs(cer
f7c0: 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  ts, slot->cached
f7d0: 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b  _certs, *count);
f7e0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
f7f0: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  s);...}..}...if 
f800: 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
f810: 72 74 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  rts) {...cackey_
f820: 66 72 65 65 5f 63 65 72 74 73 28 73 6c 6f 74 2d  free_certs(slot-
f830: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 73  >cached_certs, s
f840: 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
f850: 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09  s_count, 1);....
f860: 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
f870: 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ts = NULL;..}...
f880: 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74  /* Begin a Smart
f890: 43 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  Card transaction
f8a0: 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e   */..transaction
f8b0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65  _ret = cackey_be
f8c0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
f8d0: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e  slot);..if (tran
f8e0: 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43  saction_ret != C
f8f0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
f900: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
f910: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
f920: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
f930: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
f940: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
f950: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
f960: 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
f970: 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ULL) {...certs =
f980: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
f990: 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a  certs) * 5);...*
f9a0: 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72  count = 5;...cer
f9b0: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31  ts_resizable = 1
f9c0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65  ;..} else {...ce
f9d0: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
f9e0: 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63  0;..}.../* Selec
f9f0: 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74  t the CCC Applet
fa00: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
fa10: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
fa20: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
fa30: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
fa40: 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  id));..if (send_
fa50: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
fa60: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 2f 2a 20  SC_S_OK) {.../* 
fa70: 54 72 79 20 50 49 56 20 61 70 70 6c 69 63 61 74  Try PIV applicat
fa80: 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64 5f 72 65  ion */...send_re
fa90: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
faa0: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70  t_applet(slot, p
fab0: 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 70  iv_aid, sizeof(p
fac0: 69 76 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28  iv_aid));...if (
fad0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
fae0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
faf0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fb00: 50 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20  PRINTF("We have 
fb10: 61 20 50 49 56 20 63 61 72 64 20 2d 2d 20 6e 6f  a PIV card -- no
fb20: 74 20 75 73 69 6e 67 20 74 68 65 20 43 43 43 2c  t using the CCC,
fb30: 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d 73 65 6c   pulling pre-sel
fb40: 65 63 74 65 64 20 6b 65 79 73 22 29 3b 0a 0a 09  ected keys");...
fb50: 09 09 70 69 76 20 3d 20 31 3b 0a 09 09 7d 20 65  ..piv = 1;...} e
fb60: 6c 73 65 20 7b 0a 0a 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
fb70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
fb80: 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20  nable to select 
fb90: 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65 74 75  CCC Applet, retu
fba0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
fbb0: 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65 72 6d 69  ");...../* Termi
fbc0: 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54  nate SmartCard T
fbd0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
fbe0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
fbf0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
fc00: 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
fc10: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 70 69  ...}..}...if (pi
fc20: 76 29 20 7b 0a 09 09 66 6f 72 20 28 69 64 78 20  v) {...for (idx 
fc30: 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b 20 69 64  = 0; idx < 3; id
fc40: 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69 74 63 68  x++) {....switch
fc50: 20 28 69 64 78 29 20 7b 0a 09 09 09 09 63 61 73   (idx) {.....cas
fc60: 65 20 30 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 0:......piv_oi
fc70: 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70 69 76 61  d = piv_oid_piva
fc80: 75 74 68 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65  uth;......piv_ke
fc90: 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38  y = NISTSP800_78
fca0: 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48 3b 0a  _3_KEY_PIVAUTH;.
fcb0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
fcc0: 63 61 73 65 20 31 3a 0a 09 09 09 09 09 70 69 76  case 1:......piv
fcd0: 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 73  _oid = piv_oid_s
fce0: 69 67 6e 61 74 75 72 65 3b 0a 09 09 09 09 09 70  ignature;......p
fcf0: 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38  iv_key = NISTSP8
fd00: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e  00_78_3_KEY_SIGN
fd10: 41 54 55 52 45 3b 0a 09 09 09 09 09 62 72 65 61  ATURE;......brea
fd20: 6b 3b 0a 09 09 09 09 63 61 73 65 20 32 3a 0a 09  k;.....case 2:..
fd30: 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69  ....piv_oid = pi
fd40: 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b 0a 09 09  v_oid_keymgt;...
fd50: 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
fd60: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
fd70: 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09 62 72 65  KEYMGT;......bre
fd80: 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61  ak;....}.....rea
fd90: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67  d_ret = cackey_g
fda0: 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62 75  et_data(slot, bu
fdb0: 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 62 75 66  ffer, sizeof(buf
fdc0: 66 65 72 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a  fer), piv_oid);.
fdd0: 0a 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74  ....if (read_ret
fde0: 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e   <= 0) {.....con
fdf0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
fe00: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
fe10: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
fe20: 69 64 78 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f  idx++;.....curr_
fe30: 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31  id->keysize = -1
fe40: 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 66 69  ;....curr_id->fi
fe50: 6c 65 20 3d 20 30 78 46 46 46 46 3b 0a 09 09 09  le = 0xFFFF;....
fe60: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 5b  curr_id->applet[
fe70: 30 5d 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 0a 09  0] = piv_key;...
fe80: 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
fe90: 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72 65 61  ficate_len = rea
fea0: 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72 5f 69  d_ret;....curr_i
feb0: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  d->certificate =
fec0: 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d   malloc(curr_id-
fed0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
fee0: 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
fef0: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
ff00: 65 2c 20 62 75 66 66 65 72 20 2b 20 34 2c 20 63  e, buffer + 4, c
ff10: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
ff20: 61 74 65 5f 6c 65 6e 20 2d 20 34 29 3b 20 2f 2a  ate_len - 4); /*
ff30: 20 58 58 58 20 54 4f 44 4f 20 50 49 56 20 28 2d   XXX TODO PIV (-
ff40: 34 20 68 65 61 64 65 72 2c 20 2d 35 20 74 72 61  4 header, -5 tra
ff50: 69 6c 65 72 20 3d 3d 20 77 68 79 20 3f 29 20 2a  iler == why ?) *
ff60: 2f 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  /....curr_id->ce
ff70: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 2d 3d  rtificate_len -=
ff80: 20 34 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e   4;....curr_id->
ff90: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
ffa0: 2d 3d 20 35 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  -= 5;...}..} els
ffb0: 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64 20 61 6c  e {.../* Read al
ffc0: 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72  l the applets fr
ffd0: 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56  om the CCC's TLV
ffe0: 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76 20 3d 20   */...ccc_tlv = 
fff0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
10000 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f  slot);..../* Loo
10010 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74  k for CARDURLs t
10020 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74  hat coorespond t
10030 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f  o PKI applets */
10040 0a 09 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  ...for (ccc_curr
10050 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
10060 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
10070 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
10080 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
10090 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
100a0 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c  d tag: %s ... ",
100b0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
100c0 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63  NC_TAG_TO_STR(cc
100d0 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a  c_curr->tag));..
100e0 09 09 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d  ...if (ccc_curr-
100f0 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41  >tag != GSCIS_TA
10100 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09  G_CARDURL) {....
10110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10120 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
10130 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
10140 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52 44   care about CARD
10150 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f  URLs)");......co
10160 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
10170 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e  .if ((ccc_curr->
10180 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
10190 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f  pptype & CACKEY_
101a0 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20  TLV_APP_PKI) != 
101b0 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
101c0 4b 49 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  KI) {.....CACKEY
101d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
101e0 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
101f0 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
10200 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73  bout PKI applets
10210 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 75  , this applet su
10220 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29  pports: %s/%02x)
10230 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
10240 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
10250 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
10260 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10270 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
10280 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e   int) ccc_curr->
10290 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
102a0 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6f  pptype);......co
102b0 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
102c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
102d0 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63  INTBUF("RID:", c
102e0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
102f0 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a  ardurl->rid, siz
10300 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  eof(ccc_curr->va
10310 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
10320 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ));....CACKEY_DE
10330 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70 49  BUG_PRINTF("AppI
10340 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43  D = %s/%04lx", C
10350 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
10360 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63  _OBJID_TO_STR(cc
10370 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10380 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28  rdurl->appid), (
10390 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
103a0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
103b0 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a  ardurl->appid);.
103c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
103d0 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44  PRINTF("ObjectID
103e0 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41   = %s/%04lx", CA
103f0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
10400 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63  OBJID_TO_STR(ccc
10410 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
10420 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c  durl->objectid),
10430 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10440 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
10450 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
10460 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  id);.....memcpy(
10470 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75  curr_aid, ccc_cu
10480 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10490 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
104a0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
104b0 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
104c0 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
104d0 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d  f(curr_aid) - 2]
104e0 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61   = (ccc_curr->va
104f0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10500 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  id >> 8) & 0xff;
10510 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ....curr_aid[siz
10520 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
10530 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  1] = ccc_curr->v
10540 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
10550 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 09  pid & 0xff;.....
10560 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
10570 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
10580 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
10590 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
105a0 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69  et(slot, curr_ai
105b0 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  d, sizeof(curr_a
105c0 69 64 29 29 3b 0a 09 09 09 69 66 20 28 73 65 6c  id));....if (sel
105d0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
105e0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
105f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10600 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
10610 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 2c  o select applet,
10620 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
10630 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
10640 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74  ect");......cont
10650 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f  inue;....}...../
10660 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74  * ... and object
10670 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 09 73 65   (file) */....se
10680 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  lect_ret = cacke
10690 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
106a0 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ot, ccc_curr->va
106b0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
106c0 65 63 74 69 64 29 3b 0a 09 09 09 69 66 20 28 73  ectid);....if (s
106d0 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
106e0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
106f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10700 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
10710 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c   to select file,
10720 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
10730 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
10740 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74  ect");......cont
10750 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f  inue;....}...../
10760 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 66  * Process this f
10770 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e  ile's TLV lookin
10780 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61 74  g for certificat
10790 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f 74 6c 76  es */....app_tlv
107a0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
107b0 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09 09 09 66  lv(slot);......f
107c0 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61  or (app_curr = a
107d0 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72  pp_tlv; app_curr
107e0 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70  ; app_curr = app
107f0 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a  _curr->_next) {.
10800 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10810 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
10820 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
10830 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
10840 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
10850 74 61 67 29 29 3b 0a 09 09 09 09 69 66 20 28 61  tag));.....if (a
10860 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20  pp_curr->tag != 
10870 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
10880 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
10890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
108a0 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
108b0 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
108c0 72 65 20 61 62 6f 75 74 20 43 45 52 54 49 46 49  re about CERTIFI
108d0 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 09  CATEs)");.......
108e0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
108f0 0a 09 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
10900 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
10910 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
10920 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
10930 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61  ->applet, curr_a
10940 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  id, sizeof(curr_
10950 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09  id->applet));...
10960 09 09 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20  ..curr_id->file 
10970 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
10980 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
10990 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  tid;.....curr_id
109a0 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
109b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
109c0 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e  G_PRINTF("Fillin
109d0 67 20 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  g curr_id->apple
109e0 74 20 28 25 70 29 20 77 69 74 68 20 25 6c 75 20  t (%p) with %lu 
109f0 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64  bytes:", curr_id
10a00 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67  ->applet, (unsig
10a10 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66  ned long) sizeof
10a20 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
10a30 29 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ));.....CACKEY_D
10a40 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56  EBUG_PRINTBUF("V
10a50 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61  AL:", curr_id->a
10a60 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75  pplet, sizeof(cu
10a70 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b  rr_id->applet));
10a80 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
10a90 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
10aa0 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74   app_curr->lengt
10ab0 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  h;......curr_id-
10ac0 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
10ad0 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
10ae0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
10af0 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
10b00 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10b10 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75  , app_curr->valu
10b20 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  e, curr_id->cert
10b30 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10b40 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d  ...if (outidx >=
10b50 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09   *count) {......
10b60 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
10b70 62 6c 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f  ble) {.......*co
10b80 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09  unt *= 2;.......
10b90 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
10ba0 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
10bb0 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
10bc0 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
10bd0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10be0 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ...}.....}....}.
10bf0 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
10c00 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09  tlv(app_tlv);...
10c10 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20  ..if (outidx >= 
10c20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72  *count) {.....br
10c30 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
10c40 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
10c50 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09  (ccc_tlv);..}...
10c60 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
10c70 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
10c80 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
10c90 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
10ca0 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
10cb0 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
10cc0 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  }...slot->cached
10cd0 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f  _certs = cackey_
10ce0 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c  copy_certs(NULL,
10cf0 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b   certs, *count);
10d00 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
10d10 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f  erts_count = *co
10d20 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  unt;.../* Termin
10d30 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
10d40 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
10d50 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
10d60 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65  tion(slot);...re
10d70 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a  turn(certs);.}..
10d80 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
10d90 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
10da0 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
10db0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
10dc0 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
10dd0 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
10de0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
10df0 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
10e00 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
10e10 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  pt(struct cackey
10e20 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
10e30 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
10e40 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
10e50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
10e60 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  f, size_t buflen
10e70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
10e80 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20  *outbuf, size_t 
10e90 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70  outbuflen, int p
10ea0 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70  adInput, int unp
10eb0 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 75 6e 73  adOutput) {..uns
10ec0 69 67 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61  igned char dyn_a
10ed0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d  uth_template[10]
10ee0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
10ef0 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75   *tmpbuf, *tmpbu
10f00 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 3b 0a  f_s, *outbuf_s;.
10f10 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
10f20 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31  ytes_to_send, p1
10f30 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67 6e  , class;..unsign
10f40 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70  ed char blocktyp
10f50 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73  e;..cackey_ret s
10f60 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36  end_ret;..uint16
10f70 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73  _t respcode;..ss
10f80 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30  ize_t retval = 0
10f90 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  , unpadoffset;..
10fa0 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e  size_t tmpbuflen
10fb0 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74  , padlen, tmpout
10fc0 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65  buflen;..int fre
10fd0 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69  e_tmpbuf = 0;..i
10fe0 6e 74 20 6c 65 3b 0a 09 69 6e 74 20 70 69 76 3b  nt le;..int piv;
10ff0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11000 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
11010 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d  );...if (slot ==
11020 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
11030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11040 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20  Error.  slot is 
11050 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11060 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
11070 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
11080 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11090 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75  INTF("Error.  bu
110a0 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  f is NULL");....
110b0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
110c0 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e  .if (outbuf == N
110d0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
110e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
110f0 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20  ror.  outbuf is 
11100 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11110 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
11120 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
11130 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11140 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11150 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 20 4e  .  identity is N
11160 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
11170 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69  (-1);..}...if (i
11180 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11190 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20  entity == NULL) 
111a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
111b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
111c0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
111d0 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c  identity is NULL
111e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
111f0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
11200 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65  mine identity Ke
11210 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69  y size */..if (i
11220 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11230 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
11240 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74  < 0) {...identit
11250 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11260 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39  ->keysize = x509
11270 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e  _to_keysize(iden
11280 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11290 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
112a0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
112b0 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
112c0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a  ficate_len);..}.
112d0 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65  ../* Pad message
112e0 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a   to key size */.
112f0 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b  .if (padInput) {
11300 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
11310 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
11320 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09  keysize > 0) {..
11330 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20  ..if (buflen != 
11340 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11350 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
11360 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c  ) {.....if (bufl
11370 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e  en > (identity->
11380 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
11390 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09  eysize + 3)) {..
113a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
113b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
113c0 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   Message is too 
113d0 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65  large to sign/de
113e0 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72  crypt");.......r
113f0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d  eturn(-1);.....}
11400 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
11410 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
11420 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
11430 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ze;.....tmpbuf =
11440 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
11450 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  n);.....free_tmp
11460 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61  buf = 1;......pa
11470 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e  dlen = tmpbuflen
11480 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a   - buflen - 3;..
11490 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23  ..../* RSA PKCS#
114a0 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f  1 EMSA-PKCS1-v1_
114b0 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09  5 Padding */....
114c0 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30  .tmpbuf[0] = 0x0
114d0 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d  0;.....tmpbuf[1]
114e0 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d   = 0x01;.....mem
114f0 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20  set(&tmpbuf[2], 
11500 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09  0xFF, padlen);..
11510 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  ...tmpbuf[padlen
11520 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09   + 2]= 0x00;....
11530 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b  .memcpy(&tmpbuf[
11540 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66  padlen + 3], buf
11550 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  , buflen);......
11560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11570 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
11580 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ", buf, buflen);
11590 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
115a0 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
115b0 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  ed:", tmpbuf, tm
115c0 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65  pbuflen);....} e
115d0 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66  lse {.....tmpbuf
115e0 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62   = buf;.....tmpb
115f0 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
11600 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
11610 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20  = 0;.....padlen 
11620 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  = 0;....}...} el
11630 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
11640 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
11650 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
11660 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e   key size, hopin
11670 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73  g the message is
11680 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64   properly padded
11690 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20  !");.....tmpbuf 
116a0 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66  = buf;....tmpbuf
116b0 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
116c0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
116d0 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  ;....padlen = 0;
116e0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
116f0 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
11700 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
11710 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62  len;...free_tmpb
11720 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e  uf = 0;...padlen
11730 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65   = 0;..}.../* Be
11740 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
11750 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
11760 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
11770 74 29 3b 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  t);.../* Determi
11780 6e 65 20 74 79 70 65 20 6f 66 20 74 72 61 6e 73  ne type of trans
11790 61 63 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 69  action */..if (i
117a0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
117b0 65 6e 74 69 74 79 2d 3e 66 69 6c 65 20 3d 3d 20  entity->file == 
117c0 30 78 46 46 46 46 29 20 7b 0a 09 09 70 69 76 20  0xFFFF) {...piv 
117d0 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
117e0 09 70 69 76 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f  .piv = 0;..}.../
117f0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
11800 20 61 70 70 6c 65 74 20 2a 2f 0a 09 69 66 20 28   applet */..if (
11810 21 70 69 76 29 20 7b 0a 09 09 43 41 43 4b 45 59  !piv) {...CACKEY
11820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
11830 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20  electing applet 
11840 66 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22  found at %p ..."
11850 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
11860 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65  _identity->apple
11870 74 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 6c  t);...cackey_sel
11880 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
11890 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
118a0 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74  identity->applet
118b0 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74  , sizeof(identit
118c0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
118d0 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 2f  ->applet));..../
118e0 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
118f0 20 66 69 6c 65 20 2a 2f 0a 09 09 63 61 63 6b 65   file */...cacke
11900 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
11910 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
11920 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c  sc_identity->fil
11930 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  e);..} else {...
11940 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
11950 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 64  e[0] = 0x7C;...d
11960 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
11970 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 64 79  [1] = 0x82;...dy
11980 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
11990 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e  2] = ((tmpbuflen
119a0 20 2b 20 36 29 20 26 20 30 78 66 66 30 30 29 20   + 6) & 0xff00) 
119b0 3e 3e 20 38 3b 0a 09 09 64 79 6e 5f 61 75 74 68  >> 8;...dyn_auth
119c0 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28  _template[3] = (
119d0 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26  tmpbuflen + 6) &
119e0 20 30 78 30 30 66 66 3b 0a 09 09 64 79 6e 5f 61   0x00ff;...dyn_a
119f0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20  uth_template[4] 
11a00 3d 20 30 78 38 32 3b 0a 09 09 64 79 6e 5f 61 75  = 0x82;...dyn_au
11a10 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d  th_template[5] =
11a20 20 30 78 30 30 3b 0a 09 09 64 79 6e 5f 61 75 74   0x00;...dyn_aut
11a30 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d 20  h_template[6] = 
11a40 30 78 38 31 3b 0a 09 09 64 79 6e 5f 61 75 74 68  0x81;...dyn_auth
11a50 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d 20 30  _template[7] = 0
11a60 78 38 32 3b 0a 09 09 64 79 6e 5f 61 75 74 68 5f  x82;...dyn_auth_
11a70 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74  template[8] = (t
11a80 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 66 66 30  mpbuflen & 0xff0
11a90 30 29 20 3e 3e 20 38 3b 0a 09 09 64 79 6e 5f 61  0) >> 8;...dyn_a
11aa0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20  uth_template[9] 
11ab0 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78  = tmpbuflen & 0x
11ac0 30 30 66 66 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  00ff;....send_re
11ad0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
11ae0 61 70 64 75 28 73 6c 6f 74 2c 20 30 78 31 30 2c  apdu(slot, 0x10,
11af0 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
11b00 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e  INSTR_GENAUTH, N
11b10 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c  ISTSP800_78_3_AL
11b20 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65 6e  GO_RSA2048, iden
11b30 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11b40 69 74 79 2d 3e 61 70 70 6c 65 74 5b 30 5d 2c 20  ity->applet[0], 
11b50 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f  sizeof(dyn_auth_
11b60 74 65 6d 70 6c 61 74 65 29 2c 20 64 79 6e 5f 61  template), dyn_a
11b70 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 30 78  uth_template, 0x
11b80 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  00, NULL, NULL, 
11b90 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6d 70 62  NULL);..}...tmpb
11ba0 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09  uf_s = tmpbuf;..
11bb0 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75  outbuf_s = outbu
11bc0 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75  f;..while (tmpbu
11bd0 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20 28 74 6d  flen) {...if (tm
11be0 70 62 75 66 6c 65 6e 20 3e 20 32 34 35 29 20 7b  pbuflen > 245) {
11bf0 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e  ....bytes_to_sen
11c00 64 20 3d 20 32 34 35 3b 0a 09 09 09 69 66 20 28  d = 245;....if (
11c10 70 69 76 29 20 7b 0a 09 09 09 09 63 6c 61 73 73  piv) {.....class
11c20 20 3d 20 30 78 31 30 3b 0a 09 09 09 09 6c 65 20   = 0x10;.....le 
11c30 3d 20 30 78 30 30 3b 0a 09 09 09 7d 20 65 6c 73  = 0x00;....} els
11c40 65 20 7b 0a 09 09 09 09 70 31 20 3d 20 30 78 38  e {.....p1 = 0x8
11c50 30 3b 0a 09 09 09 09 6c 65 20 3d 20 30 78 30 30  0;.....le = 0x00
11c60 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
11c70 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65  {....bytes_to_se
11c80 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  nd = tmpbuflen;.
11c90 09 09 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
11ca0 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f  ..class = GSCIS_
11cb0 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09  CLASS_ISO7816;..
11cc0 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09 09  ...le = 256;....
11cd0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 31 20  } else {.....p1 
11ce0 3d 20 30 78 30 30 3b 0a 09 09 09 09 6c 65 20 3d  = 0x00;.....le =
11cf0 20 30 78 30 30 3b 0a 09 09 09 7d 0a 09 09 7d 0a   0x00;....}...}.
11d00 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20  ...tmpoutbuflen 
11d10 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09  = outbuflen;....
11d20 69 66 20 28 70 69 76 29 20 7b 0a 09 09 09 73 65  if (piv) {....se
11d30 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
11d40 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
11d50 63 6c 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30  class, NISTSP800
11d60 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41  _73_3_INSTR_GENA
11d70 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  UTH, NISTSP800_7
11d80 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38  8_3_ALGO_RSA2048
11d90 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
11da0 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65  _identity->apple
11db0 74 5b 30 5d 2c 20 62 79 74 65 73 5f 74 6f 5f 73  t[0], bytes_to_s
11dc0 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c  end, tmpbuf, le,
11dd0 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62   &respcode, outb
11de0 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65  uf, &tmpoutbufle
11df0 6e 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  n);...} else {..
11e00 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
11e10 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
11e20 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
11e30 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
11e40 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47   GSCIS_INSTR_SIG
11e50 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78  NDECRYPT, p1, 0x
11e60 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  00, bytes_to_sen
11e70 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26  d, tmpbuf, le, &
11e80 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66  respcode, outbuf
11e90 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29  , &tmpoutbuflen)
11ea0 3b 0a 09 09 7d 0a 09 09 69 66 20 28 73 65 6e 64  ;...}...if (send
11eb0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
11ec0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
11ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ee0 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67  TF("ADPU Sending
11ef0 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72   Failed -- retur
11f00 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29  ning in error.")
11f10 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74  ;.....if (free_t
11f20 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20  mpbuf) {.....if 
11f30 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
11f40 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29  ..free(tmpbuf_s)
11f50 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
11f60 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
11f70 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
11f80 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
11f90 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28  (slot);.....if (
11fa0 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39  respcode == 0x69
11fb0 38 32 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  82) {.....CACKEY
11fc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
11fd0 65 63 75 72 69 74 79 20 73 74 61 74 75 73 20 6e  ecurity status n
11fe0 6f 74 20 73 61 74 69 73 69 66 69 65 64 2e 20 20  ot satisified.  
11ff0 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f  Returning NEEDLO
12000 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b  GIN");......cack
12010 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
12020 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c  et(slot);.....sl
12030 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot->token_flags 
12040 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
12050 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72  IRED;......retur
12060 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
12070 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d  NEEDLOGIN);....}
12080 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
12090 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
120a0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
120b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
120c0 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e  UG_PRINTF("Token
120d0 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e   absent.  Return
120e0 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22  ing TOKENABSENT"
120f0 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  );......cackey_m
12100 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
12110 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  lot);......retur
12120 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
12130 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
12140 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  .}.....return(-1
12150 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66  );...}....tmpbuf
12160 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   += bytes_to_sen
12170 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d  d;...tmpbuflen -
12180 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
12190 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d  ....outbuf += tm
121a0 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75  poutbuflen;...ou
121b0 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75  tbuflen -= tmpou
121c0 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61  tbuflen;...retva
121d0 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  l += tmpoutbufle
121e0 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65  n;..}...if (free
121f0 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20  _tmpbuf) {...if 
12200 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
12210 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
12220 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20  ..}..}...outbuf 
12230 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a  = outbuf_s;.../*
12240 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
12250 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
12260 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
12270 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  );..#ifdef CACKE
12280 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
12290 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
122a0 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66  _MAX..if (outbuf
122b0 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  len > _POSIX_SSI
122c0 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
122d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
122e0 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65  "Outbuflen excee
122f0 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
12300 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
12310 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
12320 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20  li, outbuflen = 
12330 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
12340 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
12350 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
12360 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72  outbuflen);....r
12370 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
12380 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
12390 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f 76  /* We must remov
123a0 65 20 74 68 65 20 22 37 43 22 20 74 61 67 20 74  e the "7C" tag t
123b0 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73 69 67  o get to the sig
123c0 6e 61 74 75 72 65 20 2a 2f 0a 09 69 66 20 28 70  nature */..if (p
123d0 69 76 29 20 7b 0a 09 09 69 66 20 28 6f 75 74 62  iv) {...if (outb
123e0 75 66 5b 30 5d 20 21 3d 20 30 78 37 43 29 20 7b  uf[0] != 0x7C) {
123f0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12400 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
12410 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47  e from PIV for G
12420 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49  ENERATE AUTHENTI
12430 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61  CATION was not a
12440 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72   0x7C tag, retur
12450 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
12460 29 3b 0a 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
12470 31 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 58 58  1);...}..../* XX
12480 58 20 54 4f 44 4f 20 50 49 56 20 2a 2f 0a 09 09  X TODO PIV */...
12490 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20  memmove(outbuf, 
124a0 6f 75 74 62 75 66 20 2b 20 38 2c 20 72 65 74 76  outbuf + 8, retv
124b0 61 6c 20 2d 20 38 29 3b 0a 09 09 72 65 74 76 61  al - 8);...retva
124c0 6c 20 2d 3d 20 38 3b 0a 09 7d 0a 0a 09 2f 2a 20  l -= 8;..}.../* 
124d0 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
124e0 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
124f0 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
12500 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 3) {....CACKEY
12510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12520 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
12530 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
12540 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
12550 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
12560 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
12570 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
12580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12590 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
125a0 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
125b0 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
125c0 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
125d0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
125e0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62  ...}....if (outb
125f0 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b  uf[0] != 0x00) {
12600 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12610 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67  _PRINTF("Unrecog
12620 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63  nized padding sc
12630 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20  heme -- passing 
12640 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
12650 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
12660 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12670 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
12680 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
12690 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
126a0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
126b0 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
126c0 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
126d0 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
126e0 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[1];...unpado
126f0 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
12700 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
12710 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
12720 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
12730 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
12740 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
12750 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
12760 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
12770 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
12780 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
12790 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
127a0 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
127b0 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
127c0 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
127d0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
127e0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
127f0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
12800 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
12810 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
12820 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
12830 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
12840 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
12850 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
12860 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
12870 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
12880 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
12890 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
128a0 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
128b0 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
128c0 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
128d0 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
128e0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
128f0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
12900 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
12910 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12920 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
12930 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
12940 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
12950 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
12960 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
12970 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
12980 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
12990 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
129a0 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
129b0 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
129c0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
129d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
129e0 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
129f0 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
12a00 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
12a10 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
12a20 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
12a30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
12a40 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
12a50 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
12a60 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
12a70 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
12a80 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
12a90 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
12aa0 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
12ab0 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
12ac0 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
12ad0 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f  rst zero byte fo
12ae0 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72  und is the seper
12af0 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09  ator byte */....
12b00 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
12b10 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
12b20 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
12b30 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
12b40 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
12b50 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
12b60 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61  00) {.......unpa
12b70 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
12b80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
12b90 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
12ba0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61  ...}....if (unpa
12bb0 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c  doffset > retval
12bc0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
12bd0 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
12be0 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  et greater than 
12bf0 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72  reply size, abor
12c00 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66  ting.  (unpadoff
12c10 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61  set = %lu, retva
12c20 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  l = %lu)", (unsi
12c30 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64  gned long) unpad
12c40 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65  offset, (unsigne
12c50 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b  d long) retval);
12c60 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
12c70 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
12c80 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
12c90 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c  added:", outbuf,
12ca0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
12cb0 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73  val -= unpadoffs
12cc0 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75  et;...memmove(ou
12cd0 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75  tbuf, outbuf + u
12ce0 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76  npadoffset, retv
12cf0 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  al);....CACKEY_D
12d00 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
12d10 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  npadded:", outbu
12d20 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  f, retval);..}..
12d30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12d40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
12d50 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
12d60 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
12d70 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
12d80 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
12d90 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  val);.}../*. * S
12da0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
12db0 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
12dc0 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
12dd0 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
12de0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
12df0 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
12e00 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
12e10 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
12e20 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 20  ey_login(struct 
12e30 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
12e40 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
12e50 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20   *pin, unsigned 
12e60 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e  long pin_len, in
12e70 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  t *tries_remaini
12e80 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65  ng_p) {..unsigne
12e90 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38  d char cac_pin[8
12ea0 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c  ] = {0xFF, 0xFF,
12eb0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
12ec0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
12ed0 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  xFF};..uint16_t 
12ee0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09  response_code;..
12ef0 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
12f00 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ing;..int send_r
12f10 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66  et;..int key_ref
12f20 65 72 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a  erence = 0x00;..
12f30 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  ./* Indicate tha
12f40 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  t we do not know
12f50 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20   about how many 
12f60 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e  tries are remain
12f70 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65  ing */..if (trie
12f80 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
12f90 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
12fa0 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a  ing_p = -1;..}..
12fb0 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20  ./* Apparently, 
12fc0 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58  CAC PINs are *EX
12fd0 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c  ACTLY* 8 bytes l
12fe0 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20  ong -- pad with 
12ff0 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72  0xFF if too shor
13000 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
13010 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
13020 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
13030 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   8);..} else {..
13040 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
13050 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   pin, pin_len);.
13060 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49  .}.../* Issue PI
13070 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e  N Verify */..sen
13080 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
13090 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
130a0 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
130b0 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
130c0 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65  VERIFY, 0x00, ke
130d0 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a  y_reference, siz
130e0 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61  eof(cac_pin), ca
130f0 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65  c_pin, 0x00, &re
13100 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c  sponse_code, NUL
13110 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
13120 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
13130 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 26 26 20 72  Y_PCSC_S_OK && r
13140 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20  esponse_code == 
13150 30 78 36 41 38 38 29 20 7b 0a 09 09 6b 65 79 5f  0x6A88) {...key_
13160 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30  reference = 0x80
13170 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  ;....send_ret = 
13180 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
13190 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
131a0 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
131b0 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20  S_INSTR_VERIFY, 
131c0 30 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65  0x00, key_refere
131d0 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f  nce, sizeof(cac_
131e0 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30  pin), cac_pin, 0
131f0 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63  x00, &response_c
13200 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ode, NULL, NULL)
13210 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f  ;..}...if (send_
13220 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
13230 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
13240 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  ((response_code 
13250 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36  & 0x63C0) == 0x6
13260 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f  3C0) {....tries_
13270 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73  remaining = (res
13280 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46  ponse_code & 0xF
13290 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
132a0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
132b0 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
132c0 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65  led, %i tries re
132d0 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f  maining", tries_
132e0 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09  remaining);.....
132f0 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
13300 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72  ing_p) {.....*tr
13310 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20  ies_remaining_p 
13320 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  = tries_remainin
13330 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  g;....}.....retu
13340 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
13350 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09  _BADPIN);...}...
13360 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  .if (response_co
13370 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a  de == 0x6983) {.
13380 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13390 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
133a0 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c  fication failed,
133b0 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65   device is locke
133c0 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
133d0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
133e0 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  CKED);...}....re
133f0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13400 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
13410 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13420 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
13430 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65  ication succeede
13440 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  d");...return(CA
13450 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
13460 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
13470 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
13480 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
13490 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
134a0 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
134b0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
134c0 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
134d0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
134e0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f  ey_ret cackey_to
134f0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75  ken_present(stru
13500 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
13510 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
13520 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ret pcsc_connect
13530 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61  _ret;..DWORD rea
13540 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61  der_len = 0, sta
13550 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c  te = 0, protocol
13560 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09   = 0, atr_len;..
13570 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52  BYTE atr[MAX_ATR
13580 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74  _SIZE];..LONG st
13590 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f  atus_ret, scard_
135a0 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41  reconn_ret;...CA
135b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
135c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
135d0 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e  if (slot->intern
135e0 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  al) {...CACKEY_D
135f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
13600 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
13610 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74  sent (internal t
13620 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75  oken)");....retu
13630 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
13640 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
13650 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
13660 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
13670 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
13680 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
13690 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
136a0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
136b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
136c0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
136d0 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
136e0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
136f0 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72  n absent");....r
13700 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
13710 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
13720 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d  ;..}...atr_len =
13730 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73   sizeof(atr);..s
13740 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
13750 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
13760 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
13770 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
13780 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
13790 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a  tr, &atr_len);..
137a0 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
137b0 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  == SCARD_E_INVAL
137c0 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43  ID_HANDLE) {...C
137d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
137e0 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73 28  TF("SCardStatus(
137f0 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
13800 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
13810 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f  E, marking is no
13820 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63  t already connec
13830 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61  ted and trying a
13840 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79  gain");...cackey
13850 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13860 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f  (slot);....pcsc_
13870 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
13880 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
13890 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70  d(slot);...if (p
138a0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
138b0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
138c0 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
138d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
138e0 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
138f0 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
13900 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
13910 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
13920 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
13930 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a  ENABSENT);...}..
13940 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  ..atr_len = size
13950 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75  of(atr);...statu
13960 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
13970 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
13980 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
13990 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
139a0 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
139b0 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  &atr_len);..}...
139c0 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
139d0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
139e0 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61  S) {...cackey_ma
139f0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
13a00 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74  ot);....if (stat
13a10 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  us_ret == SCARD_
13a20 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
13a30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13a40 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
13a50 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
13a60 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
13a70 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
13a80 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
13a90 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41  t_card(slot, SCA
13aa0 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
13ab0 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
13ac0 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  T1, &protocol);.
13ad0 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
13ae0 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
13af0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
13b00 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74  ../* Update prot
13b10 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  ocol */.....slot
13b20 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
13b30 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52  tocol;....../* R
13b40 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
13b50 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
13b60 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
13b70 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
13b80 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
13b90 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
13ba0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
13bb0 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  h--;......slot->
13bc0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
13bd0 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
13be0 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  ...cackey_begin_
13bf0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
13c00 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
13c10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13c20 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73  F("Reset success
13c30 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22  ful, requerying"
13c40 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65  );.....status_re
13c50 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
13c60 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
13c70 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
13c80 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
13c90 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
13ca0 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73  _len);.....if (s
13cb0 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
13cc0 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
13cd0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13ce0 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20  G_PRINTF("Still 
13cf0 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20  unable to query 
13d00 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74  card status, ret
13d10 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
13d20 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75  ent.  SCardStatu
13d30 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  s() = %s", CACKE
13d40 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
13d50 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61  RDERR_TO_STR(sta
13d60 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  tus_ret));......
13d70 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
13d80 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
13d90 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  T);.....}....} e
13da0 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
13db0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
13dc0 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65  nable to reconne
13dd0 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
13de0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
13df0 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e  nt.  SCardReconn
13e00 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43  ect() = %s", CAC
13e10 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
13e20 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
13e30 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29  card_reconn_ret)
13e40 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
13e50 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
13e60 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
13e70 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
13e80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13e90 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65  F("Unable to que
13ea0 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
13eb0 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
13ec0 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
13ed0 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
13ee0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
13ef0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
13f00 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
13f10 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
13f20 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
13f30 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  NT);...}..}...if
13f40 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44   ((state & SCARD
13f50 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52  _ABSENT) == SCAR
13f60 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41  D_ABSENT) {...CA
13f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13f80 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e  F("Card is absen
13f90 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  t, returning tok
13fa0 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
13fb0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
13fc0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
13fd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
13fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
13ff0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
14000 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72  sent.");...retur
14010 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
14020 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d  TOKENPRESENT);.}
14030 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
14040 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
14050 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
14060 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
14070 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
14080 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
14090 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
140a0 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
140b0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
140c0 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28  entity_to_label(
140d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
140e0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
140f0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
14100 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c  char *label_buf,
14110 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
14120 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a  abel_buf_len) {.
14130 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63  .unsigned long c
14140 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
14150 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e  .void *label_asn
14160 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66  1;..void *certif
14170 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39  icate;..int x509
14180 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72  _read_ret;...cer
14190 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
141a0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
141b0 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
141c0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
141d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
141e0 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
141f0 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72  e_len < 0) {...r
14200 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
14210 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
14220 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
14230 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
14240 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76  tificate_len, (v
14250 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61  oid **) &label_a
14260 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f  sn1);..if (x509_
14270 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
14280 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
14290 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
142a0 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74   = x509_dn_to_st
142b0 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c  ring(label_asn1,
142c0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20   x509_read_ret, 
142d0 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62  (char *) label_b
142e0 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  uf, label_buf_le
142f0 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78  n, "CN");..if (x
14300 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
14310 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64  0) {...x509_read
14320 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74  _ret = x509_dn_t
14330 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61  o_string(label_a
14340 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  sn1, x509_read_r
14350 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62  et, (char *) lab
14360 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75  el_buf, label_bu
14370 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  f_len, NULL);...
14380 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
14390 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65  et <= 0) {....re
143a0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
143b0 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
143c0 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
143d0 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
143e0 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  AX..if (x509_rea
143f0 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53  d_ret > _POSIX_S
14400 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
14410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14420 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74  F("x509_read_ret
14430 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
14440 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
14450 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
14460 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72  ax = %li, x509_r
14470 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c  ead_ret = %lu)",
14480 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
14490 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
144a0 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72  ned long) x509_r
144b0 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ead_ret);....ret
144c0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
144d0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65  ndif.#endif...re
144e0 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72  turn(x509_read_r
144f0 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  et);.}../* Retur
14500 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
14510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
14520 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
14530 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20  e(void **mutex) 
14540 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
14550 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
14560 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
14570 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
14580 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
14590 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
145a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
145b0 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
145c0 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
145d0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
145e0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
145f0 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
14600 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73  mutex = malloc(s
14610 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d  izeof(*pthread_m
14620 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70  utex));...if (!p
14630 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a  thread_mutex) {.
14640 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14650 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
14660 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
14670 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  y.");.....return
14680 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  (-1);...}....pth
14690 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
146a0 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
146b0 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20  (pthread_mutex, 
146c0 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68  NULL);...if (pth
146d0 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
146e0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
146f0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
14700 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29  ead_mutex_init()
14710 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
14720 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
14730 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
14740 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
14750 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64  *mutex = pthread
14760 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20  _mutex;..} else 
14770 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
14780 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29  rgs.CreateMutex)
14790 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
147a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
147b0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75  s.CreateMutex(mu
147c0 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
147d0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
147e0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
147f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14800 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ("cackey_args.Cr
14810 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75  eateMutex() retu
14820 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
14830 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
14840 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
14850 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
14860 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
14870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14880 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
14890 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
148a0 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
148b0 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
148c0 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
148d0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  t cackey_mutex_l
148e0 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
148f0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
14900 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
14910 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
14920 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
14930 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
14940 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14950 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
14960 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
14970 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
14980 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
14990 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
149a0 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
149b0 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
149c0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
149d0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
149e0 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  x_lock(pthread_m
149f0 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
14a00 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
14a10 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
14a20 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
14a30 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29  ead_mutex_lock()
14a40 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
14a50 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
14a60 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
14a70 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
14a80 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
14a90 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
14aa0 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
14ab0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
14ac0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d  args.LockMutex(m
14ad0 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
14ae0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
14af0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
14b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14b10 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  F("cackey_args.L
14b20 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
14b30 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
14b40 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
14b50 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
14b60 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
14b70 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
14b80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
14b90 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
14ba0 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
14bb0 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
14bc0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
14bd0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
14be0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
14bf0 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
14c00 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
14c10 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
14c20 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
14c30 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
14c40 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
14c50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14c60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
14c70 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
14c80 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
14c90 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
14ca0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
14cb0 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
14cc0 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
14cd0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
14ce0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
14cf0 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61  ex_unlock(pthrea
14d00 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
14d10 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
14d20 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
14d30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
14d40 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
14d50 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
14d60 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
14d70 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
14d80 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
14d90 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
14da0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e   (cackey_args.Un
14db0 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  lockMutex) {....
14dc0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
14dd0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
14de0 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
14df0 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
14e00 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
14e10 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
14e20 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
14e30 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
14e40 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
14e50 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
14e60 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
14e70 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
14e80 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
14e90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
14ea0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
14eb0 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
14ec0 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
14ed0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f  );.}..static CK_
14ee0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61  ATTRIBUTE_PTR ca
14ef0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
14f00 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  tes(CK_OBJECT_CL
14f10 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ASS objectclass,
14f20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
14f30 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
14f40 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
14f50 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e   long identity_n
14f60 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  um, CK_ULONG_PTR
14f70 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
14f80 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
14f90 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74  _true = 1;..stat
14fa0 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66  ic CK_BBOOL ck_f
14fb0 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69  alse = 0;..stati
14fc0 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72  c CK_TRUST ck_tr
14fd0 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54  usted = CK_TRUST
14fe0 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43  ED_DELEGATOR;..C
14ff0 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73  K_ULONG numattrs
15000 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75   = 0, retval_cou
15010 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  nt;..CK_ATTRIBUT
15020 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72  E_TYPE curr_attr
15030 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49  _type;..CK_ATTRI
15040 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20  BUTE curr_attr, 
15050 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49  *retval;..CK_VOI
15060 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
15070 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
15080 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43  en;..CK_OBJECT_C
15090 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63  LASS ck_object_c
150a0 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46  lass;..CK_CERTIF
150b0 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65  ICATE_TYPE ck_ce
150c0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
150d0 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f  .CK_KEY_TYPE ck_
150e0 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54  key_type;..CK_UT
150f0 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b  F8CHAR ucTmpBuf[
15100 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74  1024];..SHA1Cont
15110 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d  ext sha1_ctx;..M
15120 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a  D5_CTX md5_ctx;.
15130 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61  .uint8_t sha1_ha
15140 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d  sh[SHA1HashSize]
15150 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68  ;..uint8_t md5_h
15160 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d  ash[MD5HashSize]
15170 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
15180 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
15190 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63  ssize_t certific
151a0 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35  ate_len = -1, x5
151b0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  09_read_ret;..in
151c0 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a  t pValue_free;..
151d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
151e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62  INTF("Called (ob
151f0 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c  jectClass = %lu,
15200 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20   identity_num = 
15210 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
15220 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c  d long) objectcl
15230 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75  ass, identity_nu
15240 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  m);...*pulCount 
15250 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63  = 0;...if (objec
15260 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
15270 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
15280 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
15290 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62  PUBLIC_KEY && ob
152a0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
152b0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
152c0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
152d0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
152e0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
152f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
15300 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
15310 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
15320 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a  object class");.
15330 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
15340 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72  ..}.../* Get Cer
15350 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  t */..if (identi
15360 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
15370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15380 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
15390 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
153a0 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79   invalid identiy
153b0 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09   provided");....
153c0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
153d0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
153e0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
153f0 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
15400 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
15410 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
15420 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
15430 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d  ificate_len == -
15440 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65  1 || certificate
15450 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
15460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15470 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
15480 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
15490 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65  his identity doe
154a0 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e  s not have an X.
154b0 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
154c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
154d0 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  it and will not 
154e0 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72  work");....retur
154f0 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
15500 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72   Verify that cer
15510 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e  tificate is ASN.
15520 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20  1 encoded X.509 
15530 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
15540 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69  if (x509_to_seri
15550 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
15560 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
15570 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09   NULL) < 0) {...
15580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15590 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
155a0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
155b0 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69   the X.509 certi
155c0 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
155d0 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e  d with this iden
155e0 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69  tity is not vali
155f0 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
15600 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ULL);..}...retva
15610 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72  l_count = 64;..r
15620 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72  etval = malloc(r
15630 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
15640 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
15650 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
15660 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f  _type = 0; curr_
15670 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65  attr_type < 0xce
15680 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74  5363bf; curr_att
15690 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66  r_type++) {...if
156a0 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
156b0 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09   == 0x800) {....
156c0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
156d0 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d   0xce536300;...}
156e0 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20  ....pValue_free 
156f0 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20  = 0;...pValue = 
15700 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
15710 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
15720 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  1;....switch (cu
15730 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a  rr_attr_type) {.
15740 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53  ...case CKA_CLAS
15750 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
15760 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
15770 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
15780 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30   CKA_CLASS (0x%0
15790 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
157a0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
157b0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
157c0 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  .ck_object_class
157d0 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a   = objectclass;.
157e0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
157f0 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
15800 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
15810 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63   sizeof(ck_objec
15820 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43  t_class);......C
15830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15840 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
15850 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
15860 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15870 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  ) *((CK_OBJECT_C
15880 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c  LASS *) pValue),
15890 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
158a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
158b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
158c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  ;....case CKA_TO
158d0 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  KEN:.....CACKEY_
158e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
158f0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15900 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78  te CKA_TOKEN (0x
15910 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
15920 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
15930 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
15940 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
15950 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
15960 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
15970 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
15980 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15990 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
159a0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
159b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
159c0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
159d0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
159e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
159f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
15a00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
15a10 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
15a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15a30 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
15a40 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
15a50 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78  PRIVATE (0x%08lx
15a60 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
15a70 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
15a80 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
15a90 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
15aa0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
15ab0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
15ac0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ad0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
15ae0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
15af0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
15b00 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
15b10 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
15b20 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
15b30 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
15b40 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
15b50 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
15b60 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
15b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b80 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
15b90 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
15ba0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
15bb0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
15bc0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
15bd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
15be0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
15bf0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
15c00 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09  KA_TRUSTED:.....
15c10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15c20 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
15c30 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
15c40 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20  USTED (0x%08lx) 
15c50 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
15c60 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
15c70 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
15c80 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
15c90 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
15ca0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
15cb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
15cc0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
15cd0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
15ce0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
15cf0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
15d00 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
15d10 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
15d20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
15d30 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
15d40 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
15d50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15d60 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
15d70 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
15d80 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
15d90 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
15da0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
15db0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
15dc0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
15dd0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
15de0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46  ..case CKA_MODIF
15df0 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  IABLE:.....CACKE
15e00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15e10 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
15e20 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  bute CKA_MODIFIA
15e30 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
15e40 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
15e50 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
15e60 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
15e70 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
15e80 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
15e90 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
15ea0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15eb0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15ec0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
15ed0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15ee0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15ef0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15f00 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15f10 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
15f20 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
15f30 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41  ;....case CKA_LA
15f40 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BEL:.....CACKEY_
15f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15f60 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15f70 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78  te CKA_LABEL (0x
15f80 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
15f90 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
15fa0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
15fb0 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65 72  .../* XXX: Deter
15fc0 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09 09  mine name */....
15fd0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e  .ulValueLen = sn
15fe0 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20  printf((char *) 
15ff0 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66  ucTmpBuf, sizeof
16000 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65  (ucTmpBuf), "Ide
16010 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e  ntity #%lu", (un
16020 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
16030 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09  ntity_num);.....
16040 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75  pValue = ucTmpBu
16050 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56 61  f;......if (ulVa
16060 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66  lueLen >= sizeof
16070 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09  (ucTmpBuf)) {...
16080 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16090 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d  0;......pValue =
160a0 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
160b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
160c0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
160d0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
160e0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
160f0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16100 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16110 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41  ;....case CKA_VA
16120 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  LUE:.....CACKEY_
16130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16140 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
16150 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78  te CKA_VALUE (0x
16160 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
16170 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
16180 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
16190 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63  ...switch (objec
161a0 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63  tclass) {......c
161b0 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f  ase CKO_PRIVATE_
161c0 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  KEY:.......CACKE
161d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
161e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
161f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
16200 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65  we are a private
16210 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09   key.");........
16220 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
16230 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
16240 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  UST:.......CACKE
16250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16260 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
16270 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
16280 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
16290 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
162a0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
162b0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55  .....case CKO_PU
162c0 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09  BLIC_KEY:.......
162d0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
162e0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
162f0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
16300 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65   = x509_to_pubke
16310 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  y(certificate, c
16320 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
16330 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09  &pValue);.......
16340 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
16350 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09  et < 0) { ......
16360 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
16370 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20  ;........} else 
16380 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75  {.........ulValu
16390 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
163a0 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09  _ret;........}..
163b0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72  .....}........br
163c0 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
163d0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  KO_CERTIFICATE:.
163e0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63  ......pValue = c
163f0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09  ertificate;.....
16400 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63  ..ulValueLen = c
16410 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
16420 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
16430 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
16440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
16450 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
16460 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
16470 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
16480 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
16490 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
164a0 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43  KA_ISSUER:.....C
164b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
164c0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
164d0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53  ttribute CKA_ISS
164e0 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UER (0x%08lx) ..
164f0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16500 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
16510 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
16520 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
16530 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
16540 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
16550 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
16560 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
16570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
16580 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
16590 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
165a0 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
165b0 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
165c0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
165d0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
165e0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
165f0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
16600 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
16610 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
16620 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74  9_to_issuer(cert
16630 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
16640 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
16650 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
16660 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
16670 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
16680 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
16690 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
166a0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
166b0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
166c0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
166d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
166e0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
166f0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
16700 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
16710 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
16720 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
16730 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
16740 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
16750 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
16760 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
16770 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
16780 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
16790 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
167a0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
167b0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
167c0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
167d0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
167e0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
167f0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
16800 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
16810 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16820 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
16830 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
16840 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
16850 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70  icate or Netscap
16860 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
16870 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
16880 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
16890 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
168a0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
168b0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
168c0 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
168d0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
168e0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
168f0 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
16900 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
16910 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
16920 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
16930 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
16940 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
16950 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
16960 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
16970 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16980 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
16990 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
169a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
169b0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
169c0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
169d0 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09  KA_SUBJECT:.....
169e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
169f0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
16a00 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55  attribute CKA_SU
16a10 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20  BJECT (0x%08lx) 
16a20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
16a30 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
16a40 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
16a50 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
16a60 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
16a70 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
16a80 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16a90 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
16aa0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
16ab0 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
16ac0 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72  cate");.......br
16ad0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
16ae0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
16af0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
16b00 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
16b10 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
16b20 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
16b30 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
16b40 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
16b50 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
16b60 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
16b70 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
16b80 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
16b90 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
16ba0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
16bb0 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
16bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16bd0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16be0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
16bf0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16c00 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16c10 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
16c20 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09  ase CKA_ID:.....
16c30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16c40 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
16c50 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44  attribute CKA_ID
16c60 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
16c70 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16c80 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
16c90 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
16ca0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
16cb0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
16cc0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16cd0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
16ce0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
16cf0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
16d00 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
16d10 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
16d20 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
16d30 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20  ....ucTmpBuf[0] 
16d40 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d  = ((identity_num
16d50 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78   + 1) >> 8) & 0x
16d60 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66  ff;.....ucTmpBuf
16d70 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79  [1] =  (identity
16d80 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66  _num + 1) & 0xff
16d90 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
16da0 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75  &ucTmpBuf;.....u
16db0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a  lValueLen = 2;..
16dc0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16dd0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
16de0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
16df0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16e00 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16e10 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16e20 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
16e30 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
16e40 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16e50 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
16e60 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
16e70 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
16e80 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
16e90 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16ea0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
16eb0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
16ec0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
16ed0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
16ee0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16ef0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
16f00 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
16f10 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
16f20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
16f30 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  e.");.......brea
16f40 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
16f50 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
16f60 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65   one certificate
16f70 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
16f80 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
16f90 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09   = CKC_X_509;...
16fa0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
16fb0 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
16fc0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
16fd0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72   = sizeof(ck_cer
16fe0 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a  tificate_type);.
16ff0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17000 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
17010 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35  eturning CKC_X_5
17020 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75  09 (%lu) (%p/%lu
17030 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
17040 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46  ng) *((CK_CERTIF
17050 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56  ICATE_TYPE *) pV
17060 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
17070 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17080 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17090 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
170a0 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09  CKA_KEY_TYPE:...
170b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
170c0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
170d0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
170e0 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c  KEY_TYPE (0x%08l
170f0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
17100 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
17110 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
17120 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
17130 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
17140 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
17150 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
17160 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  EY) {......CACKE
17170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17180 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
17190 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
171a0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79  we are not a key
171b0 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
171c0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
171d0 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
171e0 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a  one key type */.
171f0 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20  ....ck_key_type 
17200 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09  = CKK_RSA;......
17210 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79  pValue = &ck_key
17220 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _type;.....ulVal
17230 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
17240 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09  k_key_type);....
17250 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17260 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17270 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25  rning CKK_RSA (%
17280 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
17290 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
172a0 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
172b0 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
172c0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
172d0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
172e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
172f0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
17300 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IGN:.....CACKEY_
17310 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17320 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17330 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25  te CKA_SIGN (0x%
17340 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17350 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17360 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
17370 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17380 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
17390 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
173a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
173b0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
173c0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
173d0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
173e0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
173f0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
17400 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
17410 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
17420 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
17430 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
17440 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
17450 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
17460 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
17470 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
17480 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
17490 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
174a0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
174b0 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
174c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
174d0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
174e0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
174f0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
17500 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
17510 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
17520 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17530 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17540 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17550 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
17560 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43  N_RECOVER:.....C
17570 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17580 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17590 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
175a0 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38  N_RECOVER (0x%08
175b0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
175c0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
175d0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
175e0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
175f0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
17600 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
17610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17620 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
17630 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
17640 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
17650 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
17660 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
17670 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
17680 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  We currently onl
17690 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20  y support "Sign 
176a0 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a  with Appendix" *
176b0 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  /.....pValue = &
176c0 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
176d0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
176e0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
176f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17700 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17710 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
17720 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
17730 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
17740 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
17750 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17760 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17770 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17780 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50  .case CKA_DECRYP
17790 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
177a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
177b0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
177c0 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78   CKA_DECRYPT (0x
177d0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
177e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
177f0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
17800 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17810 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
17820 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
17830 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17840 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17850 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17860 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
17870 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
17880 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
17890 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
178a0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
178b0 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
178c0 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73  EY || objectclas
178d0 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s == CKO_PUBLIC_
178e0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
178f0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
17900 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17910 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
17920 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
17930 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
17940 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
17950 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
17960 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
17970 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
17980 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17990 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
179a0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
179b0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
179c0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
179d0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
179e0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
179f0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
17a00 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
17a10 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41  ENSITIVE:.....CA
17a20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17a30 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
17a40 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53  tribute CKA_SENS
17a50 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29 20  ITIVE (0x%08lx) 
17a60 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
17a70 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
17a80 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
17a90 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
17aa0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
17ab0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
17ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17ad0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
17ae0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
17af0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
17b00 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
17b10 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17b20 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
17b30 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
17b40 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
17b50 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
17b60 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
17b70 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
17b80 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
17b90 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
17ba0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
17bb0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17bc0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
17bd0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
17be0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17bf0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
17c00 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
17c10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17c20 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
17c30 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
17c40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17c50 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
17c60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
17c70 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  se CKA_EXTRACTAB
17c80 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
17c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17ca0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17cb0 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
17cc0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
17cd0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17ce0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17cf0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
17d00 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
17d10 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
17d20 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17d30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17d40 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
17d50 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
17d60 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
17d70 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
17d80 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17d90 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17da0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
17db0 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
17dc0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
17dd0 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
17de0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
17df0 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
17e00 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
17e10 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
17e20 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17e30 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
17e40 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
17e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17e60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
17e70 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
17e80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
17e90 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
17ea0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
17eb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
17ec0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
17ed0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
17ee0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09  KA_MODULUS:.....
17ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17f00 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
17f10 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
17f20 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20  DULUS (0x%08lx) 
17f30 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
17f40 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
17f50 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
17f60 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
17f70 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
17f80 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
17f90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17fa0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
17fb0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
17fc0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
17fd0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
17fe0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17ff0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
18000 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
18010 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
18020 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
18030 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66  o_modulus(certif
18040 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
18050 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
18060 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
18070 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
18080 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
18090 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
180a0 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
180b0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
180c0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
180d0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
180e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
180f0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
18100 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
18110 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18120 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18130 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18140 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
18150 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  NT:.....CACKEY_D
18160 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18170 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18180 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  e CKA_PUBLIC_EXP
18190 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20  ONENT (0x%08lx) 
181a0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
181b0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
181c0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
181d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
181e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
181f0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
18200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18210 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18220 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18230 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
18240 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18250 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18260 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
18270 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
18280 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
18290 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
182a0 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69  o_exponent(certi
182b0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
182c0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
182d0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
182e0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
182f0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
18300 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
18310 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
18320 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
18330 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
18340 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
18350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18360 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
18370 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
18380 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18390 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
183a0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
183b0 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41  CKA_TRUST_DIGITA
183c0 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09  L_SIGNATURE:....
183d0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e  case CKA_TRUST_N
183e0 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a  ON_REPUDIATION:.
183f0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
18400 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45  T_KEY_ENCIPHERME
18410 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
18420 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50  TRUST_DATA_ENCIP
18430 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  HERMENT:....case
18440 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41   CKA_TRUST_KEY_A
18450 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73  GREEMENT:....cas
18460 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
18470 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61  CERT_SIGN:....ca
18480 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c  se CKA_TRUST_CRL
18490 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43  _SIGN:....case C
184a0 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f  KA_TRUST_SERVER_
184b0 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
184c0 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41  A_TRUST_CLIENT_A
184d0 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  UTH:....case CKA
184e0 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e  _TRUST_CODE_SIGN
184f0 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ING:....case CKA
18500 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
18510 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43  TECTION:.....CAC
18520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18530 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
18540 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
18550 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e  _... (0x%08lx) .
18560 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18570 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18580 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
18590 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b  e = &ck_trusted;
185a0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
185b0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73  = sizeof(ck_trus
185c0 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ted);......CACKE
185d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
185e0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
185f0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18600 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18610 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61  (CK_TRUST *) pVa
18620 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18630 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18640 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18650 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18660 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53  KA_CERT_SHA1_HAS
18670 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  H:.....CACKEY_DE
18680 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18690 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
186a0 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
186b0 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASH (0x%08lx) ..
186c0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
186d0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
186e0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
186f0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
18700 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
18710 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
18720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18730 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
18740 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
18750 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61  are not a Netsca
18760 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
18770 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
18780 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52  ....}......SHA1R
18790 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b  eset(&sha1_ctx);
187a0 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28 26  .....SHA1Input(&
187b0 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66  sha1_ctx, certif
187c0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
187d0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41  te_len);.....SHA
187e0 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74  1Result(&sha1_ct
187f0 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a  x, sha1_hash);..
18800 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61  ....pValue = sha
18810 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61  1_hash;.....ulVa
18820 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18830 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09  sha1_hash);.....
18840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18850 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
18860 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
18870 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18880 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18890 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
188a0 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
188b0 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41  MD5_HASH:.....CA
188c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
188d0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
188e0 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
188f0 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30 38  _MD5_HASH (0x%08
18900 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
18910 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18920 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
18930 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18940 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
18950 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
18960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18970 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
18980 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18990 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
189a0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
189b0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
189c0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
189d0 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74  .MD5Init(&md5_ct
189e0 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74  x);.....MD5Updat
189f0 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74  e(&md5_ctx, cert
18a00 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
18a10 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d  cate_len);.....M
18a20 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68  D5Final(md5_hash
18a30 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09  , &md5_ctx);....
18a40 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68  ..pValue = md5_h
18a50 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ash;.....ulValue
18a60 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35  Len = sizeof(md5
18a70 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43  _hash);......CAC
18a80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18a90 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
18aa0 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
18ab0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18ac0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18ad0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
18ae0 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75  fault:.....pValu
18af0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c  e = NULL;.....ul
18b00 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
18b10 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65  ONG) -1;.....bre
18b20 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ak;...}....if ((
18b30 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75  (CK_LONG) ulValu
18b40 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f  eLen) != ((CK_LO
18b50 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a  NG) -1)) {..../*
18b60 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20   Push curr_attr 
18b70 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a  onto the stack *
18b80 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74  /....curr_attr.t
18b90 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f  ype = curr_attr_
18ba0 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74  type;....curr_at
18bb0 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  tr.ulValueLen = 
18bc0 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
18bd0 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65  curr_attr.pValue
18be0 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61   = malloc(curr_a
18bf0 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ttr.ulValueLen);
18c00 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
18c10 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61  attr.pValue, pVa
18c20 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75  lue, curr_attr.u
18c30 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18c40 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20  if (pValue_free 
18c50 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
18c60 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09  .free(pValue);..
18c70 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61  ..}.....if (numa
18c80 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63  ttrs >= retval_c
18c90 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76  ount) {.....retv
18ca0 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
18cb0 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
18cc0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
18cd0 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  al));....}.....m
18ce0 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75  emcpy(&retval[nu
18cf0 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61  mattrs], &curr_a
18d00 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  ttr, sizeof(curr
18d10 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61  _attr));....numa
18d20 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  ttrs++;...}..}..
18d30 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d  .if (numattrs !=
18d40 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63   0) {...retval_c
18d50 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
18d60 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
18d70 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
18d80 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
18d90 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20  f(*retval));..} 
18da0 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65  else {...free(re
18db0 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
18dc0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70   = NULL;..}...*p
18dd0 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  ulCount = numatt
18de0 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  rs;...CACKEY_DEB
18df0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
18e00 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73  ning %lu objects
18e10 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72   (%p).", numattr
18e20 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74 76  s, (void *) retv
18e30 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
18e40 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
18e50 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
18e60 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  e_identities(str
18e70 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
18e80 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c  ity *identities,
18e90 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
18ea0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
18eb0 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
18ec0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e   *curr_attr;..un
18ed0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69  signed long id_i
18ee0 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09  dx, attr_idx;...
18ef0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d  if (identities =
18f00 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69  = NULL || identi
18f10 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29  ties_count == 0)
18f20 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
18f30 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20  ..for (id_idx = 
18f40 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e  0; id_idx < iden
18f50 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64  tities_count; id
18f60 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28  _idx++) {...if (
18f70 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
18f80 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
18f90 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64  ....for (attr_id
18fa0 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20  x = 0; attr_idx 
18fb0 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  < identities[id_
18fc0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
18fd0 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  count; attr_idx+
18fe0 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74  +) {.....curr_at
18ff0 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73  tr = &identities
19000 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
19010 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  tes[attr_idx];..
19020 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
19030 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  r->pValue) {....
19040 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72  ..free(curr_attr
19050 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d  ->pValue);.....}
19060 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64  ....}.....if (id
19070 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19080 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09  .attributes) {..
19090 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69  ...free(identiti
190a0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
190b0 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09  butes);....}....
190c0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
190d0 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ts(identities[id
190e0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
190f0 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a  ity, 1, 1);...}.
19100 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69  .}...free(identi
19110 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ties);.}..static
19120 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63   unsigned long c
19130 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
19140 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74  dentities(struct
19150 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
19160 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e   *identities, un
19170 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
19180 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e  dod_certs) {..un
19190 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74  signed long cert
191a0 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20 30  _idx, id_idx = 0
191b0 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
191c0 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
191d0 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63  return(num_dod_c
191e0 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09  erts * 3);..}...
191f0 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20  for (cert_idx = 
19200 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75  0; cert_idx < nu
19210 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72  m_dod_certs; cer
19220 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65  t_idx++) {...ide
19230 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19240 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
19250 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
19260 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
19270 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
19280 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
19290 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20 26  O_CERTIFICATE, &
192a0 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
192b0 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
192c0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
192d0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
192e0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
192f0 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09  ...id_idx++;....
19300 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19310 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
19320 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74   = NULL;...ident
19330 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
19340 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
19350 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
19360 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c  (CKO_PUBLIC_KEY,
19370 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
19380 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
19390 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
193a0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
193b0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
193c0 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a  );...id_idx++;..
193d0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
193e0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
193f0 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
19400 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19410 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
19420 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
19430 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  es(CKO_NETSCAPE_
19440 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65  TRUST, &extra_ce
19450 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
19460 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
19470 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
19480 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
19490 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
194a0 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  x++;..}...return
194b0 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  (id_idx);.}..sta
194c0 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
194d0 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  y_identity *cack
194e0 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
194f0 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
19500 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
19510 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f  igned long *ids_
19520 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74  found) {..struct
19530 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
19540 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
19550 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20  tities;..struct 
19560 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
19570 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  *identities;..un
19580 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
19590 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72  ids, id_idx, cur
195a0 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69  r_id_type;..unsi
195b0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
195c0 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  rts, num_dod_cer
195d0 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69  ts, cert_idx;..i
195e0 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  nt include_extra
195f0 5f 63 65 72 74 73 20 3d 20 30 3b 0a 0a 09 43 41  _certs = 0;...CA
19600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19610 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
19620 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d  if (ids_found ==
19630 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
19640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19650 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e  Error.  ids_foun
19660 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  d is NULL");....
19670 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
19680 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
19690 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44  CARD_SLOT_INCLUD
196a0 45 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69  E_EXTRA_CERTS..i
196b0 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
196c0 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  ts = 1;.#endif..
196d0 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
196e0 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e  KEY_DOD_CERTS_ON
196f0 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e  _HW_SLOTS") != N
19700 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
19710 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31  _extra_certs = 1
19720 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e  ;..}...if (geten
19730 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44  v("CACKEY_NO_DOD
19740 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f  _CERTS_ON_HW_SLO
19750 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
19760 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
19770 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  certs = 0;..}...
19780 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
19790 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54  EY_NO_EXTRA_CERT
197a0 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
197b0 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d  .num_dod_certs =
197c0 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   0;..} else {...
197d0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  num_dod_certs = 
197e0 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72  sizeof(extra_cer
197f0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78 74  ts) / sizeof(ext
19800 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d  ra_certs[0]);..}
19810 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74  ...if (slot->int
19820 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69  ernal) {...num_i
19830 64 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  ds = cackey_read
19840 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
19850 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  NULL, num_dod_ce
19860 72 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d  rts);....if (num
19870 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ids != 0) {....
19880 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c  identities = mal
19890 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69  loc(num_ids * si
198a0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
198b0 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72  ));.....cackey_r
198c0 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
198d0 65 73 28 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  es(identities, n
198e0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09  um_dod_certs);..
198f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 64 65  .} else {....ide
19900 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
19910 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e  ..}....*ids_foun
19920 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09  d = num_ids;....
19930 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65  return(identitie
19940 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64  s);..}...pcsc_id
19950 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
19960 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f  y_read_certs(slo
19970 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65  t, NULL, &num_ce
19980 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  rts);..if (pcsc_
19990 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
199a0 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65  LL) {.../* Conve
199b0 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72  rt number of Cer
199c0 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20  ts to number of 
199d0 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d  objects */...num
199e0 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56  _ids = (CKO_PRIV
199f0 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45  ATE_KEY - CKO_CE
19a00 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a  RTIFICATE + 1) *
19a10 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69   num_certs;....i
19a20 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  f (include_extra
19a30 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d  _certs) {....num
19a40 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72  _ids += cackey_r
19a50 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
19a60 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64  es(NULL, num_dod
19a70 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09  _certs);...}....
19a80 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c  identities = mal
19a90 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69  loc(num_ids * si
19aa0 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
19ab0 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65  ));..../* Add ce
19ac0 72 74 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c  rtificates, publ
19ad0 69 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69  ic keys, and pri
19ae0 76 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74  vate keys from t
19af0 68 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a  he smartcard */.
19b00 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09  ..id_idx = 0;...
19b10 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20  for (cert_idx = 
19b20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75  0; cert_idx < nu
19b30 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64  m_certs; cert_id
19b40 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63  x++) {....for (c
19b50 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b  urr_id_type = CK
19b60 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20 63  O_CERTIFICATE; c
19b70 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43  urr_id_type <= C
19b80 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20  KO_PRIVATE_KEY; 
19b90 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20  curr_id_type++) 
19ba0 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  {.....identities
19bb0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
19bc0 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
19bd0 5f 61 74 74 72 69 62 75 74 65 73 28 63 75 72 72  _attributes(curr
19be0 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f  _id_type, &pcsc_
19bf0 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
19c00 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20  idx], cert_idx, 
19c10 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
19c20 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
19c30 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e  ount);......iden
19c40 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
19c50 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d  csc_identity = m
19c60 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64  alloc(sizeof(*id
19c70 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19c80 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
19c90 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
19ca0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19cb0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26  pcsc_identity, &
19cc0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
19cd0 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f  cert_idx], sizeo
19ce0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
19cf0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
19d00 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e  ity));......iden
19d10 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
19d20 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
19d30 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
19d40 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  oc(pcsc_identiti
19d50 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
19d60 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
19d70 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69  ...memcpy(identi
19d80 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
19d90 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
19da0 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
19db0 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
19dc0 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  x].certificate, 
19dd0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
19de0 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66  cert_idx].certif
19df0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
19e00 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a  .id_idx++;....}.
19e10 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75  ..}....if (inclu
19e20 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20  de_extra_certs) 
19e30 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
19e40 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64  G_PRINTF("Includ
19e50 69 6e 67 20 55 53 20 47 6f 76 65 72 6e 6d 65 6e  ing US Governmen
19e60 74 20 43 65 72 74 69 66 69 63 61 74 65 73 20 6f  t Certificates o
19e70 6e 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 22  n hardware slot"
19e80 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
19e90 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
19ea0 73 28 69 64 65 6e 74 69 74 69 65 73 20 2b 20 69  s(identities + i
19eb0 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63  d_idx, num_dod_c
19ec0 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  erts);...}....ca
19ed0 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
19ee0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
19ef0 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
19f00 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20  ...*ids_found = 
19f10 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75  num_ids;....retu
19f20 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
19f30 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64  .}....*ids_found
19f40 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55   = 0;..return(NU
19f50 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  LL);.}..CK_DEFIN
19f60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
19f70 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28  , C_Initialize)(
19f80 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69  CK_VOID_PTR pIni
19f90 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49  tArgs) {..CK_C_I
19fa0 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43  NITIALIZE_ARGS C
19fb0 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e  K_PTR args;..uin
19fc0 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67 68 65  t32_t idx, highe
19fd0 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75  st_slot;..int mu
19fe0 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09  tex_init_ret;...
19ff0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a000 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1a010 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69  ..if (cackey_ini
1a020 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1a030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a040 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61  F("Error.  Alrea
1a050 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  dy initialized."
1a060 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a070 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44  _CRYPTOKI_ALREAD
1a080 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  Y_INITIALIZED);.
1a090 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72  .}...if (pInitAr
1a0a0 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  gs != NULL) {...
1a0b0 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73  args = pInitArgs
1a0c0 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b  ;...memcpy(&cack
1a0d0 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73  ey_args, args, s
1a0e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67  izeof(cackey_arg
1a0f0 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73  s));....if (args
1a100 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d  ->CreateMutex ==
1a110 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
1a120 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e  estroyMutex == N
1a130 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
1a140 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  kMutex == NULL |
1a150 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
1a160 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex == NULL) {..
1a170 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
1a180 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  teMutex != NULL 
1a190 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
1a1a0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
1a1b0 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
1a1c0 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
1a1d0 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d  ->UnlockMutex !=
1a1e0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43   NULL) {.....CAC
1a1f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a200 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62  ("Error. Some, b
1a210 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61  ut not All threa
1a220 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  ding primitives 
1a230 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09  provided.");....
1a240 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1a250 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09  UMENTS_BAD);....
1a260 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  }...}..} else {.
1a270 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ..cackey_args.Cr
1a280 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  eateMutex = NULL
1a290 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
1a2a0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e  DestroyMutex = N
1a2b0 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
1a2c0 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e  gs.LockMutex = N
1a2d0 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
1a2e0 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  gs.UnlockMutex =
1a2f0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1a300 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  args.flags = 0;.
1a310 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
1a320 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1a330 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1a340 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1a350 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
1a360 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b   idx++) {...cack
1a370 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1a380 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  .active = 0;..}.
1a390 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1a3a0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1a3b0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1a3c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1a3d0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1a3e0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1a3f0 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  idx].active = 0;
1a400 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1a410 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
1a420 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
1a430 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
1a440 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
1a450 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1a460 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
1a470 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
1a480 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1a490 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72  lots[idx].slot_r
1a4a0 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  eset = 0;...cack
1a4b0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f  ey_slots[idx].to
1a4c0 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
1a4d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1a4e0 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  x].label = NULL;
1a4f0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1a500 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  idx].internal = 
1a510 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  0;..}...if (gete
1a520 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
1a530 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1a540 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1a550 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73  DEBUG_PRINTF("As
1a560 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75  ked not to inclu
1a570 64 65 20 44 6f 44 20 63 65 72 74 69 66 69 63 61  de DoD certifica
1a580 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  tes");..} else {
1a590 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20  ...highest_slot 
1a5a0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1a5b0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1a5c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1a5d0 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45  )) - 1;....CACKE
1a5e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a5f0 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65  Including DoD ce
1a600 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22  rts in slot %lu"
1a610 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a620 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b  ) highest_slot);
1a630 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1a640 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61  [highest_slot].a
1a650 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63  ctive = 1;...cac
1a660 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1a670 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  t_slot].internal
1a680 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
1a690 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1a6a0 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69  t].label = (unsi
1a6b0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55 53  gned char *) "US
1a6c0 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74   Government Cert
1a6d0 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63  ificates";...cac
1a6e0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1a6f0 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  t_slot].pcsc_rea
1a700 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  der = "CACKey";.
1a710 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1a720 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b  ighest_slot].tok
1a730 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  en_flags = 0;..}
1a740 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  ...cackey_initia
1a750 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20  lized = 1;...if 
1a760 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  (!cackey_biglock
1a770 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78  _init) {...mutex
1a780 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b  _init_ret = cack
1a790 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
1a7a0 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  &cackey_biglock)
1a7b0 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69  ;....if (mutex_i
1a7c0 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
1a7d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a7e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a7f0 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  Mutex initializa
1a800 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a  tion failed.");.
1a810 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1a820 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a  ANT_LOCK);...}..
1a830 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  ..cackey_biglock
1a840 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09  _init = 1;..}...
1a850 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a860 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1a870 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1a880 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1a890 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1a8a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1a8b0 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29  _RV, C_Finalize)
1a8c0 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65  (CK_VOID_PTR pRe
1a8d0 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33  served) {..uint3
1a8e0 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
1a8f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a900 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a910 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
1a920 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1a930 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a940 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
1a950 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
1a960 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1a970 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1a980 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1a990 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1a9a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a9b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1a9c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1a9d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1a9e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1a9f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  LIZED);..}...for
1aa00 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1aa10 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1aa20 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1aa30 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1aa40 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
1aa50 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
1aa60 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1aa70 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73  ive) {....C_Clos
1aa80 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
1aa90 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  .}..}...cackey_s
1aaa0 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
1aab0 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64  all();...for (id
1aac0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
1aad0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1aae0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1aaf0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
1ab00 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
1ab10 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1ab20 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63  internal) {....c
1ab30 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
1ab40 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1ab50 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
1ab60 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  r) {....free(cac
1ab70 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1ab80 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d  csc_reader);...}
1ab90 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1aba0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1abb0 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63  _certs) {....cac
1abc0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63  key_free_certs(c
1abd0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1abe0 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63  .cached_certs, c
1abf0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1ac00 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  .cached_certs_co
1ac10 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63  unt, 1);.....cac
1ac20 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63  key_slots[idx].c
1ac30 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55  ached_certs = NU
1ac40 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  LL;...}..}...cac
1ac50 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
1ac60 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  ect();...cackey_
1ac70 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
1ac80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ac90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1aca0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1acb0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1acc0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1acd0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1ace0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66  (CK_RV, C_GetInf
1acf0 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70  o)(CK_INFO_PTR p
1ad00 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1ad10 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
1ad20 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
1ad30 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
1ad40 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
1ad50 38 43 48 41 52 20 6c 69 62 72 61 72 79 44 65 73  8CHAR libraryDes
1ad60 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41  cription[] = "CA
1ad70 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f  CKey";...CACKEY_
1ad80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1ad90 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1ada0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
1adb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1adc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
1add0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
1ade0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1adf0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1ae00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1ae10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1ae20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ae30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1ae40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1ae50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1ae60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1ae70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70  IALIZED);..}...p
1ae80 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65  Info->cryptokiVe
1ae90 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28  rsion.major = ((
1aea0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
1aeb0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
1aec0 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
1aed0 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72  nfo->cryptokiVer
1aee0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43  sion.minor = ((C
1aef0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
1af00 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
1af10 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d  8) & 0xff;...mem
1af20 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
1af30 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
1af40 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1af50 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
1af60 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1af70 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d  anufacturerID, m
1af80 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73  anufacturerID, s
1af90 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72  izeof(manufactur
1afa0 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49  erID) - 1);...pI
1afb0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30  nfo->flags = 0x0
1afc0 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  0;...memset(pInf
1afd0 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
1afe0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
1aff0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  of(pInfo->librar
1b000 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  yDescription));.
1b010 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
1b020 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1b030 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  n, libraryDescri
1b040 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69  ption, sizeof(li
1b050 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1b060 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
1b070 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
1b080 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
1b090 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1b0a0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1b0b0 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
1b0c0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
1b0d0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1b0e0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1b0f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b100 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1b110 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1b120 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1b130 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  KR_OK);.}../*. *
1b140 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66   Process list of
1b150 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72   readers, and cr
1b160 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74  eate mapping bet
1b170 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65  ween reader name
1b180 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f   and slot ID. */
1b190 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b1a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1b1b0 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f  SlotList)(CK_BBO
1b1c0 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c  OL tokenPresent,
1b1d0 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
1b1e0 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c  pSlotList, CK_UL
1b1f0 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
1b200 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20  ) {..static int 
1b210 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a  first_call = 1;.
1b220 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1b230 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  l;..int pcsc_con
1b240 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c  nect_ret;..CK_UL
1b250 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  ONG count, slot_
1b260 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73  count = 0, currs
1b270 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09  lot, slot_idx;..
1b280 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
1b290 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72  rs, *pcsc_reader
1b2a0 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65  s_s, *pcsc_reade
1b2b0 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 73  rs_e;..DWORD pcs
1b2c0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09  c_readers_len;..
1b2d0 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72  LONG scard_listr
1b2e0 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a  eaders_ret;..siz
1b2f0 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f  e_t curr_reader_
1b300 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72  len;..int slot_r
1b310 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  eset;...CACKEY_D
1b320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1b330 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75  led.");...if (pu
1b340 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
1b350 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b360 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b370 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
1b380 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b390 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1b3a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1b3b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b3c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b3d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b3e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b3f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b400 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b410 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b420 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1b430 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1b440 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1b450 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1b460 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1b470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b480 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1b490 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1b4a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b4b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1b4c0 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69  .}.../* Clear li
1b4d0 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09  st of slots */..
1b4e0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
1b4f0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
1b500 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61  {...if (first_ca
1b510 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63  ll) {....first_c
1b520 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f  all = 0;.....slo
1b530 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d  t_reset = 1;...}
1b540 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..../* If any of
1b550 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20   the slots have 
1b560 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20  been reset then 
1b570 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  purge all inform
1b580 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20  ation and check 
1b590 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28  again */...for (
1b5a0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1b5b0 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1b5c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1b5d0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1b5e0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1b5f0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  lot++) {....if (
1b600 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1b610 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1b620 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1b630 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
1b640 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1b650 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1b660 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1b670 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65  .}.....if (cacke
1b680 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1b690 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
1b6a0 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ....slot_reset =
1b6b0 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a   1;......break;.
1b6c0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1b6d0 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1b6e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b6f0 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c  INTF("Purging al
1b700 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  l slot informati
1b710 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e  on.");...../* On
1b720 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
1b730 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
1b740 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
1b750 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
1b760 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
1b770 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c   */....cackey_sl
1b780 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
1b790 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63  ll();.....for (c
1b7a0 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
1b7b0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1b7c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1b7d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b7e0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
1b7f0 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  ot++) {.....if (
1b800 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1b810 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1b820 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65   {......continue
1b830 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1b840 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1b850 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1b860 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65  der) {......free
1b870 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1b880 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1b890 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b  der);.......cack
1b8a0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1b8b0 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1b8c0 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
1b8d0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1b8e0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1b8f0 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  el) {......free(
1b900 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1b910 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a  rslot].label);..
1b920 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1b930 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1b940 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  l = NULL;.....}.
1b950 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1b960 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1b970 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  ve = 0;....}...}
1b980 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a   else {.......}.
1b990 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
1b9a0 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
1b9b0 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
1b9c0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
1b9d0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
1b9e0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
1b9f0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
1ba00 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
1ba10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ba20 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
1ba30 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20  o PC/SC failed, 
1ba40 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74  assuming no slot
1ba50 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75  s");....slot_cou
1ba60 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  nt = 0;..} else 
1ba70 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  {...pcsc_readers
1ba80 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61  _len = 0;....sca
1ba90 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1baa0 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
1bab0 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
1bac0 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
1bad0 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61   NULL, &pcsc_rea
1bae0 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  ders_len);....if
1baf0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
1bb00 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
1bb10 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b  _F_COMM_ERROR) {
1bb20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1bb30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bb40 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1bb50 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
1bb60 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20  D_F_COMM_ERROR, 
1bb70 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74  assuming Connect
1bb80 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e  ion to PC/SC wen
1bb90 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63  t away. Reconnec
1bba0 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63  ting.");.....cac
1bbb0 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
1bbc0 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79  ect();....cackey
1bbd0 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
1bbe0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1bbf0 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67  G_PRINTF("Trying
1bc00 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1bc10 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09  s() again");....
1bc20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1bc30 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
1bc40 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
1bc50 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
1bc60 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
1bc70 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
1bc80 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  }....if (scard_l
1bc90 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1bca0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
1bcb0 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72  S && pcsc_reader
1bcc0 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  s_len != 0) {...
1bcd0 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20  .pcsc_readers = 
1bce0 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64  malloc(pcsc_read
1bcf0 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73  ers_len);....pcs
1bd00 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63  c_readers_s = pc
1bd10 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09  sc_readers;.....
1bd20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1bd30 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
1bd40 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
1bd50 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
1bd60 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  LL, pcsc_readers
1bd70 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
1bd80 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61  len);....if (sca
1bd90 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1bda0 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
1bdb0 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73  CCESS) {.....pcs
1bdc0 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63  c_readers_e = pc
1bdd0 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73  sc_readers + pcs
1bde0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a  c_readers_len;..
1bdf0 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74  ..../* Start wit
1be00 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20  h Slot ID 1, to 
1be10 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47  avoid a bug in G
1be20 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09  DM on RHEL */...
1be30 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
1be40 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
1be50 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
1be60 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
1be70 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73  911 */.....currs
1be80 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f  lot = 1;.....slo
1be90 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  t_count = 0;....
1bea0 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61  .while (pcsc_rea
1beb0 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64  ders < pcsc_read
1bec0 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a  ers_e) {....../*
1bed0 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 6c   Find next avail
1bee0 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09  able slot */....
1bef0 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f  ..for (; currslo
1bf00 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1bf10 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1bf20 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1bf30 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
1bf40 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63  ) {.......if (!c
1bf50 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1bf60 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1bf70 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1bf80 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09  ....}......}....
1bf90 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  ...curr_reader_l
1bfa0 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63  en = strlen(pcsc
1bfb0 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09  _readers);......
1bfc0 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 65  .if ((pcsc_reade
1bfd0 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72  rs + curr_reader
1bfe0 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61  _len) > pcsc_rea
1bff0 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09  ders_e) {.......
1c000 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
1c010 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 61  ....if (curr_rea
1c020 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  der_len == 0) {.
1c030 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c040 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
1c050 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f  rrslot >= (sizeo
1c060 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1c070 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1c080 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1c090 09 09 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 46 6f 75 6e 64 20 6d  _PRINTF("Found m
1c0b0 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61 6e  ore readers than
1c0c0 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c   slots are avail
1c0d0 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09  able!");........
1c0e0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
1c0f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c100 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72  _PRINTF("Found r
1c110 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63 73 63  eader: %s", pcsc
1c120 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09  _readers);......
1c130 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
1c140 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
1c150 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
1c160 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64  ally being asked
1c170 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
1c180 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1c190 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
1c1a0 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  st) {.......if (
1c1b0 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1c1c0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1c1d0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1c1e0 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63  ve = 1;........c
1c1f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1c200 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  slot].internal =
1c210 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
1c220 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1c230 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1c240 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64  strdup(pcsc_read
1c250 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63  ers);........cac
1c260 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c270 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot].pcsc_card_co
1c280 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09  nnected = 0;....
1c290 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1c2a0 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73  [currslot].trans
1c2b0 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
1c2c0 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1c2d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1c2e0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
1c2f0 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
1c300 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1c310 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65  s[currslot].toke
1c320 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
1c330 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09  GIN_REQUIRED;...
1c340 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1c350 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1c360 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  l = NULL;.......
1c370 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
1c380 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79  ot_reset(&cackey
1c390 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c3a0 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  );.......}......
1c3b0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 2f  } else {......./
1c3c0 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69  * Artificially i
1c3d0 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62  ncrease the numb
1c3e0 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f  er of active slo
1c3f0 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20  ts by what will 
1c400 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f  become active */
1c410 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e  .......slot_coun
1c420 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  t++;......}.....
1c430 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09  .currslot++;....
1c440 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
1c450 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
1c460 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  en + 1;.....}...
1c470 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
1c480 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
1c490 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1c4a0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1c4b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1c4c0 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1c4d0 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
1c4e0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c4f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
1c500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c510 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69  INTF("Found acti
1c520 76 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75  ve slot %lu", (u
1c530 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1c540 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09  rrslot);........
1c550 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09  slot_count++;...
1c560 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20  ...}.....}....} 
1c570 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
1c580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c590 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
1c5a0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
1c5b0 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
1c5c0 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
1c5d0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
1c5e0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
1c5f0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
1c600 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
1c610 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
1c620 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
1c630 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
1c640 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
1c650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c660 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
1c670 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1c680 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
1c690 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
1c6a0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
1c6b0 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
1c6c0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1c6d0 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
1c6e0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1c6f0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
1c700 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1c710 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1c720 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c730 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1c740 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1c750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c760 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1c770 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1c780 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1c790 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1c7a0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
1c7b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
1c7c0 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
1c7d0 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
1c7e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1c7f0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1c800 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65  ).  Found %lu re
1c810 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73  aders, but not s
1c820 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f  toring IDs (pSlo
1c830 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c  tList == NULL)",
1c840 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e   CKR_OK, (unsign
1c850 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f  ed long) slot_co
1c860 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
1c870 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f  CKR_OK);..}...co
1c880 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b  unt = *pulCount;
1c890 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c  ..if (count < sl
1c8a0 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41  ot_count) {...CA
1c8b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c8c0 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61  F("Error. User a
1c8d0 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74  llocated %lu ent
1c8e0 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76  ries, but we hav
1c8f0 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c  e %lu entries.",
1c900 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75   count, slot_cou
1c910 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  nt);....CACKEY_D
1c920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c930 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
1c940 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a  R_TOO_SMALL");..
1c950 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
1c960 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09  FER_TOO_SMALL);.
1c970 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1c980 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1c990 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1c9a0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1c9b0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1c9c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c9d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c9e0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1c9f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ca00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1ca10 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20  ;..}...slot_idx 
1ca20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73  = 0;..for (currs
1ca30 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c  lot = 0; (currsl
1ca40 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
1ca50 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1ca60 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ca70 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74  [0]))); currslot
1ca80 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63  ++) {...if (!cac
1ca90 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1caa0 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  ot].active) {...
1cab0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1cac0 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e  ..if (slot_idx >
1cad0 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  = count) {....CA
1cae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1caf0 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61  F("Error. User a
1cb00 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74  llocated %lu ent
1cb10 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73  ries, but we jus
1cb20 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 74 65  t tried to write
1cb30 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65   to the %lu inde
1cb40 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20  x -- ignoring", 
1cb50 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29  count, slot_idx)
1cb60 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
1cb70 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74  ..}....pSlotList
1cb80 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72  [slot_idx] = cur
1cb90 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64  rslot;...slot_id
1cba0 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  x++;..}...mutex_
1cbb0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1cbc0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1cbd0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1cbe0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1cbf0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1cc00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cc10 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1cc20 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1cc30 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1cc40 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a  L_ERROR);..}...*
1cc50 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
1cc60 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  count;...CACKEY_
1cc70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1cc80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1cc90 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
1cca0 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f  readers.", CKR_O
1ccb0 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  K, (unsigned lon
1ccc0 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a  g) slot_count);.
1ccd0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1cce0 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74  ;...tokenPresent
1ccf0 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b   = tokenPresent;
1cd00 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
1cd10 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
1cd20 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
1cd30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1cd40 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66  RV, C_GetSlotInf
1cd50 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
1cd60 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e  otID, CK_SLOT_IN
1cd70 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1cd80 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1cd90 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74  HAR slotDescript
1cda0 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20  ion[] = "CACKey 
1cdb0 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65  Slot";..int mute
1cdc0 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62  x_retval;..int b
1cdd0 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09  ytes_to_copy;...
1cde0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cdf0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1ce00 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
1ce10 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1ce20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ce30 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
1ce40 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1ce50 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1ce60 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1ce70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1ce80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1ce90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cea0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1ceb0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1cec0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1ced0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1cee0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
1cef0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1cf00 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1cf10 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1cf20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1cf30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1cf40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cf50 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1cf60 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1cf70 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1cf80 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1cf90 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1cfa0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1cfb0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1cfc0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1cfd0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1cfe0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1cff0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1d000 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d010 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d020 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1d030 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d040 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1d050 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1d060 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1d070 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1d080 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d0a0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1d0b0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1d0c0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1d0d0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1d0e0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1d0f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1d100 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1d110 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1d120 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1d130 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1d140 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66  KF_HW_SLOT;...if
1d150 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
1d160 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c  slotID].internal
1d170 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
1d180 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41  gs |= CKF_REMOVA
1d190 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a  BLE_DEVICE;..}..
1d1a0 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
1d1b0 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
1d1c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
1d1d0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
1d1e0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
1d1f0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
1d200 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52   |= CKF_TOKEN_PR
1d210 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65  ESENT;..}...byte
1d220 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c  s_to_copy = strl
1d230 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  en(cackey_slots[
1d240 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61  slotID].pcsc_rea
1d250 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f  der);..if (sizeo
1d260 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1d270 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73  turerID) < bytes
1d280 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79  _to_copy) {...by
1d290 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69  tes_to_copy = si
1d2a0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1d2b0 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a  facturerID);..}.
1d2c0 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1d2d0 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63  anufacturerID, c
1d2e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1d2f0 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c  ID].pcsc_reader,
1d300 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
1d310 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1d320 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1d330 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1d340 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1d350 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1d360 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d370 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d380 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1d390 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d3a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1d3b0 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
1d3c0 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
1d3d0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
1d3e0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
1d3f0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
1d400 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
1d410 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
1d420 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
1d430 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
1d440 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
1d450 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
1d460 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
1d470 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1d480 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
1d490 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
1d4a0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1d4b0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
1d4c0 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
1d4d0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
1d4e0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
1d4f0 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
1d500 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
1d510 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
1d520 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
1d530 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
1d540 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1d550 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1d560 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0x00;...CACKEY_D
1d570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1d580 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1d590 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1d5a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1d5b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1d5c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1d5d0 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f  etTokenInfo)(CK_
1d5e0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
1d5f0 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54  CK_TOKEN_INFO_PT
1d600 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1d610 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1d620 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
1d630 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
1d640 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
1d650 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74  UTF8CHAR default
1d660 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f  Label[] = "Unkno
1d670 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74  wn Token";..stat
1d680 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1d690 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f  odel[] = "CAC To
1d6a0 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61  ken";..struct ca
1d6b0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
1d6c0 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
1d6d0 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
1d6e0 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
1d6f0 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65  ssize_t label_re
1d700 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
1d710 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64  tval;..int use_d
1d720 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09  efault_label;...
1d730 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d740 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d750 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
1d760 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1d770 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d780 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
1d790 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1d7a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1d7b0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1d7c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1d7d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1d7e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d7f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1d800 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1d810 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1d820 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1d830 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
1d840 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1d850 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1d860 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1d870 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1d880 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1d890 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d8a0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1d8b0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1d8c0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1d8d0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1d8e0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1d8f0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1d900 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1d910 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1d920 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1d930 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1d940 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1d950 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d960 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d970 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1d980 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d990 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1d9a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1d9b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1d9c0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1d9d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d9f0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1da00 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1da10 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1da20 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1da30 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1da40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1da50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1da60 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1da70 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1da80 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
1da90 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
1daa0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
1dab0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
1dac0 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
1dad0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dae0 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e  PRINTF("No token
1daf0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73   is present in s
1db00 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c  lotID = %lu", sl
1db10 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1db20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1db30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1db40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
1db50 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b  EN_NOT_PRESENT);
1db60 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1db70 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1db80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1db90 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1dba0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1dbb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dbc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dbd0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1dbe0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1dbf0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1dc00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  ROR);..}.../* De
1dc10 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61  termine token la
1dc20 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69  bel from certifi
1dc30 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74  cates */..memset
1dc40 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27  (pInfo->label, '
1dc50 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1dc60 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f  ->label));..use_
1dc70 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
1dc80 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  1;...if (cackey_
1dc90 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1dca0 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel == NULL) {..
1dcb0 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  .pcsc_identities
1dcc0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63   = cackey_read_c
1dcd0 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  erts(&cackey_slo
1dce0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c  ts[slotID], NULL
1dcf0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
1dd00 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
1dd10 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
1dd20 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ...if (num_certs
1dd30 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65   > 0) {.....labe
1dd40 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  l_ret = cackey_p
1dd50 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
1dd60 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74  label(pcsc_ident
1dd70 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61  ities, pInfo->la
1dd80 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
1dd90 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  o->label));.....
1dda0 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20  if (label_ret > 
1ddb0 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65  0) {......use_de
1ddc0 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b  fault_label = 0;
1ddd0 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1dde0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1ddf0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
1de00 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
1de10 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63  ;.......memcpy(c
1de20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1de30 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f  ID].label, pInfo
1de40 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ->label, sizeof(
1de50 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
1de60 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63  ....}....}.....c
1de70 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1de80 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1de90 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
1dea0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
1deb0 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
1dec0 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  abel, cackey_slo
1ded0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1dee0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1def0 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f  label));....use_
1df00 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
1df10 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f  0;..}...if (use_
1df20 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b  default_label) {
1df30 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ...memcpy(pInfo-
1df40 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c  >label, defaultL
1df50 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66  abel, sizeof(def
1df60 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b  aultLabel) - 1);
1df70 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
1df80 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1df90 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1dfa0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1dfb0 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
1dfc0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1dfd0 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
1dfe0 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
1dff0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
1e000 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
1e010 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c  nfo->model, ' ',
1e020 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1e030 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28  odel));..memcpy(
1e040 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f  pInfo->model, mo
1e050 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65  del, sizeof(mode
1e060 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  l) - 1);...memse
1e070 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  t(pInfo->serialN
1e080 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65  umber, ' ', size
1e090 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  of(pInfo->serial
1e0a0 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73  Number));...mems
1e0b0 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  et(pInfo->utcTim
1e0c0 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  e, ' ', sizeof(p
1e0d0 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b  Info->utcTime));
1e0e0 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
1e0f0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1e100 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
1e110 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
1e120 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
1e130 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
1e140 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
1e150 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
1e160 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
1e170 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
1e180 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
1e190 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1e1a0 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1e1b0 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0x00;...pInfo->f
1e1c0 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45  lags = CKF_WRITE
1e1d0 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46  _PROTECTED | CKF
1e1e0 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41  _USER_PIN_INITIA
1e1f0 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45  LIZED | CKF_TOKE
1e200 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
1e210 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1e220 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1e230 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ;...pInfo->ulMax
1e240 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28  SessionCount = (
1e250 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e260 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1e270 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1e280 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66  [0])) - 1;..pInf
1e290 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e  o->ulSessionCoun
1e2a0 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
1e2b0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1e2c0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53  .pInfo->ulMaxRwS
1e2d0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b  essionCount = 0;
1e2e0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73  ..pInfo->ulRwSes
1e2f0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
1e300 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1e310 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1e320 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32  ulMaxPinLen = 12
1e330 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  8;..pInfo->ulMin
1e340 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e  PinLen = 0;..pIn
1e350 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69  fo->ulTotalPubli
1e360 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  cMemory = CK_UNA
1e370 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1e380 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
1e390 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79  FreePublicMemory
1e3a0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1e3b0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1e3c0 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72  pInfo->ulTotalPr
1e3d0 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b  ivateMemory = CK
1e3e0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1e3f0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
1e400 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d  ->ulFreePrivateM
1e410 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
1e420 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
1e430 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ON;...CACKEY_DEB
1e440 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1e450 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1e460 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1e470 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1e480 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1e490 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69  ION(CK_RV, C_Wai
1e4a0 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43  tForSlotEvent)(C
1e4b0 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
1e4c0 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
1e4d0 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50  lotID, CK_VOID_P
1e4e0 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a  TR pReserved) {.
1e4f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e500 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e510 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64  ...if (pReserved
1e520 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1e530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e540 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72  F("Error. pReser
1e550 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ved is not NULL.
1e560 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e570 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1e580 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1e590 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1e5a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e5b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e5c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1e5d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e5e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1e5f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1e600 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a  .../* XXX: TODO:
1e610 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e   Implement this.
1e620 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45  .. */..CACKEY_DE
1e630 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1e640 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1e650 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e660 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1e670 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e680 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1e690 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e6a0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1e6b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1e6c0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63  (CK_RV, C_GetMec
1e6d0 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53  hanismList)(CK_S
1e6e0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1e6f0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45  K_MECHANISM_TYPE
1e700 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c  _PTR pMechanismL
1e710 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ist, CK_ULONG_PT
1e720 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  R pulCount) {..C
1e730 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e740 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e750 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1e760 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1e770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e780 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1e790 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1e7a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1e7b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1e7c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1e7d0 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  (pulCount == NUL
1e7e0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1e7f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e800 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  r.  pulCount is 
1e810 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1e820 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1e830 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1e840 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d  pMechanismList =
1e850 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
1e860 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41  Count = 1;....CA
1e870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e880 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e890 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1e8a0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
1e8b0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
1e8c0 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b  *pulCount < 1) {
1e8d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e8e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e8f0 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c  Buffer too small
1e900 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e910 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1e920 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68  ALL);..}...pMech
1e930 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43  anismList[0] = C
1e940 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70  KM_RSA_PKCS;..*p
1e950 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43  ulCount = 1;...C
1e960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e970 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e980 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1e990 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1e9a0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1e9b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1e9c0 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  RV, C_GetMechani
1e9d0 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  smInfo)(CK_SLOT_
1e9e0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45  ID slotID, CK_ME
1e9f0 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70  CHANISM_TYPE typ
1ea00 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  e, CK_MECHANISM_
1ea10 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
1ea20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
1ea30 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1ea40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ea50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
1ea60 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
1ea70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ea80 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
1ea90 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
1eaa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1eab0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1eac0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1ead0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1eae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eaf0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1eb00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1eb10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1eb20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1eb30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1eb40 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
1eb50 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
1eb60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1eb70 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1eb80 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
1eb90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eba0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1ebb0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1ebc0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
1ebd0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
1ebe0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
1ebf0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1ec00 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1ec10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1ec20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1ec30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1ec40 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1ec50 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1ec60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ec70 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1ec80 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1ec90 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1eca0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1ecb0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1ecc0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
1ecd0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1ece0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ecf0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1ed00 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1ed10 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
1ed20 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
1ed30 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1ed40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1ed50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1ed60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ed70 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1ed80 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1ed90 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1eda0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1edb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1edc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1edd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ede0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1edf0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1ee00 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ee10 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ee20 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
1ee30 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61  ch (type) {...ca
1ee40 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
1ee50 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  ....pInfo->ulMin
1ee60 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09  KeySize = 512;..
1ee70 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65  ..pInfo->ulMaxKe
1ee80 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09  ySize = 8192;...
1ee90 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1eea0 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43  CKF_HW | CKF_ENC
1eeb0 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59  RYPT | CKF_DECRY
1eec0 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20  PT | CKF_SIGN | 
1eed0 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62  CKF_VERIFY;....b
1eee0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  reak;..}...CACKE
1eef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ef00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1ef10 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1ef20 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1ef30 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
1ef40 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
1ef50 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
1ef60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ef70 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29  RV, C_InitToken)
1ef80 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
1ef90 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  ID, CK_UTF8CHAR_
1efa0 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
1efb0 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f  NG ulPinLen, CK_
1efc0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61  UTF8CHAR_PTR pLa
1efd0 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  bel) {..CACKEY_D
1efe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1eff0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1f000 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f010 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1f020 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f030 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f040 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f050 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f060 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f070 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1f080 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1f090 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
1f0a0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
1f0b0 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
1f0c0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
1f0d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
1f0e0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1f0f0 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  CTED);.}../* We 
1f100 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
1f110 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
1f120 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1f130 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49  (CK_RV, C_InitPI
1f140 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  N)(CK_SESSION_HA
1f150 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1f160 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
1f170 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
1f180 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
1f190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f1a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1f1b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1f1c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1f1d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f1e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1f1f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1f200 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1f210 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1f220 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1f230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1f240 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45  turning CKR_TOKE
1f250 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
1f260 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b  D (%i)", CKR_TOK
1f270 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
1f280 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1f290 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1f2a0 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  OTECTED);.}../* 
1f2b0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
1f2c0 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
1f2d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1f2e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
1f2f0 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  PIN)(CK_SESSION_
1f300 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1f310 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
1f320 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f   pOldPin, CK_ULO
1f330 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20  NG ulOldPinLen, 
1f340 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
1f350 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  pNewPin, CK_ULON
1f360 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b  G ulNewPinLen) {
1f370 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f380 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f390 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1f3a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1f3b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f3c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1f3d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1f3e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f3f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1f400 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1f410 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f420 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1f430 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f440 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1f450 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f460 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1f470 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1f480 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f490 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1f4a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f4b0 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28   C_OpenSession)(
1f4c0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1f4d0 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  D, CK_FLAGS flag
1f4e0 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  s, CK_VOID_PTR p
1f4f0 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f  Application, CK_
1f500 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43  NOTIFY notify, C
1f510 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1f520 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20  _PTR phSession) 
1f530 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
1f540 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
1f550 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f  _retval;..int fo
1f560 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b  und_session = 0;
1f570 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f580 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f590 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20  );...if ((flags 
1f5a0 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  & CKF_SERIAL_SES
1f5b0 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52  SION) != CKF_SER
1f5c0 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09  IAL_SESSION) {..
1f5d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1f5e0 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54  ION_PARALLEL_NOT
1f5f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a  _SUPPORTED);..}.
1f600 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f610 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f630 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f640 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f650 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f660 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f670 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1f680 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1f690 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1f6a0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1f6b0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1f6c0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1f6d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f6e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1f6f0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1f700 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1f710 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1f720 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1f730 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1f740 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1f750 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1f760 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1f770 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f780 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1f790 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1f7a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f7b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1f7c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1f7d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1f7e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1f7f0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f800 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1f810 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1f820 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f830 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1f840 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1f850 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1f860 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1f870 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1f880 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f890 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f8a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f8b0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1f8c0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
1f8d0 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20  y that the card 
1f8e0 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74  is actually in t
1f8f0 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20  he slot. */../* 
1f900 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61  XXX: Check to ma
1f910 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
1f920 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73  in the PKCS#11 s
1f930 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a  pecification */.
1f940 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
1f950 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
1f960 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
1f970 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1f980 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
1f990 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f9a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f9b0 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e   Card not presen
1f9c0 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b  t.  Returning CK
1f9d0 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
1f9e0 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
1f9f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1fa00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1fa10 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45  eturn(CKR_DEVICE
1fa20 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09  _REMOVED);..}...
1fa30 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64  for (idx = 1; id
1fa40 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1fa50 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1fa60 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1fa70 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
1fa80 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
1fa90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1faa0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f  .active) {....fo
1fab0 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b  und_session = 1;
1fac0 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20  .....*phSession 
1fad0 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65  = idx;.....cacke
1fae0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1faf0 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63  active = 1;....c
1fb00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1fb10 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f  dx].slotID = slo
1fb20 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  tID;....cackey_s
1fb30 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61  essions[idx].sta
1fb40 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
1fb50 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63  IC_SESSION;....c
1fb60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1fb70 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67  dx].flags = flag
1fb80 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  s;....cackey_ses
1fb90 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76  sions[idx].ulDev
1fba0 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09  iceError = 0;...
1fbb0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1fbc0 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69  [idx].pApplicati
1fbd0 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f  on = pApplicatio
1fbe0 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  n;....cackey_ses
1fbf0 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66  sions[idx].Notif
1fc00 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09  y = notify;.....
1fc10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1fc20 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
1fc30 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
1fc40 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1fc50 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1fc60 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
1fc70 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
1fc80 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30  earch_active = 0
1fc90 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1fca0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f  sions[idx].sign_
1fcb0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
1fcc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1fcd0 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  idx].decrypt_act
1fce0 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
1fcf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1fd00 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
1fd10 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
1fd20 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
1fd30 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
1fd40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1fd50 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
1fd60 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b  unt);......break
1fd70 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
1fd80 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1fd90 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1fda0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1fdb0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1fdc0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1fdd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fde0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1fdf0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1fe00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1fe10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1fe20 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69  if (!found_sessi
1fe30 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  on) {...CACKEY_D
1fe40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1fe50 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49  urning CKR_SESSI
1fe60 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20  ON_COUNT (%i)", 
1fe70 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
1fe80 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  T);....return(CK
1fe90 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
1fea0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1feb0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1fec0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1fed0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1fee0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1fef0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1ff00 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
1ff10 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  oseSession)(CK_S
1ff20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1ff30 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
1ff40 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1ff50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff60 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1ff70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1ff80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1ff90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ffa0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1ffb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1ffc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1ffd0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1ffe0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1fff0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
20000 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
20010 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
20020 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
20030 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20040 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
20050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20060 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
20070 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
20080 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
20090 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
200a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
200b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
200c0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
200d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
200e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
200f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20110 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
20120 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20130 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20140 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20150 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
20160 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
20170 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
20180 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20190 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
201a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
201b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
201c0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
201d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
201e0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
201f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
20200 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
20210 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
20220 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tive = 0;..cacke
20230 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
20240 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s(cackey_session
20250 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
20260 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73  tities, cackey_s
20270 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20280 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
20290 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  nt);...mutex_ret
202a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
202b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
202c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
202d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
202e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
202f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20300 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
20310 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
20320 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
20330 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
20340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20350 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20360 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20370 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
20380 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
20390 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
203a0 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
203b0 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ons)(CK_SLOT_ID 
203c0 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33  slotID) {..uint3
203d0 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  2_t idx;..int mu
203e0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
203f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20400 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20410 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20420 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20440 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20450 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20460 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20470 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20480 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
20490 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
204a0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
204b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
204c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
204d0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
204e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
204f0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
20500 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
20510 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
20520 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
20530 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
20540 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
20550 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
20560 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
20570 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
20580 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20590 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
205a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
205b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
205c0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
205d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
205e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
205f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20600 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
20610 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
20620 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
20630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20640 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
20650 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
20660 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
20670 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
20680 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
20690 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
206a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
206b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
206c0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
206d0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
206e0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
206f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
20700 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
20710 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
20720 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
20730 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
20740 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
20750 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
20760 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
20770 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a  ID != slotID) {.
20780 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
20790 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  .}.....cackey_mu
207a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
207b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43  y_biglock);....C
207c0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
207d0 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  x);....cackey_mu
207e0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
207f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d  biglock);...}..}
20800 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
20810 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
20820 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
20830 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
20840 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
20850 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20860 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20870 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
20880 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20890 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
208a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
208b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
208c0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
208d0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
208e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
208f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20900 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
20910 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43  etSessionInfo)(C
20920 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20930 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45   hSession, CK_SE
20940 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  SSION_INFO_PTR p
20950 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
20960 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
20970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20980 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20990 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
209a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
209b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
209c0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
209d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
209e0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
209f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
20a00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
20a10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20a20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20a30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
20a40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20a50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
20a60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
20a70 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
20a80 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
20a90 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
20aa0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
20ab0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
20ac0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
20ad0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20ae0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
20af0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
20b00 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
20b10 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
20b20 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
20b30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
20b40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20b50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20b60 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20b70 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20b80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20b90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20ba0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20bb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20bc0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20bd0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
20be0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20bf0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
20c00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
20c10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20c20 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
20c30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20c40 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
20c50 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
20c60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20c70 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20c80 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ID);..}...pInfo-
20c90 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  >slotID = cackey
20ca0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20cb0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e  on].slotID;..pIn
20cc0 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b  fo->state = cack
20cd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20ce0 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49  sion].state;..pI
20cf0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63  nfo->flags = cac
20d00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20d10 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70  ssion].flags;..p
20d20 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72  Info->ulDeviceEr
20d30 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ror = cackey_ses
20d40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20d50 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a  ulDeviceError;..
20d60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
20d70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
20d80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20d90 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
20da0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20db0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20dc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
20dd0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
20de0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20df0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
20e00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
20e10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20e20 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
20e30 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
20e40 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
20e50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
20e60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
20e70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
20e80 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
20e90 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
20ea0 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
20eb0 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
20ec0 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69  G_PTR pulOperati
20ed0 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43  onStateLen) {..C
20ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20ef0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
20f00 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20f10 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20f20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20f30 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20f40 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20f50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20f60 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20f70 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
20f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20f90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20fa0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20fb0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
20fc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20fd0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
20fe0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
20ff0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
21000 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
21010 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21020 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
21030 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
21040 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
21050 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
21060 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
21070 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e  LONG ulOperation
21080 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a  StateLen, CK_OBJ
21090 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72  ECT_HANDLE hEncr
210a0 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42  yptionKey, CK_OB
210b0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74  JECT_HANDLE hAut
210c0 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20  henticationKey) 
210d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
210e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
210f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21100 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21110 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21120 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21130 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21140 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21150 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21160 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21180 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21190 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
211a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
211b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
211c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
211d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
211e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
211f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
21200 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21210 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45  , C_Login)(CK_SE
21220 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21230 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54  ssion, CK_USER_T
21240 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b  YPE userType, CK
21250 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
21260 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
21270 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f  inLen) {..CK_SLO
21280 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e  T_ID slotID;..in
21290 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
212a0 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
212b0 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  ning;..int login
212c0 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
212d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
212e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
212f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21300 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21310 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21320 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21330 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21340 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21350 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21360 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
21370 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
21380 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
21390 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
213a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
213b0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
213c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
213d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
213e0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
213f0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
21400 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
21410 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
21420 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
21430 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
21440 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21450 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21460 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
21470 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
21480 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
21490 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
214a0 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
214b0 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
214c0 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
214d0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
214e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
214f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21500 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21510 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21520 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21530 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
21540 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21560 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21570 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
21580 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21590 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
215a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
215b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
215c0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
215d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
215e0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
215f0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
21600 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
21610 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
21620 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ID);..}...slotID
21630 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
21640 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
21650 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
21660 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21670 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21680 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21690 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
216a0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
216b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
216c0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
216d0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
216e0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
216f0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21700 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21710 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21720 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21730 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21740 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
21750 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21760 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21770 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21780 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
21790 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
217a0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
217b0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
217c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
217d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
217e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
217f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  RROR);..}...logi
21800 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
21810 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
21820 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e  ts[slotID], pPin
21830 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69  , ulPinLen, &tri
21840 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09  es_remaining);..
21850 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d  if (login_ret !=
21860 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
21870 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  K) {...cackey_mu
21880 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21890 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
218a0 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
218b0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
218c0 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CKED) {....CACKE
218d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
218e0 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73  Error.  Token is
218f0 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09   locked.");.....
21900 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21910 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
21920 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
21930 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74  _LOCKED;.....ret
21940 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  urn(CKR_PIN_LOCK
21950 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  ED);...} else if
21960 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
21970 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
21980 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  PIN) {....CACKEY
21990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
219a0 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50  rror.  Invalid P
219b0 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  IN.");.....cacke
219c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
219d0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
219e0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
219f0 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74  T_LOW;.....if (t
21a00 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
21a10 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  = 1) {.....cacke
21a20 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
21a30 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
21a40 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
21a50 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
21a60 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
21a70 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a  NCORRECT);...}..
21a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
21aa0 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74  nknown error ret
21ab0 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65  urned from cacke
21ac0 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c  y_login() (%i)",
21ad0 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09   login_ret);....
21ae0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21af0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21b00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21b10 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
21b20 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50   &= ~(CKF_USER_P
21b30 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f  IN_LOCKED | CKF_
21b40 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
21b50 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  OW | CKF_LOGIN_R
21b60 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53  EQUIRED | CKF_US
21b70 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59  ER_PIN_FINAL_TRY
21b80 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  );...cackey_sess
21b90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21ba0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53  tate = CKS_RO_US
21bb0 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09  ER_FUNCTIONS;...
21bc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21bd0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21be0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21bf0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
21c00 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
21c10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21c20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
21c30 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21c40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21c50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21c60 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21c70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21c80 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
21c90 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
21ca0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
21cb0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21cc0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f  ON(CK_RV, C_Logo
21cd0 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ut)(CK_SESSION_H
21ce0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
21cf0 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
21d00 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78  otID;..int mutex
21d10 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
21d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21d30 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21d40 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21d50 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21d70 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21d80 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21d90 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21da0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21db0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
21dc0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
21dd0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
21de0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
21df0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
21e00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
21e10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21e20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21e30 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
21e40 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
21e50 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
21e60 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
21e70 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
21e80 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21e90 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21ea0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21eb0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21ec0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21ee0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21ef0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21f00 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21f10 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
21f20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21f30 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
21f40 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
21f50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21f60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
21f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21f80 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
21f90 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
21fa0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
21fb0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
21fc0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
21fd0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
21fe0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21ff0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
22000 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
22010 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
22020 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
22030 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
22040 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
22050 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22060 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
22070 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
22080 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
22090 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
220a0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
220b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
220c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
220d0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
220e0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
220f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22110 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
22120 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
22130 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
22140 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
22150 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
22160 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22170 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
22180 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22190 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
221a0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
221b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
221c0 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
221d0 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b  C_SESSION;..cack
221e0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
221f0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  .token_flags = C
22200 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
22210 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  D;...mutex_retva
22220 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22230 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22240 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22250 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22260 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22270 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22280 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
22290 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
222a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
222b0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
222c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
222d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
222e0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
222f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
22300 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22310 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22320 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43  _CreateObject)(C
22330 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22340 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
22350 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
22360 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
22370 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
22380 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
22390 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
223a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
223b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
223c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
223d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
223e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
223f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
22400 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
22410 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
22420 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
22430 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
22440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22450 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
22460 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22470 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
22480 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22490 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
224a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
224b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
224c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
224d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79  ON(CK_RV, C_Copy
224e0 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
224f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22500 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
22510 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
22520 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
22530 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
22540 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
22550 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
22560 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a   phNewObject) {.
22570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22580 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
22590 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
225a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
225b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
225c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
225d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
225e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
225f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
22600 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
22610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22620 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22630 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22640 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
22650 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22660 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
22670 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
22680 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22690 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
226a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
226b0 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29  C_DestroyObject)
226c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
226d0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
226e0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
226f0 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
22700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22710 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
22720 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22730 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22750 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22760 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22770 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22780 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22790 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
227a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
227b0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
227c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
227d0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
227e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
227f0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
22800 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22810 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
22820 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22830 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62  N(CK_RV, C_GetOb
22840 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53  jectSize)(CK_SES
22850 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
22860 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
22870 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
22880 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
22890 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f  Size) {..CACKEY_
228a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
228b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
228c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
228d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
228e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
228f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22900 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22910 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22920 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22930 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22940 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22950 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
22960 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22970 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
22980 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22990 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
229a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
229b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
229c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
229d0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74  (CK_RV, C_GetAtt
229e0 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
229f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22a00 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
22a10 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
22a20 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
22a30 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
22a40 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
22a50 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
22a60 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74   *curr_attr;..st
22a70 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
22a80 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a  tity *identity;.
22a90 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
22aa0 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74  dentity_idx, att
22ab0 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
22ac0 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09  _idx, num_ids;..
22ad0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22ae0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
22af0 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f  = CKR_OK;..CK_VO
22b00 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
22b10 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
22b20 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  Len;...CACKEY_DE
22b30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22b40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22b50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22b60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22b70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22b80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22b90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22ba0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22bb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22bc0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
22bd0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
22be0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
22bf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
22c00 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
22c10 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
22c20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22c30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
22c40 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
22c50 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
22c60 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
22c70 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
22c80 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63  ..}...if (hObjec
22c90 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
22ca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22cb0 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
22cc0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
22cd0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
22ce0 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
22cf0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22d00 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74  .}...if (ulCount
22d10 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
22d20 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
22d30 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
22d40 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
22d50 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
22d60 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43  mediately */...C
22d70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22d80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22d90 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
22da0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
22db0 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
22dc0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
22dd0 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55  (pTemplate == NU
22de0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
22df0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22e00 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  or.  pTemplate i
22e10 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
22e20 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
22e30 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64  TS_BAD);..}...id
22e40 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62  entity_idx = hOb
22e50 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65  ject - 1;...mute
22e60 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22e70 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
22e80 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
22e90 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
22ea0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
22eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22ec0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
22ed0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22ee0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22ef0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
22f00 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
22f10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
22f20 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
22f30 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22f40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
22f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22f60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
22f70 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
22f80 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
22f90 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
22fa0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
22fb0 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b  ..num_ids = cack
22fc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22fd0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
22fe0 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64  _count;...if (id
22ff0 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75  entity_idx >= nu
23000 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65  m_ids) {...cacke
23010 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23020 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23030 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23040 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23050 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75  Object handle ou
23060 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65  t of range.  ide
23070 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c  ntity_idx = %lu,
23080 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22   num_ids = %lu."
23090 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
230a0 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  ) identity_idx, 
230b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
230c0 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74  num_ids);....ret
230d0 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
230e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
230f0 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20  .}...identity = 
23100 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
23110 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
23120 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69  ities[identity_i
23130 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72  dx];...for (attr
23140 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69  _idx = 0; attr_i
23150 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74  dx < ulCount; at
23160 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  tr_idx++) {...cu
23170 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70  rr_attr = &pTemp
23180 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  late[attr_idx];.
23190 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
231a0 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ;...ulValueLen =
231b0 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
231c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
231d0 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66  RINTF("Looking f
231e0 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25  or attribute 0x%
231f0 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25  08lx (identity:%
23200 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lu) ...", (unsig
23210 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
23220 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69  ttr->type, (unsi
23230 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
23240 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72  ity_idx);....for
23250 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
23260 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
23270 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61  dx < identity->a
23280 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
23290 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
232a0 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74  ) {....if (ident
232b0 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
232c0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74  sess_attr_idx].t
232d0 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72  ype == curr_attr
232e0 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41  ->type) {.....CA
232f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23300 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74  F(" ... found it
23310 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75  , pValue = %p, u
23320 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22  lValueLen = %lu"
23330 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
23340 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
23350 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64  _idx].pValue, id
23360 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
23370 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
23380 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
23390 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  ........pValue =
233a0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
233b0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
233c0 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09  idx].pValue;....
233d0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64  .ulValueLen = id
233e0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
233f0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
23400 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ].ulValueLen;...
23410 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75  .}...}....if (cu
23420 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20  rr_attr->pValue 
23430 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
23440 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75  if (curr_attr->u
23450 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56  lValueLen >= ulV
23460 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d  alueLen) {.....m
23470 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d  emcpy(curr_attr-
23480 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  >pValue, pValue,
23490 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09   ulValueLen);...
234a0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c  .} else {.....ul
234b0 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
234c0 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65  ONG) -1;......re
234d0 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
234e0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
234f0 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74  }...}....curr_at
23500 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  tr->ulValueLen =
23510 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a   ulValueLen;..}.
23520 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
23530 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
23540 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23550 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
23560 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
23570 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23580 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
23590 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
235a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
235b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
235c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61  ;..}...if (retva
235d0 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55  l == CKR_ATTRIBU
235e0 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  TE_TYPE_INVALID)
235f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23600 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23610 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54  ing CKR_ATTRIBUT
23620 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28  E_TYPE_INVALID (
23630 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
23640 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
23650 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42  (retval == CKR_B
23660 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
23670 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23680 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23690 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
236a0 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20  OO_SMALL (%i)", 
236b0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
236c0 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61  } else if (retva
236d0 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l == CKR_OK) {..
236e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
236f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23700 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69  CKR_OK (%i)", (i
23710 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
23720 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f  else {...CACKEY_
23730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23740 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
23750 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  t) retval);..}..
23760 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
23770 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
23780 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23790 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
237a0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
237b0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
237c0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
237d0 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
237e0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
237f0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
23800 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
23810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23820 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23830 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23840 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23860 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23870 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23880 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23890 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
238a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
238b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
238c0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
238d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
238e0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
238f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23900 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
23910 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23920 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
23930 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
23940 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
23950 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53  bjectsInit)(CK_S
23960 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23970 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49  ession, CK_ATTRI
23980 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
23990 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
239a0 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  ount) {..CK_SLOT
239b0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
239c0 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
239d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
239e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
239f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23a00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
23a10 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
23a20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23a30 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
23a40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
23a50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
23a60 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
23a70 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
23a80 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
23a90 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
23aa0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23ab0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
23ac0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23ad0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
23ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23af0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
23b00 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
23b10 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23b20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
23b30 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
23b40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
23b50 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
23b60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23b70 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
23b80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
23b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23ba0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
23bb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
23bc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
23bd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
23be0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
23bf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
23c00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
23c10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23c20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23c30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23c40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23c50 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
23c60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
23c70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
23c80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
23c90 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23ca0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23cb0 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
23cc0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
23cd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23ce0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
23cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23d00 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
23d10 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  h already active
23d20 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
23d30 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
23d40 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  CTIVE);..}...slo
23d50 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
23d60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23d70 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
23d80 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
23d90 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
23da0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
23db0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
23dc0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
23dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23de0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
23df0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
23e00 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
23e10 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
23e20 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
23e30 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23e40 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
23e50 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23e60 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
23e70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23e80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23e90 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
23ea0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
23eb0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
23ec0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
23ed0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
23ee0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23ef0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
23f00 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
23f10 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
23f20 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
23f30 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73  slotID].slot_res
23f40 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  et) {...CACKEY_D
23f50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65  EBUG_PRINTF("The
23f60 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72   slot has been r
23f70 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61  eset since we la
23f80 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64  st looked for id
23f90 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63  entities -- resc
23fa0 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20  anning");....if 
23fb0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23fc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
23fd0 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
23fe0 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
23ff0 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
24000 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24010 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
24020 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
24030 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
24040 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
24050 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24060 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
24070 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09  tities = NULL;..
24080 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24090 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
240a0 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
240b0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
240c0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
240d0 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29  ].label != NULL)
240e0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
240f0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
24100 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65  label);....cacke
24110 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
24120 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
24130 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  }....cackey_mark
24140 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63  _slot_reset(&cac
24150 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
24160 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ]);...cackey_slo
24170 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
24180 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  reset = 0;..}...
24190 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
241a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
241b0 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
241c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
241d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
241e0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
241f0 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
24200 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
24210 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
24220 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24230 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
24240 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66  _count);..}...if
24250 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e   (pTemplate != N
24260 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43  ULL) {...if (ulC
24270 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
24280 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24290 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
242a0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75  _query_count = u
242b0 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65  lCount;....cacke
242c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
242d0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
242e0 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75  y = malloc(ulCou
242f0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
24300 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65  mplate));.....me
24310 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
24320 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24330 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65  earch_query, pTe
24340 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20  mplate, ulCount 
24350 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c  * sizeof(*pTempl
24360 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69  ate));....for (i
24370 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c  dx = 0; idx < ul
24380 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  Count; idx++) {.
24390 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74  ....if (pTemplat
243a0 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  e[idx].ulValueLe
243b0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63  n == 0) {......c
243c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
243d0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
243e0 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
243f0 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
24400 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
24410 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
24420 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24430 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
24440 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
24450 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e  (pTemplate[idx].
24460 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
24470 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
24480 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24490 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
244a0 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  ].pValue) {.....
244b0 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
244c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
244d0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
244e0 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d  dx].pValue, pTem
244f0 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75  plate[idx].pValu
24500 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  e, pTemplate[idx
24510 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
24520 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  ...}....}...} el
24530 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  se {....cackey_s
24540 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24550 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
24560 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63  ount = 0;....cac
24570 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24580 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
24590 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ery = NULL;...}.
245a0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
245b0 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
245c0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
245d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
245e0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
245f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24600 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
24610 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20  query specified 
24620 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d  as NULL, but num
24630 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72  ber of query ter
24640 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ms not specified
24650 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65   as 0.");.....re
24660 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24670 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09  TS_BAD);...}....
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 73 65 61 72 63 68  hSession].search
246a0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
246b0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
246c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
246d0 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c  arch_query = NUL
246e0 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  L;..}...cackey_s
246f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24700 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
24710 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 1;..cackey_ses
24720 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24730 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
24740 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   0;...mutex_retv
24750 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
24760 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
24770 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
24780 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
24790 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
247a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
247b0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
247c0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
247d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
247e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
247f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24800 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
24810 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
24820 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
24830 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
24840 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63   cackey_pkcs11_c
24850 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
24860 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  s(CK_ATTRIBUTE *
24870 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20  a, CK_ATTRIBUTE 
24880 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  *b) {..unsigned 
24890 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20  char *smallbuf, 
248a0 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65  *largebuf;..size
248b0 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c  _t smallbuf_len,
248c0 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a   largebuf_len;..
248d0 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20  .if (a->type != 
248e0 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74  b->type) {...ret
248f0 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43  urn(0);..}...CAC
24900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24910 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20  ("    ... found 
24920 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e  matching type ..
24930 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
24940 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
24950 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a    ... our value:
24960 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d  ", a->pValue, a-
24970 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  >ulValueLen);...
24980 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d  if (b->pValue ==
24990 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
249a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
249b0 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
249c0 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22   wildcard match"
249d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
249e0 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61  ..}...if (a->pVa
249f0 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lue == NULL) {..
24a00 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
24a10 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65   .if (b->ulValue
24a20 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75  Len == a->ulValu
24a30 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61  eLen && memcmp(a
24a40 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61  ->pValue, b->pVa
24a50 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  lue, b->ulValueL
24a60 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  en) == 0) {...CA
24a70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24a80 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
24a90 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22  und exact match"
24aa0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
24ab0 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d  ..}...switch (a-
24ac0 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  >type) {...case 
24ad0 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
24ae0 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (a->ulValueLe
24af0 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  n == b->ulValueL
24b00 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
24b10 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d  ....}.....if (a-
24b20 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d  >ulValueLen > b-
24b30 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09  >ulValueLen) {..
24b40 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d  ...smallbuf = b-
24b50 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61  >pValue;.....sma
24b60 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75  llbuf_len = b->u
24b70 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
24b80 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56  largebuf = a->pV
24b90 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62  alue;.....largeb
24ba0 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
24bb0 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73  lueLen;....} els
24bc0 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  e {.....smallbuf
24bd0 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
24be0 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d  ..smallbuf_len =
24bf0 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
24c00 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20  .....largebuf = 
24c10 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c  b->pValue;.....l
24c20 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  argebuf_len = b-
24c30 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  >ulValueLen;....
24c40 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72  }.....for (; lar
24c50 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61  gebuf_len != sma
24c60 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65  llbuf_len; large
24c70 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c  buf++,largebuf_l
24c80 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28  en--) {.....if (
24c90 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30  largebuf[0] != 0
24ca0 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
24cb0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
24cc0 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  f (largebuf_len 
24cd0 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29  != smallbuf_len)
24ce0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
24cf0 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d  .}.....if (memcm
24d00 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c  p(largebuf, smal
24d10 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c  lbuf, smallbuf_l
24d20 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  en) == 0) {.....
24d30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24d40 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
24d50 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74  found approximat
24d60 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  e match");......
24d70 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a  return(1);....}.
24d80 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
24d90 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b  return(0);.}..CK
24da0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
24db0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
24dc0 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f  jects)(CK_SESSIO
24dd0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24de0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
24df0 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
24e00 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78  , CK_ULONG ulMax
24e10 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f  ObjectCount, CK_
24e20 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a  ULONG_PTR pulObj
24e30 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72  ectCount) {..str
24e40 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
24e50 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43  ity *curr_id;..C
24e60 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
24e70 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e  r_attr;..CK_ULON
24e80 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63  G curr_id_idx, c
24e90 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20  urr_out_id_idx, 
24ea0 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73  curr_attr_idx, s
24eb0 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43  ess_attr_idx;..C
24ec0 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f  K_ULONG matched_
24ed0 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63  count, prev_matc
24ee0 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  hed_count;..int 
24ef0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69  mutex_retval;.#i
24f00 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
24f10 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
24f20 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76  ST..struct timev
24f30 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09  al start, end;..
24f40 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69  uint64_t start_i
24f50 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e  nt, end_int;.#en
24f60 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
24f70 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24f80 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24f90 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24fa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24fb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24fc0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24fd0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24fe0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24ff0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
25000 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
25010 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
25020 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25030 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25040 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
25050 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
25060 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
25070 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
25080 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
25090 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
250a0 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
250b0 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
250c0 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
250d0 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
250e0 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
250f0 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
25100 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
25110 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
25120 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25130 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
25140 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
25150 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
25160 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
25170 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
25180 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
25190 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
251a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
251b0 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
251c0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
251d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
251e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
251f0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
25200 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
25210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25220 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
25230 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
25240 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
25250 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
25260 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
25270 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
25280 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
25290 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
252a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
252b0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
252c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
252d0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
252e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
252f0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
25300 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
25310 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
25320 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
25330 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
25340 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
25350 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
25360 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
25370 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
25380 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
25390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
253a0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
253b0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
253c0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
253d0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
253e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
253f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
25400 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
25410 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25420 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
25430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25440 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
25450 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
25460 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
25470 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
25480 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
25490 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
254a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
254b0 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
254c0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
254d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
254e0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
254f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25500 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
25510 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
25520 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
25530 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
25540 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69  IALIZED);..}..#i
25550 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
25560 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
25570 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
25580 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a  (&start, NULL);.
25590 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75  #endif...curr_ou
255a0 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66  t_id_idx = 0;..f
255b0 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20  or (curr_id_idx 
255c0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
255d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
255e0 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72  ch_curr_id; curr
255f0 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  _id_idx < cackey
25600 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25610 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
25620 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a  ount && ulMaxObj
25630 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69  ectCount; curr_i
25640 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  d_idx++) {...cur
25650 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73  r_id = &cackey_s
25660 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25670 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72  ].identities[cur
25680 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41  r_id_idx];....CA
25690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
256a0 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64  F("Processing id
256b0 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e  entity:%lu", (un
256c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
256d0 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61  r_id_idx);....ma
256e0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b  tched_count = 0;
256f0 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ....for (curr_at
25700 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72  tr_idx = 0; curr
25710 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b  _attr_idx < cack
25720 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25730 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
25740 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61  ry_count; curr_a
25750 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
25760 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
25770 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  nt = matched_cou
25780 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  nt;.....curr_att
25790 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  r = &cackey_sess
257a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
257b0 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72  earch_query[curr
257c0 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
257d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
257e0 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20  NTF("  Checking 
257f0 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73  for attribute %s
25800 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64   (0x%08lx) in id
25810 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43  entity:%i...", C
25820 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
25830 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
25840 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  R(curr_attr->typ
25850 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  e), (unsigned lo
25860 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
25870 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  ype, (int) curr_
25880 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b  id_idx);....CACK
25890 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
258a0 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f  F("    Value loo
258b0 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72  king for:", curr
258c0 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
258d0 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
258e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28  eLen);.....for (
258f0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
25900 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
25910 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72   < curr_id->attr
25920 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
25930 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
25940 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
25950 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
25960 74 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f  ttributes(&curr_
25970 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
25980 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63  ess_attr_idx], c
25990 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09  urr_attr)) {....
259a0 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
259b0 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  +;.......break;.
259c0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
259d0 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75  * If the attribu
259e0 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  te could not be 
259f0 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20  matched, do not 
25a00 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64  try to match add
25a10 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74  itional attribut
25a20 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65  es */....if (pre
25a30 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  v_matched_count 
25a40 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  == matched_count
25a50 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
25a60 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d  ..}...}....if (m
25a70 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20  atched_count == 
25a80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25a90 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
25aa0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a  _query_count) {.
25ab0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25ac0 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c  PRINTF("  ... Al
25ad0 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20  l %i attributes 
25ae0 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
25af0 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  d, adding identi
25b00 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65  ty:%i to returne
25b10 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63  d list", (int) c
25b20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25b30 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
25b40 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e  query_count, (in
25b50 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
25b60 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75  .....phObject[cu
25b70 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d  rr_out_id_idx] =
25b80 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31   curr_id_idx + 1
25b90 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63  ;.....ulMaxObjec
25ba0 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75  tCount--;.....cu
25bb0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b  rr_out_id_idx++;
25bc0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
25bd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25be0 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c  TF("  ... Not al
25bf0 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64  l %i (only found
25c00 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20   %i) attributes 
25c10 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
25c20 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64  d, not adding id
25c30 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74  entity:%i", (int
25c40 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
25c50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
25c60 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
25c70 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f  (int) matched_co
25c80 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
25c90 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  id_idx);...}..}.
25ca0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25cb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
25cc0 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72  h_curr_id = curr
25cd0 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62  _id_idx;..*pulOb
25ce0 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72  jectCount = curr
25cf0 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69  _out_id_idx;..#i
25d00 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
25d10 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
25d20 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
25d30 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73  (&end, NULL);..s
25d40 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72  tart_int = (star
25d50 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30  t.tv_sec * 10000
25d60 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75  00) + start.tv_u
25d70 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20  sec;..end_int = 
25d80 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30  (end.tv_sec * 10
25d90 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f  00000) + end.tv_
25da0 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73  usec;..fprintf(s
25db0 74 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74  tderr, "Search t
25dc0 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63  ook %lu microsec
25dd0 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  onds\n", (unsign
25de0 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e  ed long) (end_in
25df0 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b  t - start_int));
25e00 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f  .#endif...mutex_
25e10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25e20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25e30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25e40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25e50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25e70 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
25e80 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25e90 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25ea0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
25eb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25ec0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
25ed0 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f  R_OK (%i), num o
25ee0 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43  bjects = %lu", C
25ef0 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63  KR_OK, *pulObjec
25f00 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  tCount);...retur
25f10 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
25f20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25f30 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
25f40 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53  jectsFinal)(CK_S
25f50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25f60 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ession) {..CK_UL
25f70 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ONG idx;..int mu
25f80 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
25f90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25fa0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25fb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25fc0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25fd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25fe0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
25ff0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
26000 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
26010 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
26020 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
26030 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
26040 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
26050 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
26060 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
26070 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
26080 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
26090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
260a0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
260b0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
260c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
260d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
260e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
260f0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
26100 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
26110 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26120 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
26130 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
26140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26150 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
26160 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
26170 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26180 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
26190 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
261a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
261b0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
261c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
261d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
261e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
261f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
26200 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
26210 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
26220 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
26230 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
26240 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
26250 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26260 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
26270 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
26280 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26290 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
262a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
262b0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
262c0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
262d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
262e0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
262f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
26300 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
26310 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26320 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
26330 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
26340 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
26350 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
26360 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
26370 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
26380 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26390 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
263a0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
263b0 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63  lue) {....free(c
263c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
263d0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
263e0 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
263f0 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  e);...}..}...if 
26400 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26410 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26420 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65  h_query) {...fre
26430 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
26440 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26450 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09  ch_query);..}...
26460 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
26470 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26480 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26490 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
264a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
264b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
264c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
264d0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
264e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
264f0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
26500 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
26510 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26520 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
26530 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
26540 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
26550 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26560 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
26570 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
26580 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26590 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
265a0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
265b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
265c0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
265d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
265e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
265f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26600 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26620 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26630 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26640 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26650 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26660 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
26670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26680 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
26690 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
266a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
266b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
266c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
266d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
266e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
266f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26700 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
26710 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
26720 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26730 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
26740 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
26750 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
26760 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
26770 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
26780 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61  R pulEncryptedDa
26790 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
267a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
267b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
267c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
267d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
267e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
267f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26800 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26810 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26820 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26830 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
26840 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26850 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
26860 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26870 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
26880 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26890 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
268a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
268b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
268c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
268d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
268e0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
268f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26900 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
26910 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
26920 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
26930 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
26940 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
26950 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
26960 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
26970 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26980 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
26990 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
269a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
269b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
269c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
269d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
269e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
269f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
26a00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
26a10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26a20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
26a30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
26a40 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
26a50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26a60 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
26a70 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
26a80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26a90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
26aa0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
26ab0 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ncryptFinal)(CK_
26ac0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
26ad0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
26ae0 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70  _PTR pLastEncryp
26af0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
26b00 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63  G_PTR pulLastEnc
26b10 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
26b20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26b30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26b40 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26b50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26b60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26b70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26b80 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26b90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26ba0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26bb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26bd0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26be0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26bf0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26c00 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26c10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
26c20 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
26c30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26c40 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26c50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26c60 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28   C_DecryptInit)(
26c70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26c80 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
26c90 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
26ca0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
26cb0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
26cc0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
26cd0 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
26ce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26cf0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
26d00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
26d10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
26d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26d30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
26d40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
26d50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26d60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26d70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
26d80 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
26d90 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
26da0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26db0 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
26dc0 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
26dd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
26de0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
26df0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
26e00 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
26e10 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
26e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26e30 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
26e40 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
26e50 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
26e60 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
26e70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26e80 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
26e90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
26ea0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
26eb0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
26ec0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
26ed0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
26ee0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
26ef0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
26f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26f10 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26f20 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
26f30 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26f40 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
26f50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
26f60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
26f70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
26f80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26f90 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
26fa0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
26fb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26fc0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
26fd0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
26fe0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
26ff0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
27000 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
27010 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27020 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
27030 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27040 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27050 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27060 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27070 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
27080 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
27090 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
270a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
270b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
270c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
270d0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
270e0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
270f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27100 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
27110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27120 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
27130 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e  crypt already in
27140 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
27150 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
27160 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
27170 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
27180 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
27190 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
271a0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
271b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
271c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
271d0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
271e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
271f0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
27200 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
27210 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
27220 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
27230 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
27240 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
27250 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
27260 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
27270 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27280 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
27290 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
272a0 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
272b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
272c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
272d0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
272e0 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  t_active = 1;...
272f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27300 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
27310 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  t_mechanism = pM
27320 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
27330 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ism;..cackey_ses
27340 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27350 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
27360 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
27370 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63  pParameter;..cac
27380 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27390 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
273a0 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d  ech_parmlen = pM
273b0 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61  echanism->ulPara
273c0 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65  meterLen;..cacke
273d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
273e0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
273f0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
27400 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27410 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
27420 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
27430 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
27440 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
27450 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
27460 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
27470 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
27480 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27490 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
274a0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
274b0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
274c0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
274d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
274e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
274f0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
27500 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
27510 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
27520 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27530 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53   C_Decrypt)(CK_S
27540 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27550 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
27560 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
27570 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  ta, CK_ULONG ulE
27580 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
27590 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
275a0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
275b0 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
275c0 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e  CK_ULONG datalen
275d0 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e  _update, datalen
275e0 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64  _final;..CK_RV d
275f0 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74  ecrypt_ret;..int
27600 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
27610 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27620 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
27630 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
27640 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
27650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27660 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
27670 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
27680 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
27690 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
276a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
276b0 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
276c0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
276d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
276e0 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
276f0 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
27700 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
27710 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
27720 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
27730 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
27740 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
27750 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
27760 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
27770 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
27780 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
27790 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
277a0 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
277b0 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
277c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
277d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
277e0 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
277f0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
27800 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
27810 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
27820 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
27830 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ...if (decrypt_r
27840 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
27850 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
27860 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65  ./* Terminate de
27870 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69  cryption operati
27880 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f  on */.....mutex_
27890 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
278a0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
278b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
278c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
278d0 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
278e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
278f0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
27900 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
27910 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27920 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
27930 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
27940 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27950 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
27960 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
27970 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
27980 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
27990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
279a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
279b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
279c0 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
279d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
279e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a  _INVALID);....}.
279f0 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
27a00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27a10 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
27a20 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
27a30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27a40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
27a50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27a60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27a70 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
27a80 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
27a90 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
27aa0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
27ab0 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ED);....}.....ca
27ac0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27ad0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
27ae0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
27af0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
27b00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27b10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27b20 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
27b30 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27b40 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27b50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27b60 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
27b70 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
27b80 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27b90 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ROR);....}...}..
27ba0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
27bb0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
27bc0 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61  pData) {...pData
27bd0 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61   += datalen_upda
27be0 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f  te;..}..datalen_
27bf0 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61  final = *pulData
27c00 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70  Len - datalen_up
27c10 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f  date;...decrypt_
27c20 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46  ret = C_DecryptF
27c30 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
27c40 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66  Data, &datalen_f
27c50 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72  inal);..if (decr
27c60 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
27c70 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
27c80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27c90 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c  r.  DecryptFinal
27ca0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
27cb0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
27cc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
27cd0 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
27ce0 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
27cf0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75  t_ret);..}...*pu
27d00 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c  lDataLen = datal
27d10 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61  en_update + data
27d20 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43  len_final;...CAC
27d30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27d40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27d50 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
27d60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27d70 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
27d80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27d90 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  , C_DecryptUpdat
27da0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
27db0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
27dc0 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
27dd0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
27de0 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
27df0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
27e00 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
27e10 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
27e20 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
27e30 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d  _BYTE buf[16384]
27e40 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65  ;..ssize_t bufle
27e50 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  n;..CK_SLOT_ID s
27e60 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65  lotID;..CK_RV re
27e70 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
27e80 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d  AL_ERROR;..int m
27e90 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
27ea0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27eb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
27ec0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
27ed0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27ee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27ef0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27f00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27f10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27f20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27f30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
27f40 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
27f50 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
27f60 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27f70 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
27f80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27f90 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
27fa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27fb0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
27fc0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
27fd0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
27fe0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
27ff0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
28000 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
28010 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e   == NULL && ulEn
28020 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
28030 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
28040 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
28050 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63  are asked to dec
28060 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20  rypt nothing... 
28070 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
28080 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28090 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
280a0 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
280b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
280c0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
280d0 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65  ...if (pEncrypte
280e0 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dPart == NULL) {
280f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28100 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
28110 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73  EncryptedPart is
28120 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63   NULL, but ulEnc
28130 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
28140 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
28150 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
28160 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
28170 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   (ulEncryptedPar
28180 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
28190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
281a0 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63  TF("Error. ulEnc
281b0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
281c0 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
281d0 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
281e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
281f0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
28200 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20  .if (pulPartLen 
28210 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
28220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28230 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74  ("Error. pulPart
28240 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
28250 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
28260 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
28270 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
28280 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
28290 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
282a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
282b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
282c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
282d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
282e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
282f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
28300 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
28310 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
28320 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28330 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
28340 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
28350 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28360 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
28370 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28380 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
28390 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
283a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
283b0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
283c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
283d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
283e0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
283f0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
28400 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28410 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28420 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28430 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28440 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
28450 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
28460 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
28470 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
28480 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
28490 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
284a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
284b0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
284c0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
284d0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
284e0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
284f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
28500 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
28510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28520 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
28530 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
28540 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
28550 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
28560 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
28570 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
28580 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
28590 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
285a0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
285b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
285c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
285d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
285e0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
285f0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
28600 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
28610 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28620 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28630 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
28640 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
28650 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
28660 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
28670 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
28680 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20  rypt_mechanism) 
28690 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
286a0 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
286b0 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74   card to decrypt
286c0 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20   */....buflen = 
286d0 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
286e0 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
286f0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
28700 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28710 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
28720 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
28730 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
28740 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
28750 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
28760 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  );.....if (bufle
28770 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
28780 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65  Decryption faile
28790 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75  d. */.....if (bu
287a0 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
287b0 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
287c0 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
287d0 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
287e0 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
287f0 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d  lse if (buflen =
28800 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
28810 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
28820 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
28830 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
28840 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
28850 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
28860 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
28870 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
28880 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
28890 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70  ng) buflen) > *p
288a0 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61  ulPartLen && pPa
288b0 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63  rt) {...../* Dec
288c0 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20  rypted data too 
288d0 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74  large */.....ret
288e0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
288f0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
28900 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
28910 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65  pPart) {......me
28920 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c  mcpy(pPart, buf,
28930 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a   buflen);.....}.
28940 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e  .....*pulPartLen
28950 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09   = buflen;......
28960 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
28970 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
28980 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
28990 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
289a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
289b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
289c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
289d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
289e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
289f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
28a00 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
28a10 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
28a20 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
28a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28a40 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
28a50 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
28a60 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
28a70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
28a80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
28a90 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ecryptFinal)(CK_
28aa0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
28ab0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
28ac0 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20  _PTR pLastPart, 
28ad0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
28ae0 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09  LastPartLen) {..
28af0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
28b00 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
28b10 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09  _decrypt = 1;...
28b20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28b30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
28b40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
28b50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
28b60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28b70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
28b80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
28b90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
28ba0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
28bb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
28bc0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
28bd0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
28be0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28bf0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
28c00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28c10 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
28c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28c30 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
28c40 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
28c50 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28c60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28c70 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
28c80 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  f (pulLastPartLe
28c90 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
28ca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28cb0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61  TF("Error. pulLa
28cc0 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  stPartLen is NUL
28cd0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
28ce0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
28cf0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
28d00 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28d10 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
28d20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
28d30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
28d40 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
28d50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28d60 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
28d70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28d80 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28d90 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
28da0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28db0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
28dc0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28dd0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28de0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
28df0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28e00 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
28e10 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
28e20 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28e30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28e40 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
28e50 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
28e60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
28e70 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
28e80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
28e90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28ea0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
28eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28ec0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
28ed0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
28ee0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
28ef0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
28f00 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a  IALIZED);..}...*
28f10 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
28f20 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50   0;...if (pLastP
28f30 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
28f40 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  .terminate_decry
28f50 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  pt = 0;..}...if 
28f60 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  (terminate_decry
28f70 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  pt) {...cackey_s
28f80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28f90 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
28fa0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
28fb0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28fc0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
28fd0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
28fe0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
28ff0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
29000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29010 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
29020 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
29030 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
29040 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
29050 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29060 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29070 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
29080 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
29090 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
290a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
290b0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69  _RV, C_DigestIni
290c0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
290d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
290e0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
290f0 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43  pMechanism) {..C
29100 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29110 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29120 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29130 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29140 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29150 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
29160 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
29170 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
29180 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
29190 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
291a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
291b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
291c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
291d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
291e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
291f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
29200 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
29210 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29220 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
29230 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
29240 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49  Digest)(CK_SESSI
29250 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29260 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29270 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
29280 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
29290 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
292a0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
292b0 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
292c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
292d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
292e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
292f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
29300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29310 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
29320 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
29330 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
29340 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
29350 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
29360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29370 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
29380 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29390 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
293a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
293b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
293c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
293d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
293e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
293f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
29400 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
29410 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29420 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
29430 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
29440 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
29450 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29460 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29470 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29480 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29490 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
294a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
294b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
294c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
294d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
294e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
294f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29500 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29510 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29520 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29530 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29540 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29550 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29560 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29570 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
29580 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29590 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43  , C_DigestKey)(C
295a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
295b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
295c0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
295d0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
295e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
295f0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29600 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29610 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29620 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29630 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29640 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29650 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29660 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29670 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29680 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29690 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
296a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
296b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
296c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
296d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
296e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
296f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29700 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29710 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61  RV, C_DigestFina
29720 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
29730 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
29740 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
29750 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
29760 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
29770 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29780 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29790 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
297a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
297b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
297c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
297d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
297e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
297f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29800 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29820 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29830 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29840 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29850 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29860 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29870 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29880 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29890 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
298a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
298b0 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f   C_SignInit)(CK_
298c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
298d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
298e0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
298f0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
29900 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
29910 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
29920 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
29930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29940 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
29950 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
29960 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
29970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29980 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
29990 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
299a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
299b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
299c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
299d0 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
299e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
299f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29a00 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
29a10 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
29a20 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
29a30 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
29a40 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
29a50 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
29a60 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
29a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29a80 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
29a90 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
29aa0 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
29ab0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
29ac0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
29ad0 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
29ae0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
29af0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
29b00 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
29b10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
29b20 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
29b30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29b40 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
29b50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29b60 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
29b70 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
29b80 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
29b90 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
29ba0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
29bb0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29bc0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
29bd0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29be0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
29bf0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
29c00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29c10 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
29c20 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
29c30 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
29c40 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
29c50 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
29c60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
29c70 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
29c80 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29c90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29ca0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29cb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
29cc0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
29cd0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29ce0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
29cf0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29d00 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
29d10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29d20 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
29d30 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
29d40 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
29d50 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
29d60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29d70 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72  Error.  Sign alr
29d80 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73  eady in progress
29d90 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
29da0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
29db0 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20  CTIVE);..}...if 
29dc0 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f  (hKey >= cackey_
29dd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29de0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
29df0 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  unt) {...cackey_
29e00 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29e10 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29e20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29e30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65  INTF("Error.  Ke
29e40 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  y handle out of 
29e50 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64  range (requested
29e60 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25   key %lu, only %
29e70 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76  lu identities av
29e80 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73  ailable).", (uns
29e90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
29ea0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
29eb0 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
29ec0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
29ed0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
29ee0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59  ..return(CKR_KEY
29ef0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
29f00 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
29f10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29f20 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31  .sign_active = 1
29f30 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
29f40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
29f50 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  gn_mechanism = p
29f60 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
29f70 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  nism;...cackey_s
29f80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29f90 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
29fa0 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  128;..cackey_ses
29fb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29fc0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30  sign_bufused = 0
29fd0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
29fe0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
29ff0 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73  n_buf = malloc(s
2a000 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
2a010 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a020 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
2a030 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a040 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
2a050 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  en);...CACKEY_DE
2a060 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73  BUG_PRINTF("Sess
2a070 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65  ion %lu sign_ide
2a080 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65  ntity is %p (ide
2a090 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75  ntity #%lu)", (u
2a0a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
2a0b0 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29  ession, (void *)
2a0c0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
2a0d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2a0e0 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75  tities[hKey], (u
2a0f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
2a100 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ey);..cackey_ses
2a110 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a120 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20  sign_identity = 
2a130 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2a140 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2a150 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
2a160 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2a170 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2a180 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2a190 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2a1a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2a1b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a1c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2a1d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2a1e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a1f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a200 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2a210 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2a220 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2a230 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2a240 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2a250 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a260 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29  N(CK_RV, C_Sign)
2a270 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2a280 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2a290 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2a2a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
2a2b0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2a2c0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2a2d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
2a2e0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73  atureLen) {..uns
2a2f0 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74  igned long start
2a300 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09  _sign_bufused;..
2a310 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a  CK_RV sign_ret;.
2a320 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2a330 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2a340 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2a350 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2a360 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2a370 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a380 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a390 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2a3a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2a3b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2a3c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2a3d0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2a3e0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2a3f0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2a400 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2a410 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2a420 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2a430 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a440 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2a450 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2a460 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2a470 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2a480 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2a490 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62  }...start_sign_b
2a4a0 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f  ufused = cackey_
2a4b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a4c0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  n].sign_bufused;
2a4d0 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f  ...sign_ret = C_
2a4e0 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73  SignUpdate(hSess
2a4f0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61  ion, pData, ulDa
2a500 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  taLen);..if (sig
2a510 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
2a520 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a530 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a540 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72    SignUpdate() r
2a550 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2a560 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2a570 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2a580 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  gn_ret);....if (
2a590 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2a5a0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2a5b0 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  ) {....mutex_ret
2a5c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2a5d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2a5e0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
2a5f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2a600 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
2a610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a620 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2a630 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2a640 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2a650 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
2a660 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2a670 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a680 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
2a690 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a6a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a6b0 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
2a6c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a6d0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2a6e0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2a6f0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2a700 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2a710 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  VALID);....}....
2a720 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2a730 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a740 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
2a750 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2a760 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2a770 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
2a780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a790 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
2a7a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2a7b0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a7c0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2a7d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d  ITIALIZED);....}
2a7e0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2a7f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2a800 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
2a810 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
2a820 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2a830 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2a840 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2a850 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2a860 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2a870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a880 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2a890 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2a8a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a8b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09  L_ERROR);....}..
2a8c0 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  .}....return(sig
2a8d0 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67  n_ret);..}...sig
2a8e0 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69  n_ret = C_SignFi
2a8f0 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53  nal(hSession, pS
2a900 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67  ignature, pulSig
2a910 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20  natureLen);..if 
2a920 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
2a930 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67  _OK) {...if (sig
2a940 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46  n_ret == CKR_BUF
2a950 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2a960 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2a970 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e  _PRINTF("SignFin
2a980 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b  al() returned CK
2a990 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2a9a0 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75  LL (rv = %lu), u
2a9b0 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
2a9c0 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65  ate()", (unsigne
2a9d0 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2a9e0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
2a9f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2aa00 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
2aa10 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
2aa20 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73  ed;.....return(s
2aa30 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09  ign_ret);...}...
2aa40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aa50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
2aa60 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
2aa70 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
2aa80 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
2aa90 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
2aaa0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
2aab0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  gn_ret);..}...if
2aac0 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20   (pSignature == 
2aad0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2aae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
2aaf0 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 69 66  Signature specif
2ab00 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64  ied as NULL, und
2ab10 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
2ab20 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  e()");....cackey
2ab30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ab40 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2ab50 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75   = start_sign_bu
2ab60 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e  fused;....return
2ab70 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
2ab80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ab90 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2aba0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2abb0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2abc0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2abd0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2abe0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61  K_RV, C_SignUpda
2abf0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2ac00 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2ac10 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2ac20 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
2ac30 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
2ac40 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2ac50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ac60 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2ac70 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2ac80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2ac90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2aca0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2acb0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2acc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2acd0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2ace0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2acf0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2ad00 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2ad10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2ad20 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2ad30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2ad40 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2ad50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ad60 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2ad70 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2ad80 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2ad90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2ada0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2adb0 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26  (pPart == NULL &
2adc0 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30  & ulPartLen == 0
2add0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
2ade0 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
2adf0 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e   asked to sign n
2ae00 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
2ae10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ae20 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2ae30 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
2ae40 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
2ae50 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
2ae60 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
2ae70 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (pPart == NULL) 
2ae80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ae90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2aea0 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  pPart is NULL, b
2aeb0 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  ut ulPartLen is 
2aec0 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
2aed0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2aee0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2aef0 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  (ulPartLen == 0)
2af00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2af10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2af20 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c   ulPartLen is 0,
2af30 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
2af40 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
2af50 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2af60 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
2af70 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2af80 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2af90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2afa0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2afb0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2afc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2afd0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2afe0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2aff0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2b000 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2b010 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2b020 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2b030 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2b040 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b050 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2b060 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b070 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2b080 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2b090 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2b0a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2b0b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2b0c0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2b0d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b0e0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
2b0f0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2b100 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2b110 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2b120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b130 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
2b140 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2b150 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2b160 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2b170 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77  ALIZED);..}...sw
2b180 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
2b190 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b1a0 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
2b1b0 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
2b1c0 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63  _PKCS:..../* Acc
2b1d0 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79  umulate directly
2b1e0 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b   */....if ((cack
2b1f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b200 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2b210 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20  ed + ulPartLen) 
2b220 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  > cackey_session
2b230 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b240 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63  _buflen) {.....c
2b250 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b260 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b270 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09  flen *= 2;......
2b280 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b290 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2b2a0 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63  uf = realloc(cac
2b2b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b2c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
2b2d0 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f   sizeof(*cackey_
2b2e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b2f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
2b300 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b310 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b320 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  flen);....}.....
2b330 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
2b340 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b350 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b  .sign_buf + cack
2b360 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b370 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2b380 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72  ed, pPart, ulPar
2b390 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65  tLen);.....cacke
2b3a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b3b0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2b3c0 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a  d += ulPartLen;.
2b3d0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2b3e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2b3f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2b400 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2b410 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2b420 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2b430 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b440 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2b450 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2b460 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b470 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2b480 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2b490 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2b4a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2b4b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2b4c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
2b4d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2b4e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2b4f0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2b500 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2b510 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2b520 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2b530 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
2b540 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74  tureLen) {..stat
2b550 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75  ic CK_BYTE sigbu
2b560 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f  f[1024];..ssize_
2b570 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b  t sigbuflen;..CK
2b580 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
2b590 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
2b5a0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
2b5b0 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  OR;..int termina
2b5c0 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e  te_sign = 1;..in
2b5d0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2b5e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b5f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2b600 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2b610 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2b620 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b630 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2b640 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2b650 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b660 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2b670 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b680 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65  if (pulSignature
2b690 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
2b6a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b6b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
2b6c0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20  SignatureLen is 
2b6d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2b6e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2b6f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2b700 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2b710 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2b720 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2b730 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2b740 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2b750 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2b760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b770 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2b780 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2b790 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2b7a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2b7b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2b7c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2b7d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2b7e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2b7f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2b800 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2b810 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b820 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2b830 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2b840 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2b850 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2b860 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2b870 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2b880 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2b890 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2b8a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2b8b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b8c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2b8d0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2b8e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2b8f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2b900 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2b910 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2b920 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b930 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2b940 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2b950 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2b960 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2b970 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b980 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
2b990 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2b9a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2b9b0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2b9c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  LIZED);..}...slo
2b9d0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
2b9e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b9f0 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
2ba00 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
2ba10 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
2ba20 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
2ba30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
2ba40 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2ba50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ba60 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
2ba70 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
2ba80 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
2ba90 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
2baa0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
2bab0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2bac0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
2bad0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2bae0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
2baf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bb00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bb10 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
2bb20 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
2bb30 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
2bb40 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
2bb50 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
2bb60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2bb70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
2bb80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2bb90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
2bba0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
2bbb0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2bbc0 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
2bbd0 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
2bbe0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
2bbf0 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a  k card to sign *
2bc00 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  /....CACKEY_DEBU
2bc10 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67  G_PRINTF("Asking
2bc20 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64   to sign from id
2bc30 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73  entity %p in ses
2bc40 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64  sion %lu", (void
2bc50 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69   *) cackey_sessi
2bc60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2bc70 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e  gn_identity, (un
2bc80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
2bc90 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75  ssion);....sigbu
2bca0 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69  flen = cackey_si
2bcb0 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65  gndecrypt(&cacke
2bcc0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
2bcd0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2bce0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2bcf0 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79  identity, cackey
2bd00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2bd10 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61  on].sign_buf, ca
2bd20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2bd30 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2bd40 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69  used, sigbuf, si
2bd50 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c  zeof(sigbuf), 1,
2bd60 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67   0);.....if (sig
2bd70 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
2bd80 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69  ../* Signing fai
2bd90 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28  led. */.....if (
2bda0 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  sigbuflen == CAC
2bdb0 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
2bdc0 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74  OGIN) {......ret
2bdd0 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e  val = CKR_USER_N
2bde0 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09  OT_LOGGED_IN;...
2bdf0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67  ..} else if (sig
2be00 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
2be10 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
2be20 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
2be30 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
2be40 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
2be50 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61  lse {......retva
2be60 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
2be70 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09  ERROR;.....}....
2be80 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73  } else if (((uns
2be90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
2bea0 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67  uflen) > *pulSig
2beb0 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69  natureLen && pSi
2bec0 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f  gnature) {...../
2bed0 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f  * Signed data to
2bee0 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43  o large */.....C
2bef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bf00 54 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52  TF("retval = CKR
2bf10 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2bf20 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20  L;  sigbuflen = 
2bf30 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72  %lu, pulSignatur
2bf40 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e  eLen = %lu", (un
2bf50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
2bf60 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  buflen, (unsigne
2bf70 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e  d long) *pulSign
2bf80 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  atureLen);......
2bf90 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
2bfa0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a  FER_TOO_SMALL;..
2bfb0 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2bfc0 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73  gn = 0;....} els
2bfd0 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74  e {.....terminat
2bfe0 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09  e_sign = 0;.....
2bff0 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29  .if (pSignature)
2c000 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
2c010 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75  Signature, sigbu
2c020 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a  f, sigbuflen);..
2c030 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
2c040 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a  ign = 1;.....}..
2c050 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72  ....*pulSignatur
2c060 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e  eLen = sigbuflen
2c070 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
2c080 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09  CKR_OK;....}....
2c090 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20  .break;..}...if 
2c0a0 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29  (terminate_sign)
2c0b0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
2c0c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c0d0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09  n].sign_buf) {..
2c0e0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65  ..free(cackey_se
2c0f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c100 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a  .sign_buf);...}.
2c110 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2c120 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2c130 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  n_active = 0;..}
2c140 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2c150 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2c160 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2c170 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2c180 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2c190 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c1a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c1b0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2c1c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c1d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2c1e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2c1f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c200 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
2c210 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
2c220 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
2c230 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2c240 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2c250 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f  RecoverInit)(CK_
2c260 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2c270 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2c280 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2c290 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2c2a0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2c2b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c2c0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c2d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c2e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c2f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c300 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c310 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c320 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c330 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c340 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2c350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c360 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c370 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c380 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2c390 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c3a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2c3b0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c3c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c3d0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c3e0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c3f0 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b  _SignRecover)(CK
2c400 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c410 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2c420 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2c430 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
2c440 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2c450 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2c460 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
2c470 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2c480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c490 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c4a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c4b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c4c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c4d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c4e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c4f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c500 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c510 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2c520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c530 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2c540 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c550 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2c560 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c570 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2c580 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c590 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2c5a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c5b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2c5c0 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  yInit)(CK_SESSIO
2c5d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2c5e0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2c5f0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2c600 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2c610 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
2c620 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c630 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c640 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c650 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c670 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c680 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c690 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c6a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c6b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2c6c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c6d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2c6e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c6f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2c700 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c710 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2c720 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c730 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2c740 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c750 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2c760 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2c770 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2c780 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2c790 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2c7a0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2c7b0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2c7c0 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
2c7d0 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2c7e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c7f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c800 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c810 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c830 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c840 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c850 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c860 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c870 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2c880 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c890 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2c8a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c8b0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2c8c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c8d0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2c8e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c8f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2c900 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c910 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2c920 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  yUpdate)(CK_SESS
2c930 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2c940 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2c950 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2c960 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43   ulPartLen) {..C
2c970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c980 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c990 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c9a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c9b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c9c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c9d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c9e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c9f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ca00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2ca10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ca20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ca30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ca40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2ca50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ca60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2ca70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2ca80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ca90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2caa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2cab0 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f  VerifyFinal)(CK_
2cac0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2cad0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2cae0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2caf0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
2cb00 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
2cb10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cb20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2cb30 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2cb40 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2cb50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cb60 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2cb70 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2cb80 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2cb90 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2cba0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2cbb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2cbc0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2cbd0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2cbe0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2cbf0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2cc00 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2cc10 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2cc20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2cc30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2cc40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2cc50 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29  rifyRecoverInit)
2cc60 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2cc70 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2cc80 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2cc90 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2cca0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
2ccb0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2ccc0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2ccd0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2cce0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2ccf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cd00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2cd10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2cd20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2cd30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2cd40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2cd50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cd60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2cd70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2cd80 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2cd90 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2cda0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2cdb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2cdc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2cdd0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2cde0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2cdf0 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76  V, C_VerifyRecov
2ce00 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
2ce10 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2ce20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2ce30 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2ce40 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c   ulSignatureLen,
2ce50 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2ce60 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
2ce70 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
2ce80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ce90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2cea0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ceb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2cec0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ced0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2cee0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2cef0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2cf00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2cf10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2cf20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cf30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2cf40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2cf50 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2cf60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2cf70 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2cf80 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2cf90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2cfa0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2cfb0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2cfc0 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
2cfd0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2cfe0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2cff0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2d000 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2d010 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2d020 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2d030 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2d040 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
2d050 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2d060 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d070 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d080 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d090 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d0a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d0b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d0c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d0d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d0e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d0f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d110 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2d120 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d130 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2d140 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d150 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d160 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d170 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d180 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d190 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
2d1a0 70 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28  ptDigestUpdate)(
2d1b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2d1c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2d1d0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2d1e0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2d1f0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
2d200 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2d210 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2d220 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
2d230 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2d240 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2d250 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2d260 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2d270 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d280 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d290 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2d2a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d2b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2d2c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2d2d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d2e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2d2f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d300 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2d310 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2d320 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2d330 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2d340 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d350 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2d360 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2d370 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  V, C_SignEncrypt
2d380 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2d390 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2d3a0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2d3b0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2d3c0 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
2d3d0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2d3e0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
2d3f0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
2d400 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2d410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d420 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d430 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d440 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d460 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d470 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d480 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d490 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d4a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d4b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d4c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d4d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d4e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d4f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d500 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d510 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d520 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d530 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d540 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
2d550 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
2d560 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d570 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d580 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2d590 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2d5a0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
2d5b0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
2d5c0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2d5d0 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
2d5e0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2d5f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2d600 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2d610 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d620 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d630 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d640 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d650 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d660 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d670 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d680 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d690 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d6a0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2d6b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2d6c0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2d6d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d6e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2d6f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d700 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2d710 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d720 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b  _RV, C_GenerateK
2d730 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
2d740 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2d750 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2d760 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2d770 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
2d780 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2d790 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
2d7a0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2d7b0 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
2d7c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d7d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d7e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d7f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d810 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d820 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d830 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d840 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d850 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d870 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2d880 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d890 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2d8a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d8b0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d8c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d8d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d8e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d8f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
2d900 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53  ateKeyPair)(CK_S
2d910 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d920 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2d930 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2d940 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
2d950 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79  E_PTR pPublicKey
2d960 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
2d970 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74  NG ulPublicKeyAt
2d980 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
2d990 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
2d9a0 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61  PrivateKeyTempla
2d9b0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  te, CK_ULONG ulP
2d9c0 72 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75  rivateKeyAttribu
2d9d0 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
2d9e0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
2d9f0 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42  PublicKey, CK_OB
2da00 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2da10 70 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a  phPrivateKey) {.
2da20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2da30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2da40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2da50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2da60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2da70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2da80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2da90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2daa0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2dab0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2dac0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dad0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2dae0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2daf0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2db00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2db10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2db20 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2db30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2db40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2db50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2db60 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45  C_WrapKey)(CK_SE
2db70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2db80 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2db90 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2dba0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2dbb0 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65  NDLE hWrappingKe
2dbc0 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
2dbd0 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54  DLE hKey, CK_BYT
2dbe0 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
2dbf0 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  y, CK_ULONG_PTR 
2dc00 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e  pulWrappedKeyLen
2dc10 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2dc20 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2dc30 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2dc40 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2dc50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2dc60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2dc70 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2dc80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2dc90 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2dca0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2dcb0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dcc0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2dcd0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2dce0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2dcf0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2dd00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2dd10 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2dd20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2dd30 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2dd40 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2dd50 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29  RV, C_UnwrapKey)
2dd60 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2dd70 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2dd80 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2dd90 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2dda0 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72  ECT_HANDLE hUnwr
2ddb0 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59  appingKey, CK_BY
2ddc0 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b  TE_PTR pWrappedK
2ddd0 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57  ey, CK_ULONG ulW
2dde0 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b  rappedKeyLen, CK
2ddf0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
2de00 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
2de10 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f  NG ulAttributeCo
2de20 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
2de30 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
2de40 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2de50 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2de60 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2de70 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2de80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2de90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2dea0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2deb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2dec0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2ded0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2dee0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2def0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2df00 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2df10 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2df20 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2df30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2df40 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2df50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2df60 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2df70 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2df80 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28  V, C_DeriveKey)(
2df90 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2dfa0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2dfb0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2dfc0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2dfd0 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b  CT_HANDLE hBaseK
2dfe0 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ey, CK_ATTRIBUTE
2dff0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
2e000 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
2e010 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
2e020 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2e030 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
2e040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2e050 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2e060 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2e070 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2e080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e090 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2e0a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2e0b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2e0c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2e0d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2e0e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2e0f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2e100 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e110 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2e120 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e130 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2e140 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e150 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2e160 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2e170 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52  N(CK_RV, C_SeedR
2e180 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f  andom)(CK_SESSIO
2e190 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2e1a0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e1b0 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Seed, CK_ULONG u
2e1c0 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43  lSeedLen) {..CAC
2e1d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e1e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2e1f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2e200 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2e210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e220 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2e230 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2e240 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2e250 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2e260 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2e270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e280 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2e290 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e2a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2e2b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e2c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2e2d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2e2e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2e2f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2e300 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
2e310 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b  nerateRandom)(CK
2e320 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2e330 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2e340 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74  E_PTR pRandomDat
2e350 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61  a, CK_ULONG ulRa
2e360 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  ndomLen) {..CACK
2e370 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e380 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2e390 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2e3a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2e3b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e3c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e3d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e3e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e3f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e400 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2e410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e420 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e430 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e440 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2e450 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e460 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2e470 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2e480 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2e490 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46  ./* Deprecated F
2e4a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45  unction */.CK_DE
2e4b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e4c0 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69  _RV, C_GetFuncti
2e4d0 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53  onStatus)(CK_SES
2e4e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e4f0 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
2e500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2e510 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
2e520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e530 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2e540 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2e550 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
2e560 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2e570 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
2e580 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e590 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
2e5a0 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
2e5b0 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
2e5c0 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
2e5d0 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44  rning */.}../* D
2e5e0 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
2e5f0 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
2e600 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2e610 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
2e620 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2e630 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
2e640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e650 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2e660 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e670 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e680 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e690 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%i)
2e6a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2e6b0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
2e6c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2e6d0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2e6e0 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
2e6f0 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
2e700 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
2e710 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
2e720 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e730 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e740 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29  GetFunctionList)
2e750 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  (CK_FUNCTION_LIS
2e760 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63  T_PTR_PTR ppFunc
2e770 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f  tionList) {..CK_
2e780 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
2e790 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  R pFunctionList;
2e7a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e7b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2e7c0 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74  );...if (ppFunct
2e7d0 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ionList == NULL)
2e7e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e7f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e800 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20   ppFunctionList 
2e810 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2e820 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2e830 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70  NTS_BAD);..}...p
2e840 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d  FunctionList = m
2e850 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46  alloc(sizeof(*pF
2e860 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a  unctionList));..
2e870 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2e880 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  version.major = 
2e890 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
2e8a0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
2e8b0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
2e8c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
2e8d0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
2e8e0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
2e8f0 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
2e900 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
2e910 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2e920 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49  Initialize = C_I
2e930 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e  nitialize;..pFun
2e940 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
2e950 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69  alize = C_Finali
2e960 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
2e970 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20  st->C_GetInfo = 
2e980 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  C_GetInfo;..pFun
2e990 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2e9a0 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74  SlotList = C_Get
2e9b0 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63  SlotList;..pFunc
2e9c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
2e9d0 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  lotInfo = C_GetS
2e9e0 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  lotInfo;..pFunct
2e9f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f  ionList->C_GetTo
2ea00 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54  kenInfo = C_GetT
2ea10 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  okenInfo;..pFunc
2ea20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74  tionList->C_Wait
2ea30 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43  ForSlotEvent = C
2ea40 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
2ea50 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2ea60 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  t->C_GetMechanis
2ea70 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63  mList = C_GetMec
2ea80 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75  hanismList;..pFu
2ea90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2eaa0 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d  tMechanismInfo =
2eab0 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
2eac0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
2ead0 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e  ist->C_InitToken
2eae0 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a   = C_InitToken;.
2eaf0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2eb00 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e  C_InitPIN = C_In
2eb10 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  itPIN;..pFunctio
2eb20 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20  nList->C_SetPIN 
2eb30 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75  = C_SetPIN;..pFu
2eb40 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70  nctionList->C_Op
2eb50 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70  enSession = C_Op
2eb60 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  enSession;..pFun
2eb70 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
2eb80 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c  seSession = C_Cl
2eb90 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75  oseSession;..pFu
2eba0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c  nctionList->C_Cl
2ebb0 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d  oseAllSessions =
2ebc0 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
2ebd0 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ons;..pFunctionL
2ebe0 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f  ist->C_GetSessio
2ebf0 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73  nInfo = C_GetSes
2ec00 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  sionInfo;..pFunc
2ec10 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f  tionList->C_GetO
2ec20 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
2ec30 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
2ec40 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2ec50 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74  ist->C_SetOperat
2ec60 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74  ionState = C_Set
2ec70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
2ec80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ec90 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69  C_Login = C_Logi
2eca0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
2ecb0 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f  t->C_Logout = C_
2ecc0 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69  Logout;..pFuncti
2ecd0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65  onList->C_Create
2ece0 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74  Object = C_Creat
2ecf0 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  eObject;..pFunct
2ed00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f  ionList->C_CopyO
2ed10 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62  bject = C_CopyOb
2ed20 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2ed30 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f  List->C_DestroyO
2ed40 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f  bject = C_Destro
2ed50 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  yObject;..pFunct
2ed60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62  ionList->C_GetOb
2ed70 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74  jectSize = C_Get
2ed80 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75  ObjectSize;..pFu
2ed90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2eda0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
2edb0 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  = C_GetAttribute
2edc0 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
2edd0 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72  nList->C_SetAttr
2ede0 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53  ibuteValue = C_S
2edf0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
2ee00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2ee10 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  ->C_FindObjectsI
2ee20 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  nit = C_FindObje
2ee30 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ctsInit;..pFunct
2ee40 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
2ee50 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f  bjects = C_FindO
2ee60 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69  bjects;..pFuncti
2ee70 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
2ee80 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46  jectsFinal = C_F
2ee90 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b  indObjectsFinal;
2eea0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2eeb0 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d  >C_EncryptInit =
2eec0 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a   C_EncryptInit;.
2eed0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2eee0 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e  C_Encrypt = C_En
2eef0 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f  crypt;..pFunctio
2ef00 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
2ef10 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79  Update = C_Encry
2ef20 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
2ef30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
2ef40 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63  yptFinal = C_Enc
2ef50 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ryptFinal;..pFun
2ef60 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
2ef70 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63  ryptInit = C_Dec
2ef80 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ryptInit;..pFunc
2ef90 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
2efa0 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b  ypt = C_Decrypt;
2efb0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2efc0 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65  >C_DecryptUpdate
2efd0 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61   = C_DecryptUpda
2efe0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2eff0 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e  st->C_DecryptFin
2f000 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  al = C_DecryptFi
2f010 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
2f020 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69  ist->C_DigestIni
2f030 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74  t = C_DigestInit
2f040 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f050 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44  ->C_Digest = C_D
2f060 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  igest;..pFunctio
2f070 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55  nList->C_DigestU
2f080 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74  pdate = C_Digest
2f090 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2f0a0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
2f0b0 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65  Key = C_DigestKe
2f0c0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
2f0d0 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c  t->C_DigestFinal
2f0e0 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c   = C_DigestFinal
2f0f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f100 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43  ->C_SignInit = C
2f110 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e  _SignInit;..pFun
2f120 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2f130 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75  n = C_Sign;..pFu
2f140 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
2f150 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  gnUpdate = C_Sig
2f160 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  nUpdate;..pFunct
2f170 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46  ionList->C_SignF
2f180 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e  inal = C_SignFin
2f190 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2f1a0 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65  st->C_SignRecove
2f1b0 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65  rInit = C_SignRe
2f1c0 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e  coverInit;..pFun
2f1d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2f1e0 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67  nRecover = C_Sig
2f1f0 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63  nRecover;..pFunc
2f200 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
2f210 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66  fyInit = C_Verif
2f220 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  yInit;..pFunctio
2f230 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20  nList->C_Verify 
2f240 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75  = C_Verify;..pFu
2f250 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2f260 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56  rifyUpdate = C_V
2f270 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
2f280 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
2f290 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56  erifyFinal = C_V
2f2a0 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75  erifyFinal;..pFu
2f2b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2f2c0 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20  rifyRecoverInit 
2f2d0 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  = C_VerifyRecove
2f2e0 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  rInit;..pFunctio
2f2f0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
2f300 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66  ecover = C_Verif
2f310 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63  yRecover;..pFunc
2f320 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
2f330 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  stEncryptUpdate 
2f340 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  = C_DigestEncryp
2f350 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
2f360 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2f370 70 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d  ptDigestUpdate =
2f380 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
2f390 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2f3a0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e  onList->C_SignEn
2f3b0 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
2f3c0 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
2f3d0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2f3e0 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69  t->C_DecryptVeri
2f3f0 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  fyUpdate = C_Dec
2f400 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
2f410 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f420 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20  ->C_GenerateKey 
2f430 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b  = C_GenerateKey;
2f440 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f450 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61  >C_GenerateKeyPa
2f460 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b  ir = C_GenerateK
2f470 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69  eyPair;..pFuncti
2f480 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65  onList->C_WrapKe
2f490 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09  y = C_WrapKey;..
2f4a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f4b0 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55  _UnwrapKey = C_U
2f4c0 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  nwrapKey;..pFunc
2f4d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69  tionList->C_Deri
2f4e0 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65  veKey = C_Derive
2f4f0 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
2f500 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f  ist->C_SeedRando
2f510 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  m = C_SeedRandom
2f520 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f530 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  ->C_GenerateRand
2f540 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52  om = C_GenerateR
2f550 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f  andom;..pFunctio
2f560 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63  nList->C_GetFunc
2f570 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47  tionStatus = C_G
2f580 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
2f590 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f5a0 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  ->C_CancelFuncti
2f5b0 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e  on = C_CancelFun
2f5c0 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ction;..pFunctio
2f5d0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63  nList->C_GetFunc
2f5e0 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74  tionList = C_Get
2f5f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2f600 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  *ppFunctionList 
2f610 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  = pFunctionList;
2f620 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f630 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2f640 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2f650 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2f660 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a        n(CKR_OK);.}..