Hex Artifact Content

Artifact 04de0bb64da199097b5087a601f892a0f6bcfba6:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 23 20 20 20 20 64  time = 0;.#    d
1760: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1770: 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 7b 20 69  UG_PRINTTIME { i
1780: 66 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  f (cackey_debug_
1790: 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29  start_time == 0)
17a0: 20 7b 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f   { cackey_debug_
17b0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17c0: 65 28 4e 55 4c 4c 29 3b 20 7d 3b 20 66 70 72 69  e(NULL); }; fpri
17d0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
17e0: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 22  _fd(), "[%lu]: "
17f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1800: 29 20 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20  ) (time(NULL) - 
1810: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61  cackey_debug_sta
1820: 72 74 5f 74 69 6d 65 29 29 3b 20 7d 0a 23 20 20  rt_time)); }.#  
1830: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
1840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1850: 49 4e 54 54 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20  INTTIME /**/.#  
1860: 65 6e 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65  endif..#  define
1870: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1880: 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 43 41 43  INTF(x...) { CAC
1890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
18a0: 49 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63  IME; fprintf(cac
18b0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
18c0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66  "%s():%i: ", __f
18d0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
18e0: 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ; fprintf(cackey
18f0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 78 29 3b  _debug_fd(), x);
1900: 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f   fprintf(cackey_
1910: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22  debug_fd(), "\n"
1920: 29 3b 20 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ); fflush(cackey
1930: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a  _debug_fd()); }.
1940: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1960: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67  f, x, y) { unsig
1970: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46  ned char *TMPBUF
1980: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ; unsigned long 
1990: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75  idx; TMPBUF = (u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
19b0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55  (x); CACKEY_DEBU
19c0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72  G_PRINTTIME; fpr
19d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
19e0: 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69  g_fd(), "%s():%i
19f0: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1a00: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f  {%02x", __func__
1a10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23  , __LINE__, f, #
1a20: 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1a30: 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 5b 30  g) (y), TMPBUF[0
1a40: 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d 20 31  ]); for (idx = 1
1a50: 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 64 78  ; idx < (y); idx
1a60: 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 63 61  ++) { fprintf(ca
1a70: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1a80: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1a90: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69  F[idx]); }; fpri
1aa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1ab0: 5f 66 64 28 29 2c 20 22 7d 29 5c 6e 22 29 3b 20  _fd(), "})\n"); 
1ac0: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1ad0: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1ae0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
1af0: 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b 20  BUG_PERROR(x) { 
1b00: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1b10: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1b20: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f  :%i: ", __func__
1b30: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 43 41 43  , __LINE__); CAC
1b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
1b50: 49 4d 45 3b 20 70 65 72 72 6f 72 28 78 29 3b 20  IME; perror(x); 
1b60: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1b70: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1b80: 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b  define free(x) {
1b90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1ba0: 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28  INTF("FREE(%p) (
1bb0: 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78  %s)", (void *) x
1bc0: 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20  , #x); free(x); 
1bd0: 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  }..static FILE *
1be0: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1bf0: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
1c00: 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b  FILE *fd = NULL;
1c10: 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b  ..char *logfile;
1c20: 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c  ...if (fd != NUL
1c30: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64  L) {...return(fd
1c40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c  );..}.../*.. * L
1c50: 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69  og to stderr ini
1c60: 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e  tially so we can
1c70: 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77   use debugging w
1c80: 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66  ithin.. * this f
1c90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
1ca0: 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20  getting into an 
1cb0: 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20  infinite loop.. 
1cc0: 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b  */..fd = stderr;
1cd0: 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74  ...logfile = get
1ce0: 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55  env("CACKEY_DEBU
1cf0: 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66  G_LOGFILE");..if
1d00: 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c   (logfile != NUL
1d10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1d20: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d30: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
1d40: 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67  riable: %s", log
1d50: 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c  file);....logfil
1d60: 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69  e = strchr(logfi
1d70: 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28  le, '=');...if (
1d80: 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  logfile == NULL)
1d90: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20   {....logfile = 
1da0: 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1db0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a  EBUG_LOGFILE");.
1dc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f  ..} else {....lo
1dd0: 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  gfile++;...}..}.
1de0: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1df0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e10: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20  Found log file: 
1e20: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e30: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67  ..fd = fopen(log
1e40: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a  file, "a");..}..
1e50: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29  .if (fd == NULL)
1e60: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72   {...fd = stderr
1e70: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d  ;..}...if (fd ==
1e80: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43   stderr) {...CAC
1e90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65  ("Returning stde
1eb0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  rr");..} else {.
1ec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ee0: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66   %p", (void *) f
1ef0: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  d);..}...return(
1f00: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  fd);.}..static v
1f10: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
1f20: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
1f30: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
1f40: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
1f50: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
1f60: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
1f70: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
1f80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f90: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69  PRINTTIME;..fpri
1fa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1fb0: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a  _fd(), "%s():%i:
1fc0: 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b   ", func, line);
1fd0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1fe0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 4d 41  _debug_fd(), "MA
1ff0: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
2000: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
2010: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2020: 29 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73  ), "\n");..fflus
2030: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
2040: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  d());...return(r
2050: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
2060: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
2070: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
2080: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
2090: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
20a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
20b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
20c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
20d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73  = realloc(ptr, s
20e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  ize);...if (retv
20f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 43  al != ptr) {...C
2100: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2110: 54 54 49 4d 45 3b 0a 09 09 66 70 72 69 6e 74 66  TTIME;...fprintf
2120: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2130: 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  (), "%s():%i: ",
2140: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09   func, line);...
2150: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2160: 65 62 75 67 5f 66 64 28 29 2c 20 22 52 45 41 4c  ebug_fd(), "REAL
2170: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
2180: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
2190: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
21a0: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b  bug_fd(), "\n");
21b0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
21c0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
21d0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
21e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
21f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2200: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2210: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2220: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2230: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2240: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2250: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2260: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2280: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2290: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
22a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
22b0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
22c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
22d0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
22e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f0: 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74  INTTIME;..fprint
2300: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
2310: 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22  d(), "%s():%i: "
2320: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09  , func, line);..
2330: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2340: 65 62 75 67 5f 66 64 28 29 2c 20 22 53 54 52 44  ebug_fd(), "STRD
2350: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
2360: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72  ", retval);..fpr
2370: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2380: 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09  g_fd(), "\n");..
2390: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
23a0: 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74  bug_fd());...ret
23b0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
23c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
23e0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
2400: 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61  g) {..switch (ta
2410: 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49  g) {...case GSCI
2420: 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09  S_TAG_CARDID:...
2430: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2440: 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63  AG_CARDID");...c
2450: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43  ase GSCIS_TAG_CC
2460: 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  C_VER:....return
2470: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  ("GSCIS_TAG_CCC_
2480: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  VER");...case GS
2490: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a  CIS_TAG_CCG_VER:
24a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24b0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b  S_TAG_CCG_VER");
24c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
24d0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65  G_CARDURL:....re
24e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24f0: 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73  CARDURL");...cas
2500: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
2510: 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  15:....return("G
2520: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22  SCIS_TAG_PKCS15"
2530: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2540: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
2550: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  EL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54  SCIS_TAG_REG_DAT
2570: 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73  A_MODEL");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
2590: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
25a0: 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  ("GSCIS_TAG_ACR_
25b0: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TABLE");...case 
25c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25d0: 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  PDU:....return("
25e0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25f0: 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  PDU");...case GS
2600: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2610: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
2630: 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20  CTION");...case 
2640: 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09  GSCIS_TAG_CT:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2660: 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_CT");...case 
2670: 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09  GSCIS_TAG_ST:...
2680: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2690: 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_ST");...case 
26a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
26b0: 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  C:....return("GS
26c0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22  CIS_TAG_NEXTCCC"
26d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
26e0: 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_FNAME:....re
26f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2700: 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  FNAME");...case 
2710: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a  GSCIS_TAG_MNAME:
2720: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2730: 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09  S_TAG_MNAME");..
2740: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2750: 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  LNAME:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  ("GSCIS_TAG_LNAM
2770: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2780: 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09  S_TAG_SUFFIX:...
2790: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
27a0: 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63  AG_SUFFIX");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ase GSCIS_TAG_GO
27c0: 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65  VT_AGENCY:....re
27d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
27e0: 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09  GOVT_AGENCY");..
27f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2800: 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72  BUREAU:....retur
2810: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
2820: 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EAU");...case GS
2830: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2840: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2850: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2860: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
2880: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2890: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
28a0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
28b0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09  CIS_TAG_TITLE:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63  TAG_TITLE");...c
28e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
28f0: 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72  ILDING:....retur
2900: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49  n("GSCIS_TAG_BUI
2910: 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20  LDING");...case 
2920: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2930: 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72  _ADDR1:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2950: 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63  ICE_ADDR1");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2970: 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72  FICE_ADDR2:....r
2980: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2990: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b  _OFFICE_ADDR2");
29a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29b0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09  G_OFFICE_CITY:..
29c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
29d0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22  TAG_OFFICE_CITY"
29e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
29f0: 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45  TAG_OFFICE_STATE
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a10: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a20: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2a30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a  CIS_TAG_OFFICE_Z
2a40: 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IP:....return("G
2a50: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2a60: 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ZIP");...case GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72  OUNTRY:....retur
2a90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2aa0: 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09  ICE_COUNTRY");..
2ab0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ac0: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09  OFFICE_PHONE:...
2ad0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22  AG_OFFICE_PHONE"
2af0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b00: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b10: 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  _EXT:....return(
2b20: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b30: 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09  E_PHONE_EXT");..
2b40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b50: 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72  OFFICE_FAX:....r
2b60: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b70: 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09  _OFFICE_FAX");..
2b80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b90: 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09  OFFICE_EMAIL:...
2ba0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2bb0: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22  AG_OFFICE_EMAIL"
2bc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bd0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a  TAG_OFFICE_ROOM:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2bf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2c00: 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  M");...case GSCI
2c10: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45  S_TAG_NONGOV_AGE
2c20: 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NCY:....return("
2c30: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2c40: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73  _AGENCY");...cas
2c50: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  e GSCIS_TAG_SSN_
2c60: 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72  DESIGNATOR:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c80: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22  _SSN_DESIGNATOR"
2c90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ca0: 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75  TAG_SSN:....retu
2cb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53  rn("GSCIS_TAG_SS
2cc0: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  N");...case GSCI
2cd0: 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65  S_TAG_DOB:....re
2ce0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2cf0: 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DOB");...case GS
2d00: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a  CIS_TAG_GENDER:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09  _TAG_GENDER");..
2d30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d40: 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  USERID:....retur
2d50: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45  n("GSCIS_TAG_USE
2d60: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2d70: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a  CIS_TAG_DOMAIN:.
2d80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d90: 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09  _TAG_DOMAIN");..
2da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2db0: 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74  PASSWORD:....ret
2dc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50  urn("GSCIS_TAG_P
2dd0: 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73  ASSWORD");...cas
2de0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2df0: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2e00: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45  "GSCIS_TAG_ISSUE
2e10: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2e20: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09  CIS_TAG_SERNO:..
2e30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2e40: 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63  TAG_SERNO");...c
2e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2e60: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
2e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2e80: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58  ase GSCIS_TAG_EX
2ea0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  PIRE_DATE:....re
2eb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2ec0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65  CARD_TYPE:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f00: 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63  CARD_TYPE");...c
2f10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ase GSCIS_TAG_SE
2f20: 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09  CURITY_CODE:....
2f30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f40: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22  G_SECURITY_CODE"
2f50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f60: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a  TAG_CARDID_AID:.
2f70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2f80: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22  _TAG_CARDID_AID"
2f90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fa0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fc0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
2fd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2fe0: 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45  S_TAG_CERT_ISSUE
2ff0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
3000: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  ("GSCIS_TAG_CERT
3010: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
3020: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3030: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45  CERT_EXPIRE_DATE
3040: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3050: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49  IS_TAG_CERT_EXPI
3060: 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09  RE_DATE");..}...
3070: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
3080: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
3090: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
30a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
30b0: 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20  ERR_TO_STR(LONG 
30c0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74  retcode) {..swit
30d0: 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09  ch (retcode) {..
30e0: 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55  .case SCARD_S_SU
30f0: 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CCESS:....return
3100: 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  ("SCARD_S_SUCCES
3110: 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  S");...case SCAR
3120: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  D_E_CANCELLED:..
3130: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3140: 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09  E_CANCELLED");..
3150: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3160: 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72  NT_DISPOSE:....r
3170: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3180: 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09  ANT_DISPOSE");..
3190: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
31a0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
31b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
31c0: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
31d0: 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63  NT_BUFFER");...c
31e0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
31f0: 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75  LID_ATR:....retu
3200: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
3210: 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73  LID_ATR");...cas
3220: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
3230: 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74  D_HANDLE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3250: 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09  ALID_HANDLE");..
3260: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3270: 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a  VALID_PARAMETER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3290: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41  D_E_INVALID_PARA
32a0: 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20  METER");...case 
32b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
32c0: 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72  TARGET:....retur
32d0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
32e0: 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63  ID_TARGET");...c
32f0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3300: 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65  LID_VALUE:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3320: 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09  VALID_VALUE");..
3330: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3340: 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75  _MEMORY:....retu
3350: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  rn("SCARD_E_NO_M
3360: 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20  EMORY");...case 
3370: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3380: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3390: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
33a0: 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  WN_READER");...c
33b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45  ase SCARD_E_TIME
33c0: 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OUT:....return("
33d0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22  SCARD_E_TIMEOUT"
33e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33f0: 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  E_SHARING_VIOLAT
3400: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
3410: 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f  SCARD_E_SHARING_
3420: 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63  VIOLATION");...c
3430: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  ase SCARD_E_NO_S
3440: 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74  MARTCARD:....ret
3450: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
3460: 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63  SMARTCARD");...c
3470: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3480: 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  OWN_CARD:....ret
3490: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
34a0: 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63  NOWN_CARD");...c
34b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ase SCARD_E_PROT
34c0: 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72  O_MISMATCH:....r
34d0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50  eturn("SCARD_E_P
34e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b  ROTO_MISMATCH");
34f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3500: 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65  NOT_READY:....re
3510: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3520: 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73  T_READY");...cas
3530: 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  e SCARD_E_SYSTEM
3540: 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72  _CANCELLED:....r
3550: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3560: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22  YSTEM_CANCELLED"
3570: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3580: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35a0: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
35b0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
35c0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41  ARD_E_READER_UNA
35d0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74  VAILABLE:....ret
35e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
35f0: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22  DER_UNAVAILABLE"
3600: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3610: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
3620: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3630: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54  CARD_W_UNSUPPORT
3640: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
3650: 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50  e SCARD_W_UNRESP
3660: 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09  ONSIVE_CARD:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3680: 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52  UNRESPONSIVE_CAR
3690: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
36a0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
36b0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
36c0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
36d0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
36e0: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
36f0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3700: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
3710: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3720: 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44  D_W_REMOVED_CARD
3730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3740: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52  RD_W_REMOVED_CAR
3750: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3760: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
3770: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  L:....return("SC
3780: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3790: 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ALL");...case SC
37a0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53  ARD_E_READER_UNS
37b0: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
37c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
37d0: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  DER_UNSUPPORTED"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37f0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3800: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3810: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45  CARD_E_DUPLICATE
3820: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
3830: 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  e SCARD_E_CARD_U
3840: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
3850: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3860: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  ARD_UNSUPPORTED"
3870: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3880: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09  E_NO_SERVICE:...
3890: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38a0: 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09  _NO_SERVICE");..
38b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45  .case SCARD_E_SE
38c0: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09  RVICE_STOPPED:..
38d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38e0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
38f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3900: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
3910: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75  FEATURE:....retu
3920: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55  rn("SCARD_E_UNSU
3930: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22  PPORTED_FEATURE"
3940: 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f  );.#ifdef SCARD_
3950: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a  W_INSERTED_CARD.
3960: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49  ..case SCARD_W_I
3970: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09  NSERTED_CARD:...
3980: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
3990: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29  _INSERTED_CARD")
39a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
39b0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
39c0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63  RS_AVAILABLE...c
39d0: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  ase SCARD_E_NO_R
39e0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
39f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a00: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3a10: 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e  AVAILABLE");.#en
3a20: 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  dif..}...return(
3a30: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
3a40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3a50: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3a60: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
3a70: 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29  (uint16_t objid)
3a80: 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69   {..switch (obji
3a90: 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30  d) {...case 0x20
3aa0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3ab0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3ac0: 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09  GENERALINFO");..
3ad0: 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09  .case 0x2100:...
3ae0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3af0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b00: 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  SONALINFO");...c
3b10: 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72  ase 0x3000:....r
3b20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3b30: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3b40: 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20  NTROL");...case 
3b50: 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x4000:....retur
3b60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b70: 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63  JID_LOGIN");...c
3b80: 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72  ase 0x5000:....r
3b90: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ba0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
3bb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30  ");...case 0x600
3bc0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3bd0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
3be0: 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63  IOMETRICS");...c
3bf0: 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72  ase 0x7000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
3c20: 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65  IGCERT");...case
3c30: 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75   0x0200:....retu
3c40: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3c50: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22  BJID_CAC_PERSON"
3c60: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32  );...case 0x0202
3c70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3c80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3c90: 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  C_BENEFITS");...
3ca0: 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09  case 0x0203:....
3cb0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cc0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
3cd0: 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  ERBENEFITS");...
3ce0: 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09  case 0x0201:....
3cf0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d00: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d10: 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65  SONNEL");...case
3d20: 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75   0x02FE:....retu
3d30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3d40: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
3d50: 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e  ");..}....return
3d60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
3d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3d80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
3d90: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
3da0: 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74  STR(uint8_t appt
3db0: 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  ype) {..switch (
3dc0: 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73  apptype) {...cas
3dd0: 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72  e 0x00:....retur
3de0: 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73  n("NONE");...cas
3df0: 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72  e 0x01:....retur
3e00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e10: 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63  P_GENERIC");...c
3e20: 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74  ase 0x02:....ret
3e30: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e40: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3e50: 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72  e 0x03:....retur
3e60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e70: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3e90: 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09  ;...case 0x04:..
3ea0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3eb0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3ec0: 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09  ..case 0x05:....
3ed0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ee0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3ef0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3f00: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
3f10: 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  06:....return("C
3f20: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f30: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
3f40: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3f50: 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e   0x07:....return
3f60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3f70: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
3f80: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3f90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3fa0: 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  KI");..}...retur
3fb0: 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a  n("INVALID");.}.
3fc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3fd0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3fe0: 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f  _FUNC_ATTRIBUTE_
3ff0: 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42  TO_STR(CK_ATTRIB
4000: 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b  UTE_TYPE attr) {
4010: 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29 20  ..switch (attr) 
4020: 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  {...case CKA_CLA
4030: 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SS:....return("C
4040: 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61  KA_CLASS");...ca
4050: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
4060: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b  .return("CKA_TOK
4070: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
4080: 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74  _PRIVATE:....ret
4090: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45  urn("CKA_PRIVATE
40a0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c  ");...case CKA_L
40b0: 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABEL:....return(
40c0: 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09  "CKA_LABEL");...
40d0: 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41  case CKA_APPLICA
40e0: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  TION:....return(
40f0: 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e  "CKA_APPLICATION
4100: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4110: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
4120: 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09  "CKA_VALUE");...
4130: 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f  case CKA_OBJECT_
4140: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
4150: 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a  KA_OBJECT_ID");.
4160: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
4170: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
4180: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54  return("CKA_CERT
4190: 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a  IFICATE_TYPE");.
41a0: 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
41b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
41c0: 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  A_ISSUER");...ca
41d0: 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  se CKA_SERIAL_NU
41e0: 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  MBER:....return(
41f0: 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42  "CKA_SERIAL_NUMB
4200: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4210: 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72  _AC_ISSUER:....r
4220: 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53  eturn("CKA_AC_IS
4230: 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  SUER");...case C
4240: 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74  KA_OWNER:....ret
4250: 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29  urn("CKA_OWNER")
4260: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54  ;...case CKA_ATT
4270: 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75  R_TYPES:....retu
4280: 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50  rn("CKA_ATTR_TYP
4290: 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ES");...case CKA
42a0: 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74  _TRUSTED:....ret
42b0: 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44  urn("CKA_TRUSTED
42c0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b  ");...case CKA_K
42d0: 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  EY_TYPE:....retu
42e0: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45  rn("CKA_KEY_TYPE
42f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4300: 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72  UBJECT:....retur
4310: 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29  n("CKA_SUBJECT")
4320: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ;...case CKA_ID:
4330: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4340: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ID");...case CKA
4350: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72  _SENSITIVE:....r
4360: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49  eturn("CKA_SENSI
4370: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
4380: 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72  KA_ENCRYPT:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59  eturn("CKA_ENCRY
43a0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
43b0: 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _DECRYPT:....ret
43c0: 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54  urn("CKA_DECRYPT
43d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57  ");...case CKA_W
43e0: 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  RAP:....return("
43f0: 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61  CKA_WRAP");...ca
4400: 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09  se CKA_UNWRAP:..
4410: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e  ..return("CKA_UN
4420: 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43  WRAP");...case C
4430: 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75  KA_SIGN:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a  rn("CKA_SIGN");.
4450: 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f  ..case CKA_SIGN_
4460: 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75  RECOVER:....retu
4470: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43  rn("CKA_SIGN_REC
4480: 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  OVER");...case C
4490: 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65  KA_VERIFY:....re
44a0: 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59  turn("CKA_VERIFY
44b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
44c0: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09  ERIFY_RECOVER:..
44d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
44e0: 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a  RIFY_RECOVER");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56  ..case CKA_DERIV
4500: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4510: 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61  A_DERIVE");...ca
4520: 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54  se CKA_START_DAT
4530: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4540: 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a  A_START_DATE");.
4550: 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44  ..case CKA_END_D
4560: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4570: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a  CKA_END_DATE");.
4580: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
4590: 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  US:....return("C
45a0: 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09  KA_MODULUS");...
45b0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
45c0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
45d0: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49  ("CKA_MODULUS_BI
45e0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
45f0: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4600: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4610: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4630: 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a  RIVATE_EXPONENT:
4640: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4650: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54  PRIVATE_EXPONENT
4660: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4670: 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72  RIME_1:....retur
4680: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29  n("CKA_PRIME_1")
4690: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
46a0: 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_2:....return(
46b0: 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a  "CKA_PRIME_2");.
46c0: 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e  ..case CKA_EXPON
46d0: 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e  ENT_1:....return
46e0: 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  ("CKA_EXPONENT_1
46f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4700: 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65  XPONENT_2:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4720: 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_2");...case C
4730: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a  KA_COEFFICIENT:.
4740: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4750: 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09  OEFFICIENT");...
4760: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a  case CKA_PRIME:.
4770: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4780: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
4790: 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09  KA_SUBPRIME:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50  return("CKA_SUBP
47b0: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
47c0: 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75  KA_BASE:....retu
47d0: 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a  rn("CKA_BASE");.
47e0: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
47f0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4800: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  ("CKA_PRIME_BITS
4810: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4820: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09  UB_PRIME_BITS:..
4830: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4840: 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a  B_PRIME_BITS");.
4850: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
4860: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4870: 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  ("CKA_VALUE_BITS
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4890: 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74  ALUE_LEN:....ret
48a0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c  urn("CKA_VALUE_L
48b0: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
48c0: 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09  _EXTRACTABLE:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54  .return("CKA_EXT
48e0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
48f0: 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09  se CKA_LOCAL:...
4900: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43  .return("CKA_LOC
4910: 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AL");...case CKA
4920: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4930: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4940: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4950: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43  ABLE");...case C
4960: 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54  KA_ALWAYS_SENSIT
4970: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
4980: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49  CKA_ALWAYS_SENSI
4990: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
49a0: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
49b0: 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28  NISM:....return(
49c0: 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43  "CKA_KEY_GEN_MEC
49d0: 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65  HANISM");...case
49e0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
49f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4a00: 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09  MODIFIABLE");...
4a10: 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50  case CKA_ECDSA_P
4a20: 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e  ARAMS:....return
4a30: 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41  ("CKA_ECDSA_PARA
4a40: 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  MS");...case CKA
4a50: 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65  _EC_POINT:....re
4a60: 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49  turn("CKA_EC_POI
4a70: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4a80: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a  _SECONDARY_AUTH:
4a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4aa0: 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29  SECONDARY_AUTH")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54  ;...case CKA_AUT
4ac0: 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09  H_PIN_FLAGS:....
4ad0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48  return("CKA_AUTH
4ae0: 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09  _PIN_FLAGS");...
4af0: 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54  case CKA_HW_FEAT
4b00: 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  URE_TYPE:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54  urn("CKA_HW_FEAT
4b20: 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  URE_TYPE");...ca
4b30: 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  se CKA_RESET_ON_
4b40: 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  INIT:....return(
4b50: 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e  "CKA_RESET_ON_IN
4b60: 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  IT");...case CKA
4b70: 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72  _HAS_RESET:....r
4b80: 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52  eturn("CKA_HAS_R
4b90: 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43  ESET");...case C
4ba0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45  KA_VENDOR_DEFINE
4bb0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4bc0: 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44  A_VENDOR_DEFINED
4bd0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
4be0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23  "UNKNOWN");.}..#
4bf0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
4c00: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
4c10: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
4c20: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4c30: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
4c40: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
4c50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
4c60: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
4c70: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
4c80: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
4c90: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
4ca0: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
4cb0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
4cc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cd0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
4ce0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
4cf0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
4d00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4d10: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
4d20: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4d30: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
4d40: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
4d50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4d60: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
4d70: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4d80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
4d90: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4da0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4db0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4dc0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
4dd0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4de0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4df0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
4e10: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e20: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e30: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e40: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
4e90: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4ea0: 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a  ISABLED".#endif.
4eb0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4ec0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  csc_identity {..
4ed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70  unsigned char ap
4ee0: 70 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36  plet[7];..uint16
4ef0: 5f 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f  _t file;...size_
4f00: 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
4f10: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  n;..unsigned cha
4f20: 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
4f30: 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a  ..ssize_t keysiz
4f40: 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  e;.};..struct ca
4f50: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a  ckey_identity {.
4f60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4f70: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
4f80: 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43  sc_identity;...C
4f90: 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74  K_ATTRIBUTE *att
4fa0: 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f  ributes;..CK_ULO
4fb0: 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f  NG attributes_co
4fc0: 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  unt;.};..struct 
4fd0: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b  cackey_session {
4fe0: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09  ..int active;...
4ff0: 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
5000: 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74  D;...CK_STATE st
5010: 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66  ate;..CK_FLAGS f
5020: 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  lags;..CK_ULONG 
5030: 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09  ulDeviceError;..
5040: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
5050: 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f  lication;..CK_NO
5060: 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73  TIFY Notify;...s
5070: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5080: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
5090: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
50a0: 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  g identities_cou
50b0: 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68  nt;...int search
50c0: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54  _active;..CK_ATT
50d0: 52 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63  RIBUTE_PTR searc
50e0: 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f  h_query;..CK_ULO
50f0: 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f  NG search_query_
5100: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64  count;..unsigned
5110: 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72   long search_cur
5120: 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e  r_id;...int sign
5130: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
5140: 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e  HANISM_TYPE sign
5150: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f  _mechanism;..CK_
5160: 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75  BYTE_PTR sign_bu
5170: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
5180: 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09  g sign_buflen;..
5190: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
51a0: 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72  gn_bufused;..str
51b0: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
51c0: 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69  ity *sign_identi
51d0: 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70  ty;...int decryp
51e0: 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45  t_active;..CK_ME
51f0: 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63  CHANISM_TYPE dec
5200: 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a  rypt_mechanism;.
5210: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63  .CK_VOID_PTR dec
5220: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a  rypt_mech_parm;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70  .CK_ULONG decryp
5240: 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a  t_mech_parmlen;.
5250: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
5260: 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74  dentity *decrypt
5270: 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73  _identity;.};..s
5280: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5290: 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  t {..int active;
52a0: 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a  ..int internal;.
52b0: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
52c0: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
52d0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
52e0: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
52f0: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
5300: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
5310: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
5320: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a  n_need_hw_lock;.
5330: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
5340: 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b  ;...CK_FLAGS tok
5350: 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69  en_flags;...unsi
5360: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
5370: 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  ;...DWORD protoc
5380: 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69  ol;...unsigned i
5390: 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f  nt cached_certs_
53a0: 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63  count;..struct c
53b0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
53c0: 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74  ity *cached_cert
53d0: 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65  s;.};..typedef e
53e0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
53f0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20  V_APP_GENERIC = 
5400: 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x01,..CACKEY_TL
5410: 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20  V_APP_SKI     = 
5420: 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x02,..CACKEY_TL
5430: 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20  V_APP_PKI     = 
5440: 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  0x04.} cackey_tl
5450: 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65  v_apptype;..type
5460: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
5470: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e  EY_TLV_OBJID_GEN
5480: 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d  ERALINFO       =
5490: 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x2000,..CACKEY
54a0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45  _TLV_OBJID_PROPE
54b0: 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30  RSONALINFO   = 0
54c0: 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2100,..CACKEY_T
54d0: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43  LV_OBJID_ACCESSC
54e0: 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33  ONTROL     = 0x3
54f0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5500: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20  _OBJID_LOGIN    
5510: 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30           = 0x400
5520: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5530: 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20  BJID_CARDINFO   
5540: 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c         = 0x5000,
5550: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5560: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20  ID_BIOMETRICS   
5570: 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09       = 0x6000,..
5580: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5590: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20  _DIGITALSIGCERT 
55a0: 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41     = 0x7000,..CA
55b0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
55c0: 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20  AC_PERSON       
55d0: 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b   = 0x0200,..CACK
55e0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
55f0: 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d  _BENEFITS      =
5600: 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59   0x0202,..CACKEY
5610: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
5620: 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30  THERBENEFITS = 0
5630: 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54  x0203,..CACKEY_T
5640: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
5650: 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30  SONNEL     = 0x0
5660: 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  201,..CACKEY_TLV
5670: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
5680: 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46  RT       = 0x02F
5690: 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f  E.} cackey_tlv_o
56a0: 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65  bjectid;..typede
56b0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
56c0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
56d0: 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41  SENT    = 1,..CA
56e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c              = 0,
5700: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5710: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20  GENERIC         
5720: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -1,..CACKEY_PC
5730: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20  SC_E_BADPIN     
5740: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b       = -2,..CACK
5750: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
5760: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a            = -3,.
5770: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  .CACKEY_PCSC_E_N
5780: 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d  EEDLOGIN       =
5790: 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -4,..CACKEY_PCS
57a0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20  C_E_TOKENABSENT 
57b0: 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45      = -6,..CACKE
57c0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20  Y_PCSC_E_RETRY  
57d0: 20 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20           = -7.} 
57e0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72  cackey_ret;..str
57f0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
5800: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e  ardurl {..unsign
5810: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72  ed char        r
5820: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74  id[5];..cackey_t
5830: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70  lv_apptype   app
5840: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  type;..cackey_tl
5850: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65  v_objectid  obje
5860: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  ctid;..cackey_tl
5870: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69  v_objectid  appi
5880: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  d;..unsigned cha
5890: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a  r        pinid;.
58a0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
58b0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74  y_tlv_entity;.st
58c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
58d0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f  entity {..uint8_
58e0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  t tag;..size_t l
58f0: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ength;...union {
5900: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a  ...void *value;.
5910: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5920: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c  tlv_cardurl *val
5930: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69  ue_cardurl;...ui
5940: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65  nt8_t value_byte
5950: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63  ;..};...struct c
5960: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
5970: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20   *_next;.};../* 
5980: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61  CACKEY Global Ha
5990: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
59a0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67  void *cackey_big
59b0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  lock = NULL;.sta
59c0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
59d0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79  y_session cackey
59e0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a  _sessions[128];.
59f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5a00: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79  ckey_slot cackey
5a10: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61  _slots[128];.sta
5a20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69  tic int cackey_i
5a30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
5a40: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5a50: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
5a60: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   0;.CK_C_INITIAL
5a70: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f  IZE_ARGS cackey_
5a80: 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61  args;../** Extra
5a90: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f   certificates to
5aa0: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65   include in toke
5ab0: 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63  n **/.struct cac
5ac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
5ad0: 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20  y extra_certs[] 
5ae0: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61  = {.#include "ca
5af0: 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72  ckey_builtin_cer
5b00: 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53  ts.h".};../* PCS
5b10: 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73  C Global Handles
5b20: 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41   */.static LPSCA
5b30: 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79  RDCONTEXT cackey
5b40: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
5b50: 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73  ULL;..static uns
5b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65  igned long cacke
5b70: 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69  y_getversion(voi
5b80: 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73  d) {..static uns
5b90: 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61  igned long retva
5ba0: 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e  l = 255;..unsign
5bb0: 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20  ed long major = 
5bc0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  0;..unsigned lon
5bd0: 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68  g minor = 0;..ch
5be0: 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20  ar *major_str = 
5bf0: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e  NULL;..char *min
5c00: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a  or_str = NULL;..
5c10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5c20: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
5c30: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d  ...if (retval !=
5c40: 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   255) {...CACKEY
5c50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
5c60: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28  eturning 0x%lx (
5c70: 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61  cached).", retva
5c80: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
5c90: 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  tval);..}...retv
5ca0: 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  al = 0;..#ifdef 
5cb0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
5cc0: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74          major_st
5cd0: 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53  r = PACKAGE_VERS
5ce0: 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  ION;..if (major_
5cf0: 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20  str) {..        
5d00: 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28  major = strtoul(
5d10: 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f  major_str, &mino
5d20: 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69  r_str, 10);....i
5d30: 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a  f (minor_str) {.
5d40: 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f  ...minor = strto
5d50: 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31  ul(minor_str + 1
5d60: 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d  , NULL, 10);...}
5d70: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28  ..}...retval = (
5d80: 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28  major << 16) | (
5d90: 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e  minor << 8);.#en
5da0: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
5db0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
5dc0: 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74  ning 0x%lx", ret
5dd0: 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
5de0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43  etval);.}../* PC
5df0: 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63  /SC Related Func
5e00: 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53  tions */./*. * S
5e10: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76  YNPOSIS. *     v
5e20: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
5e30: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
5e40: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5e50: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5e60: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5e70: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
5e80: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
5e90: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
5ea0: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66  on disconnects f
5eb0: 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20  rom all cards.. 
5ec0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
5ed0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
5ee0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
5ef0: 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  id) {..uint32_t 
5f00: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
5f10: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
5f20: 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64  ed.");...for (id
5f30: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
5f40: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
5f50: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
5f60: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
5f70: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
5f80: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5f90: 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f  internal) {..../
5fa0: 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20  * Skip internal 
5fb0: 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74  slots */....cont
5fc0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
5fd0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
5fe0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
5ff0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43  nected) {....CAC
6000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6010: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ("SCardDisconnec
6020: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20  t(%lu) called", 
6030: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6040: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  idx);.....SCardD
6050: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79  isconnect(cackey
6060: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
6070: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
6080: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09  VE_CARD);...}...
6090: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
60a0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a  s[idx].label) {.
60b0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
60c0: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
60d0: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
60e0: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
60f0: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
6100: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6110: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
6120: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
6130: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
6140: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
6150: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
6160: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
6170: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
6180: 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  = 0;....if (cack
6190: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
61a0: 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45  tive) {....CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
61c0: 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73  Marking active s
61d0: 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67  lot %lu as being
61e0: 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e   reset", (unsign
61f0: 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09  ed long) idx);..
6200: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  .}....cackey_slo
6210: 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73  ts[idx].slot_res
6220: 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43  et = 1;..}...CAC
6230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6240: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a  ("Returning");..
6250: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
6260: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6270: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6280: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6290: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
62a0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
62b0: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
62c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
62d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
62e0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
62f0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6300: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6310: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6320: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6330: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e  is function conn
6340: 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53  ects to the PC/S
6350: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6360: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ager and updates
6370: 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62   the. *     glob
6380: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a  al handle.. *. *
6390: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
63a0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
63b0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
63c0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f  .LONG scard_est_
63d0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66  context_ret;.#if
63e0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
63f0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f  VALIDCONTEXT..LO
6400: 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  NG scard_isvalid
6410: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
6420: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6430: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
6440: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6450: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
6460: 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63   {...cackey_pcsc
6470: 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63  _handle = malloc
6480: 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
6490: 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09  pcsc_handle));..
64a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
64b0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
64c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
64d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
64e0: 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  to malloc() fail
64f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
6500: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
6510: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
6520: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
6530: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6540: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
6550: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
6560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6570: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6580: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
6590: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
65a0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
65b0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
65c0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
65d0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
65e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
65f0: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
6600: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6610: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6620: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
6630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6640: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
6650: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
6660: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
6670: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
6680: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
6690: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
66a0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
66b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
66c0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
66d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
66e0: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
66f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6700: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
6710: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
6720: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
6730: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6740: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6750: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6760: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a  ENERIC);...}..}.
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
6790: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
67a0: 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61  RINTF("SCardIsVa
67b0: 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  lidContext() cal
67c0: 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73  led");..scard_is
67d0: 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72  valid_ret = SCar
67e0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
67f0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
6800: 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64  dle);..if (scard
6810: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20  _isvalid_ret != 
6820: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6830: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6840: 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65  G_PRINTF("Handle
6850: 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61   has become inva
6860: 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69  lid (SCardIsVali
6870: 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c  dContext = %s/%l
6880: 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65  i), trying to re
6890: 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20  -establish...", 
68a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
68b0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
68c0: 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  R(scard_isvalid_
68d0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
68e0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b  rd_isvalid_ret);
68f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6900: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
6910: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
6920: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
6930: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6940: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
6950: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
6960: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
6970: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
6980: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6990: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
69a0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
69b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
69c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
69d0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
69e0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
69f0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
6a00: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
6a10: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6a20: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
6a30: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
6a40: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
6a50: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6a60: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
6a70: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6a80: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
6a90: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6aa0: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6ab0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
6ac0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
6ad0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
6ae0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
6af0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6b00: 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  C);...}....CACKE
6b10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6b20: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20  Handle has been 
6b30: 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29  re-established")
6b40: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ;..}.#endif...CA
6b50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6b60: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63  F("Sucessfully c
6b70: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53  onnected to PC/S
6b80: 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  C, returning in 
6b90: 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74  success");...ret
6ba0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6bb0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
6bc0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
6bd0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6be0: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
6bf0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
6c00: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
6c10: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
6c20: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
6c30: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
6c40: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
6c50: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
6c60: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
6c70: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
6c80: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6c90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73  his function dis
6ca0: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68  connects from th
6cb0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
6cc0: 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75  on manager and u
6cd0: 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68  pdates. *     th
6ce0: 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e  e global handle.
6cf0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
6d00: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
6d10: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
6d20: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73  (void) {..LONG s
6d30: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6d40: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
6d50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6d60: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
6d70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6d80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
6d90: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6da0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61  _S_OK);..}...sca
6db0: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
6dc0: 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73  et = SCardReleas
6dd0: 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79  eContext(*cackey
6de0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a  _pcsc_handle);..
6df0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6e00: 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65  _handle) {...fre
6e10: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
6e20: 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65  ndle);.....cacke
6e30: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6e40: 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  NULL;..}...if (s
6e50: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6e60: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6e70: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74  SUCCESS) {...ret
6e80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6e90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
6ea0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6eb0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6ec0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6ed0: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
6ee0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
6ef0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6f00: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
6f10: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6f20: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6f30: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6f40: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6f50: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6f60: 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
6f70: 6c 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62  lot has having b
6f80: 65 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61  een reset, to la
6f90: 74 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75  ter be cleaned u
6fa0: 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75  p.. *     Cleanu
6fb0: 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  p only happens w
6fc0: 68 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c  hen a PKCS#11 cl
6fd0: 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e  ient calls C_Fin
6fe0: 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a  dObjectsInit.. *
6ff0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
7000: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
7010: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
7020: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7030: 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d  ) {..if (slot ==
7040: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
7050: 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  n;..}...CACKEY_D
7060: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
7070: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
7080: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7090: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61  nnected) {...SCa
70a0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
70b0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
70c0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
70d0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74  ..}...slot->slot
70e0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f  _reset = 1;..slo
70f0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7100: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f  nected = 0;..slo
7110: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
7120: 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
7130: 52 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  RED;...CACKEY_DE
7140: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
7150: 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75  rning.");...retu
7160: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
7170: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e  POSIS. *     LON
7180: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  G cackey_reconne
7190: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
71a0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
71b0: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f  , DWORD default_
71c0: 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52  protocol, LPDWOR
71d0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
71e0: 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  col);. *. * ARGU
71f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
7200: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
7210: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
7220: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
7230: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f  to. *. *     DWO
7240: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7250: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50  col. *         P
7260: 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d  rotocol to attem
7270: 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 20  pt first. *. *  
7280: 20 20 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63     LPDWORD selec
7290: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20  ted_protocol. * 
72a0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 72          [OUT] Pr
72b0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 0a  otocol selected.
72c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
72d0: 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65  UE. *     The re
72e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
72f0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7300: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
7310: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
7320: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
7330: 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e  round SCardRecon
7340: 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20  nect(). *. *    
7350: 20 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e   The SCardReconn
7360: 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63  ect() function c
7370: 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  all will be call
7380: 65 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68  ed first with th
7390: 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65  e. *     dwPrefe
73a0: 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66  rredProtocols of
73b0: 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63   "default_protoc
73c0: 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61  ol".  If that ca
73d0: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20  ll returns. *   
73e0: 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f    SCARD_E_PROTO_
73f0: 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61  MISMATCH try aga
7400: 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63  in with a protoc
7410: 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66  ol of T=0, and f
7420: 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68  ailing. *     th
7430: 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73  at T=1.. *. */.s
7440: 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65  tatic LONG cacke
7450: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
7460: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7470: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44  lot *slot, DWORD
7480: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7490: 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63  l, LPDWORD selec
74a0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ted_protocol) {.
74b0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
74c0: 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f 63 6f  _ret;...scard_co
74d0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
74e0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
74f0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
7500: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66  HARE_SHARED, def
7510: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53  ault_protocol, S
7520: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
7530: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7540: 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64  ol);...if (scard
7550: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7560: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7570: 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TCH) {...CACKEY_
7580: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7590: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
75a0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
75b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
75c0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
75d0: 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63   T=0")...scard_c
75e0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
75f0: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
7600: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7610: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
7620: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c  ARD_PROTOCOL_T0,
7630: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7640: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
7650: 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63  ocol);....if (sc
7660: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7670: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7680: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43  SMATCH) {....CAC
7690: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
76a0: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
76b0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
76c0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
76d0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
76e0: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63  just T=1")....sc
76f0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7700: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7710: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7720: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7730: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7740: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T1, SCARD_RESE
7750: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64  T_CARD, selected
7760: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a  _protocol);...}.
7770: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72  .}...return(scar
7780: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a  d_conn_ret);.}..
7790: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
77a0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
77b0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
77c0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
77d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
77e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
77f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
7800: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
7810: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
7820: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
7830: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
7840: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7850: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
7860: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
7870: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
7880: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
7890: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
78a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
78b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
78c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
78d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
78e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
78f0: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
7900: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
7910: 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  t;..DWORD protoc
7920: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ol;..LONG scard_
7930: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
7940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7950: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7960: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
7970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7980: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
7990: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
79a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
79b0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
79c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
79d0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
79e0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
79f0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
7a00: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
7a10: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
7a20: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
7a30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a40: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
7a50: 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
7a60: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
7a70: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
7a80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7a90: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7aa0: 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20  ../* Connect to 
7ab0: 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65  reader, if neede
7ac0: 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d  d */..if (!slot-
7ad0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7ae0: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
7af0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
7b00: 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20  CardConnect(%s) 
7b10: 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70  called", slot->p
7b20: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73  csc_reader);...s
7b30: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7b40: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7b50: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7b60: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7b70: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7b80: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7b90: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
7ba0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
7bb0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7bc0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7bd0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7be0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7bf0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7c00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7c10: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7c20: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7c30: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7c40: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7c50: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a  with just T=0").
7c60: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7c70: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7c80: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7c90: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7ca0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7cb0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7cc0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7cd0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7ce0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7cf0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7d00: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7d10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7d20: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
7d30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7d40: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7d50: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7d60: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7d70: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
7d80: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
7d90: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7da0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7db0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7dc0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7dd0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7de0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7df0: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
7e00: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7e10: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
7e20: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7e30: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  == SCARD_W_UNPOW
7e40: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09  ERED_CARD) {....
7e50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7e60: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
7e70: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7e80: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
7e90: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  ARD, trying to r
7ea0: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a  e-connect...");.
7eb0: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7ec0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
7ed0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
7ee0: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
7ef0: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
7f00: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43  SHARE_DIRECT, SC
7f10: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
7f20: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
7f30: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
7f40: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
7f50: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
7f60: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7f70: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7f80: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
7f90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7fb0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7fc0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7fd0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7fe0: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64   T=0").....scard
7ff0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8000: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8010: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8020: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8030: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
8040: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
8050: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
8060: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
8070: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  col);......if (s
8080: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09  ISMATCH) {......
80b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
80c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
80d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
80e0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
80f0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
8100: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09   just T=1").....
8110: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
8120: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
8130: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
8140: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8150: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8160: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
8170: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
8180: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8190: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09  &protocol);.....
81a0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64  }....}.....scard
81b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  _conn_ret = cack
81c0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
81d0: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c  d(slot, protocol
81e0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
81f0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
8200: 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44  onn_ret != SCARD
8210: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
8220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8230: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
8240: 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c   to card failed,
8250: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
8260: 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e  ilure (SCardConn
8270: 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22  ect() = %s/%li)"
8280: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
8290: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
82a0: 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  STR(scard_conn_r
82b0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
82c0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09  d_conn_ret);....
82d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
82e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
82f0: 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73  ..}....slot->pcs
8300: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
8310: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72   = 1;...slot->tr
8320: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8330: 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 0;...slot->tra
8340: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8350: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f  _lock = 0;...slo
8360: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
8370: 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74  otocol;..}...ret
8380: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8390: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
83a0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
83b0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
83c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
83d0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
83e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
83f0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8400: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
8410: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
8420: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
8430: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
8440: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
8450: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8460: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
8470: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
8480: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8490: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
84a0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
84b0: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61  *     The transa
84c0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
84d0: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67  terminated using
84e0: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61   "cackey_end_tra
84f0: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f  nsaction". *. */
8500: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
8510: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
8520: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
8530: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8540: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
8550: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ret cackey_conn_
8560: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  ret;..LONG scard
8570: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
8580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8590: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
85a0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
85b0: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
85c0: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
85d0: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65   (cackey_conn_re
85e0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
85f0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
8600: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8610: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
8620: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
8630: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8640: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8650: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8660: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8670: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b  ansaction_depth+
8680: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  +;...if (slot->t
8690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
86a0: 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74   > 1 && !slot->t
86b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
86c0: 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43  hw_lock) {...CAC
86d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86e0: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74  ("Already in a t
86f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66  ransaction, perf
8700: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e  orming no action
8710: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69   (new depth = %i
8720: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
8730: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
8740: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8750: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
8760: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8770: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
8780: 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e   0;...scard_tran
8790: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67  s_ret = SCardBeg
87a0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  inTransaction(sl
87b0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a  ot->pcsc_card);.
87c0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
87d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
87e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
87f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8800: 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69  ("Unable to begi
8810: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
8820: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8830: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8840: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8850: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
8860: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8870: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67  "Sucessfully beg
8880: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  an transaction o
8890: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
88a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
88b0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
88c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
88d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
88e0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
88f0: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
8900: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
8910: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8920: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
8930: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8940: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8950: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8960: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8970: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8980: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8990: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
89a0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
89b0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
89c0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
89d0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
89e0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
89f0: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
8a00: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
8a10: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
8a20: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
8a30: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8a40: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8a50: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8a60: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8a70: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
8a80: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8a90: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8aa0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8ab0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
8ac0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8ad0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
8ae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8af0: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
8b00: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
8b10: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
8b20: 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69   on card");....i
8b30: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
8b40: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8b50: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8b60: 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61  G_PRINTF("Decrea
8b70: 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  sing transaction
8b80: 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e   depth and askin
8b90: 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65  g for a hardware
8ba0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78   lock on the nex
8bb0: 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  t begin transact
8bc0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
8bd0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
8be0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8bf0: 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74  th);.....slot->t
8c00: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8c10: 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74  --;.....if (slot
8c20: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8c30: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73  pth > 0) {.....s
8c40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8c50: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
8c60: 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  1;....}...}....r
8c70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8c80: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8c90: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8ca0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8cb0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
8cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
8cd0: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
8ce0: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
8cf0: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
8d00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8d10: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8d20: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8d30: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
8d40: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8d50: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
8d60: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
8d70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
8d80: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
8d90: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
8da0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
8db0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
8dc0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
8dd0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
8de0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
8df0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8e00: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8e10: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
8e20: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
8e30: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
8e40: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
8e50: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
8e60: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
8e70: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
8e80: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
8e90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8ea0: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
8eb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
8ec0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8ed0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8ee0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8ef0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
8f00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
8f10: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
8f20: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
8f30: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8f40: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8f50: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8f60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8f70: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
8f80: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
8f90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
8fa0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
8fb0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
8fc0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8fd0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
8fe0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
8ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9000: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9010: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9020: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
9030: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
9040: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9050: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
9060: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
9070: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
9080: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9090: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
90a0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
90b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
90c0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
90d0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
90e0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
90f0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
9100: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9110: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
9120: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
9130: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
9140: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
9150: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
9160: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
9170: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
9180: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9190: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
91a0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
91b0: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
91c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
91d0: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
91e0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
91f0: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
9200: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9210: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
9220: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
9230: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
9240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9250: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
9260: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
9270: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
9280: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9290: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
92a0: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
92b0: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
92c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
92d0: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
92e0: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
92f0: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
9300: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9310: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
9320: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
9330: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
9340: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
9350: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
9360: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
9370: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
9380: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
9390: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
93a0: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
93b0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
93c0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
93d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
93e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
93f0: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
9400: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
9410: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9420: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
9430: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
9440: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
9450: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
9460: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
9470: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
9480: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
9490: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
94a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
94b0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
94c0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
94d0: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
94e0: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
94f0: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9500: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9510: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
9520: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
9530: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9540: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
9550: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
9560: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
9570: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
9580: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
9590: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
95a0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
95b0: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
95c0: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
95d0: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
95e0: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
95f0: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
9600: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
9610: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
9620: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
9630: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9640: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
9650: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9660: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
9670: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
9680: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
9690: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
96a0: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
96b0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
96c0: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
96d0: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
96e0: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
96f0: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
9700: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
9710: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
9720: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
9730: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
9740: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
9750: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
9760: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9770: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
9780: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
9790: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
97a0: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
97b0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
97c0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
97d0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
97e0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
97f0: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20  OK           On 
9800: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9820: 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72  ERIC      On err
9830: 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  or. *     CACKEY
9840: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
9850: 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64  ENT  If the send
9860: 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75  ing failed becau
9870: 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a  se the token is.
9880: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e    absent. *. * N
98b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
98c0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63   function will c
98d0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43  onnect to the PC
98e0: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
98f0: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20  anager via. *   
9900: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f    cackey_pcsc_co
9910: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65  nnect() if neede
9920: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20  d.. *. *     It 
9930: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
9940: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20  the card in the 
9950: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20  reader attached 
9960: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20  to the slot. *  
9970: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49     specified.  I
9980: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74  t will reconnect
9990: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20   to the card if 
99a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
99b0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e  *     goes away.
99c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
99d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
99e0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
99f0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
9a00: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
9a10: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
9a20: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
9a30: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
9a40: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
9a50: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
9a60: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e  d int lc, unsign
9a70: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
9a80: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20  nsigned int le, 
9a90: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9aa0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
9ab0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
9ac0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
9ad0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
9ae0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
9af0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
9b00: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
9b10: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53  pdata_len;..LPCS
9b20: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20  CARD_IO_REQUEST 
9b30: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f  pioSendPci;..DWO
9b40: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57  RD protocol;..DW
9b50: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65  ORD xmit_len, re
9b60: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  cv_len;..LONG sc
9b70: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63  ard_xmit_ret, sc
9b80: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
9b90: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31  .BYTE xmit_buf[1
9ba0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31  024], recv_buf[1
9bb0: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f  024];..int pcsc_
9bc0: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73  connect_ret, pcs
9bd0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09  c_getresp_ret;..
9be0: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
9bf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9c00: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
9c10: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
9c20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9c30: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
9c40: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72  ecified.");....r
9c50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9c60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9c70: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
9c80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
9c90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
9ca0: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
9cb0: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
9cc0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
9cd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9ce0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
9cf0: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
9d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
9d10: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
9d20: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9d30: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
9d40: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63  * Determine whic
9d50: 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65  h protocol to se
9d60: 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69  nd using */..swi
9d70: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
9d80: 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43  col) {...case SC
9d90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
9da0: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
9db0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a   SCARD_PCI_T0;..
9dc0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
9dd0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
9de0: 54 31 3a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63  T1:....pioSendPc
9df0: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31  i = SCARD_PCI_T1
9e00: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  ;.....break;...d
9e10: 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
9e20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9e30: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
9e40: 20 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67   found, aborting
9e50: 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
9e60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9e70: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
9e80: 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69  Transmit */..xmi
9e90: 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74  t_len = 0;..xmit
9ea0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9eb0: 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f   = class;..xmit_
9ec0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
9ed0: 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09  = instruction;..
9ee0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9ef0: 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74  n++] = p1;..xmit
9f00: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9f10: 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61   = p2;..if (data
9f20: 29 20 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20 32  ) {...if (lc > 2
9f30: 35 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75  56) {....xmit_bu
9f40: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
9f50: 30 78 38 30 3b 20 2f 2a 20 58 58 58 20 55 4e 54  0x80; /* XXX UNT
9f60: 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74  ESTED */....xmit
9f70: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9f80: 20 3d 20 28 6c 63 20 26 20 30 78 66 66 30 30 29   = (lc & 0xff00)
9f90: 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62   >> 8;....xmit_b
9fa0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9fb0: 20 6c 63 20 26 20 30 78 66 66 3b 0a 09 09 7d 20   lc & 0xff;...} 
9fc0: 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62  else {....xmit_b
9fd0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9fe0: 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28   lc;...}...for (
9ff0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c  idx = 0; idx < l
a000: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78  c; idx++) {....x
a010: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a020: 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b  ++] = data[idx];
a030: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65  ...}..}...if (le
a040: 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 69 66   != 0x00) {...if
a050: 20 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a 09 09   (le > 256) {...
a060: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a070: 65 6e 2b 2b 5d 20 3d 20 30 78 38 30 3b 20 2f 2a  en++] = 0x80; /*
a080: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a090: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a0a0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26  t_len++] = (le &
a0b0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a0c0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a0d0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78  len++] = le & 0x
a0e0: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  ff;...} else if 
a0f0: 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09  (le == 256) {...
a100: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a110: 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09  en++] = 0x00;...
a120: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
a130: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a140: 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   = le;...}..}...
a150: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
a160: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a170: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
a180: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
a190: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
a1a0: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
a1b0: 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63  O7816 && instruc
a1c0: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
a1d0: 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31  STR_VERIFY && p1
a1e0: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41   == 0x00) {...CA
a1f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a200: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a  F("Sending APDU:
a210: 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b   <<censored>>");
a220: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
a230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
a240: 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  UF("Sending APDU
a250: 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  :", xmit_buf, xm
a260: 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65  it_len);..}...re
a270: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
a280: 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72  recv_buf);..scar
a290: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61  d_xmit_ret = SCa
a2a0: 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d  rdTransmit(slot-
a2b0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53  >pcsc_card, pioS
a2c0: 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66  endPci, xmit_buf
a2d0: 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c  , xmit_len, NULL
a2e0: 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63  , recv_buf, &rec
a2f0: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63  v_len);...if (sc
a300: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20  ard_xmit_ret == 
a310: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e  SCARD_E_NOT_TRAN
a320: 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b  SACTED) {...CACK
a330: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a340: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20  "Failed to send 
a350: 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43  APDU to card (SC
a360: 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20  ardTransmit() = 
a370: 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73  %s/%lx), will as
a380: 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  k calling functi
a390: 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74  on to retry (not
a3a0: 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64 29   resetting card)
a3b0: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ...", CACKEY_DEB
a3c0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
a3d0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
a3e0: 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e  it_ret), (unsign
a3f0: 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  ed long) scard_x
a400: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20  mit_ret);..../* 
a410: 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20  Begin Smartcard 
a420: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
a430: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
a440: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
a450: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a460: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09  PCSC_E_RETRY);..
a470: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  }...if (scard_xm
a480: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
a490: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
a4a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a4b0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
a4c0: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
a4d0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
a4e0: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
a4f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
a500: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
a510: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
a520: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
a530: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
a540: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a550: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
a560: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
a570: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09  been reset");...
a580: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
a590: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
a5a0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
a5b0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
a5c0: 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
a5d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a5e0: 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
a5f0: 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
a600: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
a610: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
a620: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
a630: 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
a640: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
a650: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
a660: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
a670: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
a680: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
a690: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
a6a0: 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63  /* Update protoc
a6b0: 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e  ol */.....slot->
a6c0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f  protocol = proto
a6d0: 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74 63 68 20  col;.....switch 
a6e0: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29  (slot->protocol)
a6f0: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41   {......case SCA
a700: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
a710: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69  ......pioSendPci
a720: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b   = SCARD_PCI_T0;
a730: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
a740: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
a750: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09  ROTOCOL_T1:.....
a760: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a770: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
a780: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
a790: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43  default:.......C
a7a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a7b0: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74  TF("Invalid prot
a7c0: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20  ocol found, but 
a7d0: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61  too late to do a
a7e0: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74  nything about it
a7f0: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61   now -- trying a
a800: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09  nyway.");.......
a810: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
a820: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69  .../* Re-establi
a830: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  sh transaction, 
a840: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e  if it was presen
a850: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f  t */.....if (slo
a860: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
a870: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
a880: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
a890: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09  on_depth--;.....
a8a0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
a8b0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
a8c0: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
a8d0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
a8e0: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a  on(slot);.....}.
a8f0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a900: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
a910: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72  successful, retr
a920: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09  ansmitting");...
a930: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
a940: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
a950: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  ....scard_xmit_r
a960: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
a970: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
a980: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  rd, pioSendPci, 
a990: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
a9a0: 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62  en, NULL, recv_b
a9b0: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a  uf, &recv_len);.
a9c0: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78  .....if (scard_x
a9d0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
a9e0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
a9f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aa00: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d  PRINTF("Retransm
aa10: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  it failed, retur
aa20: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
aa30: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74  after disconnect
aa40: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43  ing the card (SC
aa50: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73  ardTransmit = %s
aa60: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%li)", CACKEY_D
aa70: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
aa80: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
aa90: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  xmit_ret), (long
aaa0: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
aab0: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69  );.......SCardDi
aac0: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
aad0: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
aae0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
aaf0: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
ab00: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
ab10: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ......./* End Sm
ab20: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
ab30: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74  ion */......slot
ab40: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
ab50: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  pth = 1;......ca
ab60: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
ab70: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
ab80: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ab90: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
aba0: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
abb0: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
abc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
abd0: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
abe0: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64  rd");......SCard
abf0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
ac00: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
ac10: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
ac20: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
ac30: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
ac40: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ;....../* End Sm
ac50: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
ac60: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  ion */.....slot-
ac70: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
ac80: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b  th = 1;.....cack
ac90: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
aca0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43  on(slot);......C
acb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
acc0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
acd0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09   failure");.....
ace0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
acf0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
ad00: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
ad10: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
ad20: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
ad30: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
ad40: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
ad50: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
ad60: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
ad70: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74  E_CARD);....slot
ad80: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
ad90: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f  ected = 0;...../
ada0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
adb0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
adc0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
add0: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
ade0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
adf0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
ae00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ae10: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
ae20: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
ae30: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
ae40: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
ae50: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  SENT);...}..}...
ae60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ae70: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20  NTBUF("Returned 
ae80: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75  Value:", recv_bu
ae90: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  f, recv_len);...
aea0: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32  if (recv_len < 2
aeb0: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c  ) {.../* Minimal
aec0: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68   response length
aed0: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74   is 2 bytes, ret
aee0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
aef0: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  e */...CACKEY_DE
af00: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
af10: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  onse too small, 
af20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
af30: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d  lure (recv_len =
af40: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
af50: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
af60: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
af70: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
af80: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
af90: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
afa0: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
afb0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
afc0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
afd0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74  Determine result
afe0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f   code */..major_
aff0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
b000: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69  cv_len - 2];..mi
b010: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  nor_rc = recv_bu
b020: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b  f[recv_len - 1];
b030: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
b040: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  {...*respcode = 
b050: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20  (major_rc << 8) 
b060: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a  | minor_rc;..}..
b070: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61  ./* Adjust messa
b080: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65  ge buffer */..re
b090: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f  cv_len -= 2;.../
b0a0: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72  * Add bytes to r
b0b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
b0c0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b0d0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64   = 0;..if (respd
b0e0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f  ata && respdata_
b0f0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73  len) {...tmp_res
b100: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73  pdata_len = *res
b110: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79  pdata_len;....by
b120: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72  tes_to_copy = *r
b130: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
b140: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62  if (recv_len < b
b150: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
b160: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
b170: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d   = recv_len;...}
b180: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b190: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67  _PRINTF("Copying
b1a0: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68   %lu bytes to th
b1b0: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64  e buffer (recv'd
b1c0: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20   %lu bytes, but 
b1d0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c  only %lu bytes l
b1e0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65  eft in our buffe
b1f0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  r)", (unsigned l
b200: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f  ong) bytes_to_co
b210: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  py, (unsigned lo
b220: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75  ng) recv_len, (u
b230: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72  nsigned long) *r
b240: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
b250: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61  .memcpy(respdata
b260: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65  , recv_buf, byte
b270: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65  s_to_copy);...re
b280: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f  spdata += bytes_
b290: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73  to_copy;....*res
b2a0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65  pdata_len = byte
b2b0: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70  s_to_copy;...tmp
b2c0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d  _respdata_len -=
b2d0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
b2e0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
b2f0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  recv_len != 0) {
b300: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b310: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e  _PRINTF("Throwin
b320: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73  g away %lu bytes
b330: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74  , nowhere to put
b340: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e   them!", (unsign
b350: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
b360: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  n);...}..}...if 
b370: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36  (major_rc == 0x6
b380: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65  1) {.../* We nee
b390: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43  d to READ */...C
b3a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b3b0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
b3c0: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69  required");....i
b3d0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30  f (minor_rc == 0
b3e0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f  x00) {....minor_
b3f0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55  rc = CACKEY_APDU
b400: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73  _MTU;...}....pcs
b410: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20  c_getresp_ret = 
b420: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
b430: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
b440: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
b450: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50  S_INSTR_GET_RESP
b460: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30  ONSE, 0x00, 0x00
b470: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72  , 0, NULL, minor
b480: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72  _rc, respcode, r
b490: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65  espdata, &tmp_re
b4a0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09  spdata_len);....
b4b0: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70  if (pcsc_getresp
b4c0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
b4d0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
b4e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b4f0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
b500: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69  failed!  Returni
b510: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
b520: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
b530: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
b540: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
b550: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b560: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63  lot);.....if (pc
b570: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
b580: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
b590: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74  RETRY) {.....ret
b5a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b5b0: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a  E_RETRY);....}..
b5c0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b5d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
b5e0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
b5f0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09  pdata_len) {....
b600: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d  *respdata_len +=
b610: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65   tmp_respdata_le
b620: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64  n;...}..../* End
b630: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b640: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
b650: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b660: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43  on(slot);....CAC
b670: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b680: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
b690: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72  uccess (buffer r
b6a0: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b  ead complete)");
b6b0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b6c0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
b6d0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b6e0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b6f0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
b700: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b710: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
b720: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20  == 0x90) {.../* 
b730: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43  Success */...CAC
b740: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b750: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
b760: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63  uccess (major_rc
b770: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72   = 0x90)");....r
b780: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b790: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43  C_S_OK);..}....C
b7a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b7b0: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65  TF("APDU Returne
b7c0: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75  d an error, retu
b7d0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b7e0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
b7f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
b800: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  IC);.}../*. * SY
b810: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73  NPOSIS. *     ss
b820: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
b830: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
b840: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
b850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
b860: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
b870: 75 6e 74 2c 20 2e 2e 2e 2e 0a 20 2a 0a 20 2a 20  unt, ..... *. * 
b880: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
b890: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
b8a0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
b8b0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
b8c0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
b8d0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
b8e0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a   char *buffer. *
b8f0: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42           [OUT] B
b900: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20  uffer. *. *     
b910: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20  size_t count. * 
b920: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
b930: 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d  f bytes to attem
b940: 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a  pt to read. *. *
b950: 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74       size_t init
b960: 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20  ial_offset. *   
b970: 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68        Specify th
b980: 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69  e offset to begi
b990: 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a  n the read from.
b9a0: 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20   *. *. * RETURN 
b9b0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69  VALUE. *     Thi
b9c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b9d0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
b9e0: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
b9f0: 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65  read, or -1 on e
ba00: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  rror.. *. * NOTE
ba10: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
ba20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
ba30: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
ba40: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
ba50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
ba60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
ba70: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
ba80: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
ba90: 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69   oid[3]) {..unsi
baa0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
bab0: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  r_p;..size_t ini
bac0: 74 5f 63 6f 75 6e 74 3b 0a 0a 09 73 69 7a 65 5f  t_count;...size_
bad0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
bae0: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
baf0: 75 6e 74 2c 20 73 69 7a 65 3b 0a 09 75 6e 73 69  unt, size;..unsi
bb00: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20  gned char cmd[] 
bb10: 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30  = {0x5C, 0x03, 0
bb20: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d  x00, 0x00, 0x00}
bb30: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
bb40: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
bb50: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ret;..int idx;..
bb60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bb70: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
bb80: 0a 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20  ...init_count = 
bb90: 63 6f 75 6e 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66  count;...max_off
bba0: 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61  set = count;..ma
bbb0: 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59  x_count = CACKEY
bbc0: 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 63 6d 64  _APDU_MTU;...cmd
bbd0: 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63  [2] = oid[0];..c
bbe0: 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a  md[3] = oid[1];.
bbf0: 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d  .cmd[4] = oid[2]
bc00: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
bc10: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
bc20: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
bc30: 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53  S_ISO7816, NISTS
bc40: 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f  P800_73_3_INSTR_
bc50: 47 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20  GET_DATA, 0x3F, 
bc60: 30 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64  0xFF, sizeof(cmd
bc70: 29 2c 20 63 6d 64 2c 20 63 6f 75 6e 74 2c 20 26  ), cmd, count, &
bc80: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72  respcode, buffer
bc90: 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 69 66 20  , &count);...if 
bca0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
bcb0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
bcc0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
bcd0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
bce0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
bcf0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
bd00: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  ffer");....retur
bd10: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  n(cackey_get_dat
bd20: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
bd30: 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 6f 69 64 29  init_count, oid)
bd40: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
bd50: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
bd60: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
bd70: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
bd80: 36 41 38 36 29 20 7b 0a 2f 2a 20 58 58 58 20 54  6A86) {./* XXX T
bd90: 4f 44 4f 20 50 49 56 20 2a 2f 0a 09 09 7d 0a 0a  ODO PIV */...}..
bda0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bdb0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65  RINTF("cackey_se
bdc0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64  nd_apdu() failed
bdd0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
bde0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
bdf0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6f 66  urn(-1);..}...of
be00: 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a  fset += count;..
be10: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
be20: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
be30: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
be40: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f  ..if (offset > _
be50: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
be60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
be70: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74  G_PRINTF("Offset
be80: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
be90: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
bea0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
beb0: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74  ax = %li, offset
bec0: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
bed0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
bee0: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
bef0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72  g) offset);....r
bf00: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
bf10: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
bf20: 69 66 20 28 6f 66 66 73 65 74 20 3c 20 32 29 20  if (offset < 2) 
bf30: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bf40: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45  _PRINTF("APDU GE
bf50: 54 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20  T DATA returned 
bf60: 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68  %lu bytes, which
bf70: 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f   is too short fo
bf80: 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70  r a BER-TLV resp
bf90: 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64  onse", (unsigned
bfa0: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
bfb0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
bfc0: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62  }...buffer_p = b
bfd0: 75 66 66 65 72 3b 0a 09 69 66 20 28 2a 62 75 66  uffer;..if (*buf
bfe0: 66 65 72 5f 70 20 21 3d 20 30 78 35 33 29 20 7b  fer_p != 0x53) {
bff0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c000: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
c010: 20 44 41 54 41 20 64 69 64 20 6e 6f 74 20 72 65   DATA did not re
c020: 74 75 72 6e 20 61 20 42 45 52 2d 54 4c 56 20 77  turn a BER-TLV w
c030: 69 74 68 20 74 61 67 20 35 33 2e 20 20 54 61 67  ith tag 53.  Tag
c040: 20 3d 20 25 30 32 78 22 2c 20 28 75 6e 73 69 67   = %02x", (unsig
c050: 6e 65 64 20 69 6e 74 29 20 2a 62 75 66 66 65 72  ned int) *buffer
c060: 5f 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  _p);....return(-
c070: 31 29 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70  1);..}..buffer_p
c080: 2b 2b 3b 0a 0a 09 69 66 20 28 28 2a 62 75 66 66  ++;...if ((*buff
c090: 65 72 5f 70 20 26 20 30 78 38 30 29 20 3d 3d 20  er_p & 0x80) == 
c0a0: 30 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d  0x80) {...size =
c0b0: 20 30 3b 0a 09 09 69 64 78 20 3d 20 28 2a 62 75   0;...idx = (*bu
c0c0: 66 66 65 72 5f 70 20 26 20 30 78 37 66 29 3b 0a  ffer_p & 0x7f);.
c0d0: 0a 09 09 69 66 20 28 28 28 62 75 66 66 65 72 5f  ...if (((buffer_
c0e0: 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 69 64  p - buffer) + id
c0f0: 78 29 20 3e 3d 20 6f 66 66 73 65 74 29 20 7b 0a  x) >= offset) {.
c100: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c110: 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65  PRINTF("Malforme
c120: 64 20 42 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e  d BER value -- n
c130: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
c140: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 72 65 61  available to rea
c150: 64 20 6c 65 6e 67 74 68 22 29 3b 0a 0a 09 09 09  d length");.....
c160: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
c170: 0a 09 09 66 6f 72 20 28 3b 20 69 64 78 20 3e 20  ...for (; idx > 
c180: 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62  0; idx--) {....b
c190: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09 73 69  uffer_p++;....si
c1a0: 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a  ze <<= 8;....siz
c1b0: 65 20 7c 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a  e |= *buffer_p;.
c1c0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
c1d0: 73 69 7a 65 20 3d 20 2a 62 75 66 66 65 72 5f 70  size = *buffer_p
c1e0: 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ;..}..buffer_p++
c1f0: 3b 0a 0a 09 69 66 20 28 28 28 62 75 66 66 65 72  ;...if (((buffer
c200: 5f 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 73  _p - buffer) + s
c210: 69 7a 65 29 20 21 3d 20 6f 66 66 73 65 74 29 20  ize) != offset) 
c220: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c230: 5f 50 52 49 4e 54 46 28 22 45 6e 74 69 72 65 20  _PRINTF("Entire 
c240: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 63 6f  buffer is not co
c250: 6e 73 75 6d 65 64 21 22 29 3b 0a 0a 09 09 69 66  nsumed!");....if
c260: 20 28 28 28 62 75 66 66 65 72 5f 70 20 2d 20 62   (((buffer_p - b
c270: 75 66 66 65 72 29 20 2b 20 73 69 7a 65 29 20 3e  uffer) + size) >
c280: 20 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41   offset) {....CA
c290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c2a0: 46 28 22 45 6e 63 6f 64 65 64 20 73 69 7a 65 20  F("Encoded size 
c2b0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c2c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61  the amount of da
c2d0: 74 61 20 72 65 61 64 2c 20 64 72 6f 70 70 69 6e  ta read, droppin
c2e0: 67 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  g");.....return(
c2f0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 65  -1);...}..}...me
c300: 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c 20 62 75  mmove(buffer, bu
c310: 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 0a  ffer_p, size);..
c320: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c330: 49 4e 54 42 55 46 28 22 47 45 54 20 44 41 54 41  INTBUF("GET DATA
c340: 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72   result", buffer
c350: 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45  , size);...CACKE
c360: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c370: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
c380: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
c390: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
c3a0: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09   long) size);...
c3b0: 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a  return(size);.}.
c3c0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c3d0: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63   *     ssize_t c
c3e0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
c3f0: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
c400: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
c410: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c420: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
c430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
c440: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
c450: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20  itial_offset);. 
c460: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c470: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c480: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
c490: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
c4a0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
c4b0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
c4c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c4d0: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
c4e0: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
c4f0: 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e       size_t coun
c500: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  t. *         Num
c510: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
c520: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
c530: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
c540: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20  ed char t_or_v. 
c550: 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  *         Select
c560: 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28 30   the T-buffer (0
c570: 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28  1) or V-buffer (
c580: 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  02) to read from
c590: 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  .  . *. *     si
c5a0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
c5b0: 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  set. *         S
c5c0: 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73 65  pecify the offse
c5d0: 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72  t to begin the r
c5e0: 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20  ead from. *. *. 
c5f0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
c600: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
c610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
c620: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c630: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f  actually read, o
c640: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20  r -1 on error.. 
c650: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c660: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
c670: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c680: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
c690: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c6a0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c6b0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
c6c0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75   size_t count, u
c6d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
c6e0: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74  r_v, size_t init
c6f0: 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75  ial_offset) {..u
c700: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e  nsigned char *in
c710: 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65  it_buffer;..size
c720: 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09  _t init_count;..
c730: 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74  size_t init_init
c740: 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69  ial_offset;...si
c750: 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c  ze_t offset = 0,
c760: 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78   max_offset, max
c770: 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65  _count;..unsigne
c780: 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09  d char cmd[2];..
c790: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
c7a0: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
c7b0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
c7c0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
c7d0: 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65  ");...init_buffe
c7e0: 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69  r = buffer;..ini
c7f0: 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b  t_count = count;
c800: 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f  ..init_initial_o
c810: 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f  ffset = initial_
c820: 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66  offset;...max_of
c830: 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d  fset = count;..m
c840: 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45  ax_count = CACKE
c850: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66  Y_APDU_MTU;...if
c860: 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26   (t_or_v != 1 &&
c870: 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a   t_or_v != 2) {.
c880: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c890: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54  RINTF("Invalid T
c8a0: 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20   or V parameter 
c8b0: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72  specified, retur
c8c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
c8d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c8e0: 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20  ;..}...cmd[0] = 
c8f0: 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20  t_or_v;...while 
c900: 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73  (1) {...if (offs
c910: 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74  et >= max_offset
c920: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
c930: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
c940: 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  er too small, re
c950: 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20  turning what we 
c960: 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72  got...");.....br
c970: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e  eak;...}....coun
c980: 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d  t = max_offset -
c990: 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63   offset;...if (c
c9a0: 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74  ount > max_count
c9b0: 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d  ) {....count = m
c9c0: 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09  ax_count;...}...
c9d0: 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b  .cmd[1] = count;
c9e0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
c9f0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
ca00: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
ca10: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
ca20: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  M, GSCIS_INSTR_R
ca30: 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e  EAD_BUFFER, ((in
ca40: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
ca50: 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30  ffset) >> 8) & 0
ca60: 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66  xff, (initial_of
ca70: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26  fset + offset) &
ca80: 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d   0xff, sizeof(cm
ca90: 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26  d), cmd, 0x00, &
caa0: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72  respcode, buffer
cab0: 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e   + offset, &coun
cac0: 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  t);....if (send_
cad0: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
cae0: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
caf0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cb00: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
cb10: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
cb20: 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22  ing read buffer"
cb30: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61  );.....return(ca
cb40: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
cb50: 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66  (slot, init_buff
cb60: 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20  er, init_count, 
cb70: 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69  t_or_v, init_ini
cb80: 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09  tial_offset));..
cb90: 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  .}....if (send_r
cba0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
cbb0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20  C_S_OK) {....if 
cbc0: 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
cbd0: 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d  A86) {.....if (m
cbe0: 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b  ax_count == 1) {
cbf0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
cc00: 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e  .}......max_coun
cc10: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20  t = max_count / 
cc20: 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  2;......continue
cc30: 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
cc40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cc50: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
cc60: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
cc70: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
cc80: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
cc90: 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74  );...}....offset
cca0: 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66   += count;....if
ccb0: 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f   (count < max_co
ccc0: 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  unt) {....CACKEY
ccd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
cce0: 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75  hort read -- cou
ccf0: 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20  nt = %i, cmd[1] 
cd00: 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75  = %i", (int) cou
cd10: 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d  nt, (int) cmd[1]
cd20: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
cd30: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  }..}..#ifdef CAC
cd40: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
cd50: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
cd60: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73  ZE_MAX..if (offs
cd70: 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
cd80: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
cd90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cda0: 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d  Offset exceeds m
cdb0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
cdc0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
cdd0: 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
cde0: 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20  offset = %lu)", 
cdf0: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
ce00: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
ce10: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29  ed long) offset)
ce20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
ce30: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
ce40: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
ce50: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
ce60: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
ce70: 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22   read %lu bytes"
ce80: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
ce90: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74  ) offset);...ret
cea0: 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a  urn(offset);.}..
ceb0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
cec0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
ced0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
cee0: 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63  pplet(struct cac
cef0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
cf00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
cf10: 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c  id, size_t aid_l
cf20: 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  en);. *. * ARGUM
cf30: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
cf40: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cf50: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
cf60: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
cf70: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
cf80: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cf90: 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20   *aid. *        
cfa0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
cfb0: 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20  ng Applet ID to 
cfc0: 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20  select. *. *    
cfd0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a   size_t aid_len.
cfe0: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
cff0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
d000: 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20  e "aid" (Applet 
d010: 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a  ID) parameter. *
d020: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
d030: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
d040: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
d050: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
d060: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
d070: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
d080: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
d090: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
d0a0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
d0b0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
d0c0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
d0d0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
d0e0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
d0f0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
d100: 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20  aid_len) {..int 
d110: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
d120: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d130: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
d140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d150: 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61  BUF("Selecting a
d160: 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69  pplet:", aid, ai
d170: 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72  d_len);...send_r
d180: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d190: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d1a0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
d1b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
d1c0: 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d  ECT, GSCIS_PARAM
d1d0: 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20  _SELECT_APPLET, 
d1e0: 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61  0x00, aid_len, a
d1f0: 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  id, 0x00, NULL, 
d200: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  NULL, NULL);...i
d210: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
d220: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
d230: 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  RY) {...CACKEY_D
d240: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
d250: 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  U Sending failed
d260: 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63  , retrying selec
d270: 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72  t applet");....r
d280: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c  eturn(cackey_sel
d290: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
d2a0: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b   aid, aid_len));
d2b0: 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  ..}...if (send_r
d2c0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
d2d0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
d2e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d2f0: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
d300: 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e  applet, returnin
d310: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
d320: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
d330: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
d340: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
d350: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63  BUG_PRINTF("Succ
d360: 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65  essfully selecte
d370: 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75  d file");...retu
d380: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
d390: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
d3a0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
d3b0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d3c0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
d3d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d3e0: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
d3f0: 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ef);. *. * ARGUM
d400: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
d410: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d420: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
d430: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
d440: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
d450: 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20     uint16_t ef. 
d460: 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e  *         Elemen
d470: 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65  tal File to sele
d480: 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ct. *. * RETURN 
d490: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
d4a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
d4b0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
d4c0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
d4d0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
d4e0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
d4f0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
d500: 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65  s selects an Ele
d510: 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46  mentary File (EF
d520: 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72  ) under the curr
d530: 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20  ently selected. 
d540: 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20  *     Dedicated 
d550: 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20  File (DF). *. * 
d560: 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68      Typically th
d570: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
d580: 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65  er selecting the
d590: 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20   correct Applet 
d5a0: 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61  (using. *     ca
d5b0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
d5c0: 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73  et) for VM cards
d5d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
d5e0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d5f0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
d600: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d610: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
d620: 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ef) {..unsigned 
d630: 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b  char fid_buf[2];
d640: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d650: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d660: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d670: 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ;.../* Open the 
d680: 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20  elementary file 
d690: 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d  */..fid_buf[0] =
d6a0: 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66   (ef >> 8) & 0xf
d6b0: 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d  f;..fid_buf[1] =
d6c0: 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   ef & 0xff;...CA
d6d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d6e0: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c  F("Selecting fil
d6f0: 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69  e: %04lx", (unsi
d700: 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a  gned long) ef);.
d710: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
d720: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
d730: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
d740: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
d750: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30  NSTR_SELECT, 0x0
d760: 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28  2, 0x0C, sizeof(
d770: 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75  fid_buf), fid_bu
d780: 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  f, 0x00, NULL, N
d790: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
d7a0: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
d7b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
d7c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d7d0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
d7e0: 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74  o open file, ret
d7f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d800: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
d810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
d820: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
d830: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d840: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
d850: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
d860: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
d870: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
d880: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
d890: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
d8a0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
d8b0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
d8c0: 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20  y *root);. *. * 
d8d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
d8e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74   struct cackey_t
d8f0: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a  lv_entity *root.
d900: 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20   *         Root 
d910: 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20  of the TLV list 
d920: 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67  to start freeing
d930: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
d940: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
d950: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
d960: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
d970: 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c   frees the TLV l
d980: 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74  inked listed ret
d990: 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20  urned from. *   
d9a0: 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74    "cackey_read_t
d9b0: 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  lv". *. */.stati
d9c0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
d9d0: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
d9e0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
d9f0: 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *root) {..struct
da00: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
da10: 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b  ty *curr, *next;
da20: 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
da30: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  ULL) {...return;
da40: 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20  ..}...for (curr 
da50: 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75  = root; curr; cu
da60: 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e  rr = next) {...n
da70: 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78  ext = curr->_nex
da80: 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  t;....switch (cu
da90: 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61  rr->tag) {....ca
daa0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  se GSCIS_TAG_ACR
dab0: 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20  _TABLE:....case 
dac0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
dad0: 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63  ICATE:.....if (c
dae0: 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09  urr->value) {...
daf0: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
db00: 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  lue);.....}.....
db10: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
db20: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
db30: 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e  :.....if (curr->
db40: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b  value_cardurl) {
db50: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
db60: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b  >value_cardurl);
db70: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
db80: 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75  ;...}....free(cu
db90: 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rr);..}...return
dba0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
dbb0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
dbc0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
dbd0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
dbe0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
dbf0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
dc00: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
dc10: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
dc20: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
dc30: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
dc40: 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ad_tlv(struct ca
dc50: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
dc60: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
dc70: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75  y_tlv_entity *cu
dc80: 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74  rr_entity, *root
dc90: 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d   = NULL, *last =
dca0: 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64   NULL;..unsigned
dcb0: 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32   char tlen_buf[2
dcc0: 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34  ], tval_buf[1024
dcd0: 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *tval;..unsig
dce0: 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75  ned char vlen_bu
dcf0: 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38  f[2], vval_buf[8
dd00: 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e  192], *vval;..un
dd10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
dd20: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
dd30: 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  ong tmpbuflen;..
dd40: 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c  ssize_t tlen, vl
dd50: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  en;..ssize_t rea
dd60: 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f  d_ret;..size_t o
dd70: 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66  ffset_t = 0, off
dd80: 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69  set_v = 0;..unsi
dd90: 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09  gned char tag;..
dda0: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23  size_t length;.#
ddb0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
ddc0: 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
ddd0: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
dde0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ddf0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
de00: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
de10: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
de20: 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, tlen_buf, si
de30: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20  zeof(tlen_buf), 
de40: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
de50: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
de60: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29  izeof(tlen_buf))
de70: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
de80: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
de90: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
dea0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
deb0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
dec0: 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65  .}...tlen = (tle
ded0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
dee0: 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   tlen_buf[0];...
def0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
df00: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
df10: 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, vlen_buf, si
df20: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20  zeof(vlen_buf), 
df30: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
df40: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
df50: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29  izeof(vlen_buf))
df60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
df70: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
df80: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
df90: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
dfa0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
dfb0: 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65  .}...vlen = (vle
dfc0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
dfd0: 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   vlen_buf[0];...
dfe0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dff0: 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20  NTF("Tag Length 
e000: 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e  = %lu, Value Len
e010: 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  gth = %lu", (uns
e020: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e  igned long) tlen
e030: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e040: 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65  ) vlen);...offse
e050: 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65  t_t += 2;..offse
e060: 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28  t_v += 2;...if (
e070: 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76  tlen > sizeof(tv
e080: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
e090: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e0a0: 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20  ("Tag length is 
e0b0: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
e0c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e0d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e0e0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65  L);..}...if (vle
e0f0: 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f  n > sizeof(vval_
e100: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
e110: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56  _DEBUG_PRINTF("V
e120: 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74  alue length is t
e130: 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e  oo large, return
e140: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e150: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e160: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
e170: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e180: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c  uffer(slot, tval
e190: 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f  _buf, tlen, 1, o
e1a0: 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72  ffset_t);..if (r
e1b0: 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29  ead_ret != tlen)
e1c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e1d0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e1e0: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
e1f0: 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  T-buffer, return
e200: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e210: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e220: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
e230: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e240: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c  uffer(slot, vval
e250: 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f  _buf, vlen, 2, o
e260: 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72  ffset_v);..if (r
e270: 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29  ead_ret != vlen)
e280: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e290: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e2a0: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
e2b0: 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  V-buffer, return
e2c0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e2d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e2e0: 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74  );..}...tval = t
e2f0: 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d  val_buf;..vval =
e300: 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c   vval_buf;..whil
e310: 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76  e (tlen > 0 && v
e320: 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67  len > 0) {...tag
e330: 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c   = *tval;...tval
e340: 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09  ++;...tlen--;...
e350: 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78  .if (*tval == 0x
e360: 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  ff) {....length 
e370: 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29  = (tval[2] << 8)
e380: 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74   | tval[1];....t
e390: 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65  val += 3;....tle
e3a0: 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65  n -= 3;...} else
e3b0: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a   {....length = *
e3c0: 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b  tval;....tval++;
e3d0: 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a  ....tlen--;...}.
e3e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e3f0: 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20  PRINTF("Tag: %s 
e400: 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  (%02x)", CACKEY_
e410: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
e420: 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73  O_STR(tag), (uns
e430: 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b  igned int) tag);
e440: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e450: 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a  PRINTBUF("Value:
e460: 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  ", vval, length)
e470: 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79  ;....curr_entity
e480: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63   = NULL;...switc
e490: 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73  h (tag) {....cas
e4a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
e4b0: 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  URL:.....curr_en
e4c0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
e4d0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
e4e0: 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  y));.....curr_en
e4f0: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
e500: 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  url = malloc(siz
e510: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
e520: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
e530: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  );......memcpy(c
e540: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
e550: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
e560: 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75  vval, 5);.....cu
e570: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
e580: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
e590: 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09  e = vval[5];....
e5a0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
e5b0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
e5c0: 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d  ectid = (vval[6]
e5d0: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d   << 8) | vval[7]
e5e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
e5f0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
e600: 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b  ->appid = (vval[
e610: 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  8] << 8) | vval[
e620: 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  9];......curr_en
e630: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
e640: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
e650: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
e660: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
e670: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
e680: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72  R_TABLE:.....cur
e690: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
e6a0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
e6b0: 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70  ntity));.....tmp
e6c0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e  buf = malloc(len
e6d0: 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  gth);......memcp
e6e0: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
e6f0: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75  length);......cu
e700: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
e710: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
e720: 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20  ntity->length = 
e730: 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72  length;.....curr
e740: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
e750: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
e760: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
e770: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
e780: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
e790: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
e7a0: 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  E:.....curr_enti
e7b0: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
e7c0: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
e7d0: 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  );..#ifdef HAVE_
e7e0: 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c  LIBZ.....tmpbufl
e7f0: 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b  en = length * 2;
e800: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
e810: 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
e820: 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
e830: 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73  _ret = uncompres
e840: 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75  s(tmpbuf, &tmpbu
e850: 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  flen, vval, leng
e860: 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63  th);.....if (unc
e870: 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a  ompress_ret != Z
e880: 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  _OK) {......CACK
e890: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e8a0: 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d  "Failed to decom
e8b0: 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73  press, uncompres
e8c0: 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 20  s() returned %i 
e8d0: 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20  -- resorting to 
e8e0: 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e  direct copy", un
e8f0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a  compress_ret);..
e900: 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
e910: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65   length;......me
e920: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
e930: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09  l, length);.....
e940: 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
e950: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65  BUG_PRINTBUF("De
e960: 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c  compressed to:",
e970: 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
e980: 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43  en);.#else.....C
e990: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e9a0: 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42  TF("Missing ZLIB
e9b0: 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63   Support, this c
e9c0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c 69  ertificate is li
e9d0: 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22  kely useless..."
e9e0: 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  );......tmpbufle
e9f0: 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
ea00: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
ea10: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65  val, length);.#e
ea20: 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65  ndif......curr_e
ea30: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
ea40: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
ea50: 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62  y->length = tmpb
ea60: 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f  uflen;.....curr_
ea70: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20  entity->value = 
ea80: 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72  tmpbuf;.....curr
ea90: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
eaa0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
eab0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53  k;....case GSCIS
eac0: 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09  _TAG_PKCS15:....
ead0: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
eae0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
eaf0: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09  rr_entity));....
eb00: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
eb10: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
eb20: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
eb30: 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b  _byte = vval[0];
eb40: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
eb50: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
eb60: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
eb70: 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74  ...vval += lengt
eb80: 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e  h;...vlen -= len
eb90: 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72  gth;....if (curr
eba0: 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29  _entity != NULL)
ebb0: 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d   {....if (root =
ebc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f  = NULL) {.....ro
ebd0: 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  ot = curr_entity
ebe0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  ;....}.....if (l
ebf0: 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ast != NULL) {..
ec00: 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d  ...last->_next =
ec10: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
ec20: 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75  .}.....last = cu
ec30: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09  rr_entity;...}..
ec40: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29  }...return(root)
ec50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
ec60: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
ec70: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
ec80: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
ec90: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
eca0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
ecb0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
ecc0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
ecd0: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  d cackey_free_ce
ece0: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
ecf0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
ed00: 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63  *start, size_t c
ed10: 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73  ount, int free_s
ed20: 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20  tart) {..size_t 
ed30: 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74  idx;...if (start
ed40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
ed50: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
ed60: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
ed70: 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
ed80: 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e  .if (start[idx].
ed90: 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09  certificate) {..
eda0: 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 78  ..free(start[idx
edb0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  ].certificate);.
edc0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  ..}..}...if (fre
edd0: 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65  e_start) {...fre
ede0: 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72  e(start);..}...r
edf0: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
ee00: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
ee10: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
ee20: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
ee30: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
ee40: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73  sc_identity *des
ee50: 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
ee60: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
ee70: 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f  start, size_t co
ee80: 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69  unt) {..size_t i
ee90: 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20  dx;...if (start 
eea0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
eeb0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
eec0: 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c  if (dest == NULL
eed0: 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c  ) {...dest = mal
eee0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74  loc(sizeof(*dest
eef0: 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ) * count);..}..
ef00: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
ef10: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
ef20: 2b 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 64 65  +) {...memcpy(de
ef30: 73 74 5b 69 64 78 5d 2e 61 70 70 6c 65 74 2c 20  st[idx].applet, 
ef40: 73 74 61 72 74 5b 69 64 78 5d 2e 61 70 70 6c 65  start[idx].apple
ef50: 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69  t, sizeof(dest[i
ef60: 64 78 5d 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  dx].applet));...
ef70: 64 65 73 74 5b 69 64 78 5d 2e 66 69 6c 65 20 3d  dest[idx].file =
ef80: 20 73 74 61 72 74 5b 69 64 78 5d 2e 66 69 6c 65   start[idx].file
ef90: 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65  ;...dest[idx].ce
efa0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
efb0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
efc0: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65  ficate_len;...de
efd0: 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20  st[idx].keysize 
efe0: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79  = start[idx].key
eff0: 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64  size;....dest[id
f000: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d  x].certificate =
f010: 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78   malloc(dest[idx
f020: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
f030: 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73  n);...memcpy(des
f040: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
f050: 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  te, start[idx].c
f060: 65 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74  ertificate, dest
f070: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f080: 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74  e_len);..}...ret
f090: 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a  urn(dest);.}../*
f0a0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
f0b0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
f0c0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
f0d0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
f0e0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
f0f0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
f100: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
f110: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
f120: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f130: 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63  y *cackey_read_c
f140: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
f150: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
f160: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
f170: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74  c_identity *cert
f180: 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
f190: 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75   *count) {..stru
f1a0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f1b0: 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
f1c0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
f1d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63  _tlv_entity *ccc
f1e0: 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c  _tlv, *ccc_curr,
f1f0: 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f   *app_tlv, *app_
f200: 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20  curr;..unsigned 
f210: 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d  char ccc_aid[] =
f220: 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d   {GSCIS_AID_CCC}
f230: 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e  , piv_aid[] = {N
f240: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49  ISTSP800_73_3_PI
f250: 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65  V_AID};..unsigne
f260: 64 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c  d char *piv_oid,
f270: 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68   piv_oid_pivauth
f280: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
f290: 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48  73_3_OID_PIVAUTH
f2a0: 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61  }, piv_oid_signa
f2b0: 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  ture[] = {NISTSP
f2c0: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
f2d0: 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64  NATURE}, piv_oid
f2e0: 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53  _keymgt[] = {NIS
f2f0: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
f300: 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e  KEYMGT};..unsign
f310: 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64  ed char curr_aid
f320: 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  [7];..unsigned c
f330: 68 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d  har buffer[8192]
f340: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
f350: 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 61   outidx = 0;..ca
f360: 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63  ckey_ret transac
f370: 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65  tion_ret;..ssize
f380: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  _t read_ret;..in
f390: 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  t certs_resizabl
f3a0: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
f3b0: 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69  , select_ret;..i
f3c0: 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20  nt piv_key, piv 
f3d0: 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  = 0;..int idx;..
f3e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f3f0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
f400: 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20  ...if (count == 
f410: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
f420: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
f430: 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65  ount is NULL, re
f440: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
f450: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
f460: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
f470: 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  certs != NULL) {
f480: 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d  ...if (*count ==
f490: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
f4a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f4b0: 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72  quested we retur
f4c0: 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f  n 0 objects, sho
f4d0: 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09  rt-circuit");...
f4e0: 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b  ..return(certs);
f4f0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 73  ...}..}...if (!s
f500: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29  lot->slot_reset)
f510: 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63   {...if (slot->c
f520: 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09  ached_certs) {..
f530: 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
f540: 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72 74 73  ULL) {.....certs
f550: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f560: 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d  (*certs) * slot-
f570: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
f580: 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f 75 6e 74  unt);.....*count
f590: 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   = slot->cached_
f5a0: 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09  certs_count;....
f5b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
f5c0: 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d   (*count > slot-
f5d0: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
f5e0: 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  unt) {......*cou
f5f0: 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65  nt = slot->cache
f600: 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09  d_certs_count;..
f610: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
f620: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
f630: 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63  certs, slot->cac
f640: 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e  hed_certs, *coun
f650: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  t);.....return(c
f660: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
f670: 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  if (slot->cached
f680: 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61 63 6b  _certs) {...cack
f690: 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 6c  ey_free_certs(sl
f6a0: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
f6b0: 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  , slot->cached_c
f6c0: 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a  erts_count, 1);.
f6d0: 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  ...slot->cached_
f6e0: 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  certs = NULL;..}
f6f0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
f700: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
f710: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
f720: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
f730: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
f740: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
f750: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
f760: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
f770: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
f780: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
f790: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
f7a0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
f7b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
f7c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
f7d0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
f7e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
f7f0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
f800: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
f810: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
f820: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
f830: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
f840: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
f850: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
f860: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
f870: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
f880: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
f890: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
f8a0: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
f8b0: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
f8c0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
f8d0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
f8e0: 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69  /* Try PIV appli
f8f0: 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64  cation */...send
f900: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
f910: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
f920: 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f  , piv_aid, sizeo
f930: 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69  f(piv_aid));...i
f940: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
f950: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
f960: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
f970: 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61  UG_PRINTF("We ha
f980: 76 65 20 61 20 50 49 56 20 63 61 72 64 20 2d 2d  ve a PIV card --
f990: 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20 43   not using the C
f9a0: 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d  CC, pulling pre-
f9b0: 73 65 6c 65 63 74 65 64 20 6b 65 79 73 22 29 3b  selected keys");
f9c0: 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a 09 09  .....piv = 1;...
f9d0: 7d 20 65 6c 73 65 20 7b 0a 0a 09 09 09 43 41 43  } else {.....CAC
f9e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f9f0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
fa00: 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72  ct CCC Applet, r
fa10: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
fa20: 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65  ure");...../* Te
fa30: 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72  rminate SmartCar
fa40: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
fa50: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
fa60: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
fa70: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c  ;.....return(NUL
fa80: 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  L);...}..}...if 
fa90: 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69  (piv) {...for (i
faa0: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b  dx = 0; idx < 3;
fab0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69   idx++) {....swi
fac0: 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09  tch (idx) {.....
fad0: 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76  case 0:......piv
fae0: 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70  _oid = piv_oid_p
faf0: 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76  ivauth;......piv
fb00: 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
fb10: 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54  _78_3_KEY_PIVAUT
fb20: 48 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  H;......break;..
fb30: 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09 09 09  ...case 1:......
fb40: 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69  piv_oid = piv_oi
fb50: 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09 09 09  d_signature;....
fb60: 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54  ..piv_key = NIST
fb70: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 53  SP800_78_3_KEY_S
fb80: 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09 09 62  IGNATURE;......b
fb90: 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32  reak;.....case 2
fba0: 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
fbb0: 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b   piv_oid_keymgt;
fbc0: 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
fbd0: 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
fbe0: 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09  EY_KEYMGT;......
fbf0: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
fc00: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
fc10: 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c  y_get_data(slot,
fc20: 20 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28   buffer, sizeof(
fc30: 62 75 66 66 65 72 29 2c 20 70 69 76 5f 6f 69 64  buffer), piv_oid
fc40: 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 61 64 5f  );.....if (read_
fc50: 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09  ret <= 0) {.....
fc60: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
fc70: 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65  ...curr_id = &ce
fc80: 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09  rts[outidx];....
fc90: 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 63 75  outidx++;.....cu
fca0: 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d  rr_id->keysize =
fcb0: 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d   -1;....curr_id-
fcc0: 3e 66 69 6c 65 20 3d 20 30 78 46 46 46 46 3b 0a  >file = 0xFFFF;.
fcd0: 09 09 09 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  ...curr_id->appl
fce0: 65 74 5b 30 5d 20 3d 20 70 69 76 5f 6b 65 79 3b  et[0] = piv_key;
fcf0: 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
fd00: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
fd10: 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72  read_ret;....cur
fd20: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
fd30: 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
fd40: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
fd50: 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28  len);....memcpy(
fd60: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
fd70: 63 61 74 65 2c 20 62 75 66 66 65 72 20 2b 20 34  cate, buffer + 4
fd80: 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
fd90: 66 69 63 61 74 65 5f 6c 65 6e 20 2d 20 34 29 3b  ficate_len - 4);
fda0: 20 2f 2a 20 58 58 58 20 54 4f 44 4f 20 50 49 56   /* XXX TODO PIV
fdb0: 20 28 2d 34 20 68 65 61 64 65 72 2c 20 2d 35 20   (-4 header, -5 
fdc0: 74 72 61 69 6c 65 72 20 3d 3d 20 77 68 79 20 3f  trailer == why ?
fdd0: 29 20 2a 2f 0a 09 09 09 63 75 72 72 5f 69 64 2d  ) */....curr_id-
fde0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
fdf0: 20 2d 3d 20 34 3b 0a 09 09 09 63 75 72 72 5f 69   -= 4;....curr_i
fe00: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
fe10: 65 6e 20 2d 3d 20 35 3b 0a 09 09 7d 0a 09 7d 20  en -= 5;...}..} 
fe20: 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64  else {.../* Read
fe30: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
fe40: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
fe50: 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76  TLV */...ccc_tlv
fe60: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
fe70: 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20  lv(slot);..../* 
fe80: 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c  Look for CARDURL
fe90: 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e  s that coorespon
fea0: 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73  d to PKI applets
feb0: 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63 5f 63   */...for (ccc_c
fec0: 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63  urr = ccc_tlv; c
fed0: 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72  cc_curr; ccc_cur
fee0: 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e  r = ccc_curr->_n
fef0: 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
ff00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
ff10: 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
ff20: 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
ff30: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
ff40: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
ff50: 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f 63 75  ;.....if (ccc_cu
ff60: 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
ff70: 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a  _TAG_CARDURL) {.
ff80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ff90: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
ffa0: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
ffb0: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
ffc0: 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
ffd0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
ffe0: 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63 75 72  ....if ((ccc_cur
fff0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10000 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b  ->apptype & CACK
10010 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20  EY_TLV_APP_PKI) 
10020 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  != CACKEY_TLV_AP
10030 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43 41 43  P_PKI) {.....CAC
10040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10050 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67  ("  ... skipping
10060 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72   it (we only car
10070 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c  e about PKI appl
10080 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74  ets, this applet
10090 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30   supports: %s/%0
100a0 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
100b0 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
100c0 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
100d0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
100e0 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67  apptype), (unsig
100f0 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72  ned int) ccc_cur
10100 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10110 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09  ->apptype);.....
10120 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10130 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10140 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
10150 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
10160 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
10170 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
10180 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10190 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  rid));....CACKEY
101a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
101b0 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ppID = %s/%04lx"
101c0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
101d0 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
101e0 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
101f0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
10200 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10210 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
10220 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
10230 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
10240 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63  UG_PRINTF("Objec
10250 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  tID = %s/%04lx",
10260 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
10270 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
10280 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10290 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
102a0 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
102b0 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
102c0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
102d0 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63  ectid);.....memc
102e0 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
102f0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
10300 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
10310 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
10320 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
10330 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69  ;....curr_aid[si
10340 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
10350 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d   2] = (ccc_curr-
10360 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10370 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78  appid >> 8) & 0x
10380 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ff;....curr_aid[
10390 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
103a0 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72   - 1] = ccc_curr
103b0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
103c0 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a  >appid & 0xff;..
103d0 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75  .../* Select fou
103e0 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f  nd applet ... */
103f0 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
10400 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
10410 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
10420 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
10430 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66 20 28  r_aid));....if (
10440 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
10450 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
10460 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
10470 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
10480 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
10490 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
104a0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
104b0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
104c0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
104d0 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a  ../* ... and obj
104e0 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09  ect (file) */...
104f0 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
10500 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
10510 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d  (slot, ccc_curr-
10520 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10530 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09 69 66  objectid);....if
10540 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
10550 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
10560 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
10570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
10580 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69  led to select fi
10590 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  le, skipping pro
105a0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
105b0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
105c0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
105d0 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69  ../* Process thi
105e0 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f  s file's TLV loo
105f0 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69  king for certifi
10600 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f  cates */....app_
10610 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
10620 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09  d_tlv(slot);....
10630 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20  ..for (app_curr 
10640 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63  = app_tlv; app_c
10650 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20  urr; app_curr = 
10660 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29  app_curr->_next)
10670 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10680 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
10690 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b  d tag: %s", CACK
106a0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
106b0 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72  G_TO_STR(app_cur
106c0 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09 69 66  r->tag));.....if
106d0 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
106e0 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
106f0 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
10700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10710 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
10720 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
10730 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54   care about CERT
10740 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09  IFICATEs)");....
10750 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
10760 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 20  .}......curr_id 
10770 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
10780 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ;.....outidx++;.
10790 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
107a0 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72  _id->applet, cur
107b0 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75  r_aid, sizeof(cu
107c0 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b  rr_id->applet));
107d0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 66 69  .....curr_id->fi
107e0 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  le = ccc_curr->v
107f0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
10800 6a 65 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72  jectid;.....curr
10810 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
10820 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  1;......CACKEY_D
10830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
10840 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70  ling curr_id->ap
10850 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25  plet (%p) with %
10860 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72  lu bytes:", curr
10870 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e  _id->applet, (un
10880 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
10890 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
108a0 6c 65 74 29 29 3b 0a 09 09 09 09 43 41 43 4b 45  let));.....CACKE
108b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
108c0 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64  ("VAL:", curr_id
108d0 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  ->applet, sizeof
108e0 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
108f0 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64  ));......curr_id
10900 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10910 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65  n = app_curr->le
10920 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ngth;......curr_
10930 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
10940 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
10950 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10960 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  n);.....memcpy(c
10970 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10980 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76  ate, app_curr->v
10990 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63  alue, curr_id->c
109a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
109b0 0a 0a 09 09 09 09 69 66 20 28 6f 75 74 69 64 78  ......if (outidx
109c0 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
109d0 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
109e0 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 09  izable) {.......
109f0 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09  *count *= 2;....
10a00 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
10a10 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
10a20 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
10a30 6e 74 29 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73  nt));......} els
10a40 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  e {.......break;
10a50 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
10a60 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
10a70 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b  ee_tlv(app_tlv);
10a80 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20  .....if (outidx 
10a90 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09  >= *count) {....
10aa0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
10ab0 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
10ac0 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d  tlv(ccc_tlv);..}
10ad0 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69  ...*count = outi
10ae0 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f  dx;...if (certs_
10af0 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63  resizable) {...c
10b00 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63  erts = realloc(c
10b10 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65  erts, sizeof(*ce
10b20 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29  rts) * (*count))
10b30 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63  ;..}...slot->cac
10b40 68 65 64 5f 63 65 72 74 73 20 3d 20 63 61 63 6b  hed_certs = cack
10b50 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 4e 55  ey_copy_certs(NU
10b60 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e  LL, certs, *coun
10b70 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65  t);..slot->cache
10b80 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20  d_certs_count = 
10b90 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72  *count;.../* Ter
10ba0 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
10bb0 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
10bc0 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
10bd0 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
10be0 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
10bf0 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
10c00 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
10c10 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
10c20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
10c30 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
10c40 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
10c50 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
10c60 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
10c70 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65  _t cackey_signde
10c80 63 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63  crypt(struct cac
10c90 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
10ca0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
10cb0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
10cc0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
10cd0 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66  *buf, size_t buf
10ce0 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  len, unsigned ch
10cf0 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65  ar *outbuf, size
10d00 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e  _t outbuflen, in
10d10 74 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20  t padInput, int 
10d20 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09  unpadOutput) {..
10d30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 79  unsigned char dy
10d40 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
10d50 31 30 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  10];..unsigned c
10d60 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d  har *tmpbuf, *tm
10d70 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f  pbuf_s, *outbuf_
10d80 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
10d90 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  r bytes_to_send,
10da0 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73   p1, class;..uns
10db0 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b  igned char block
10dc0 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65  type;..cackey_re
10dd0 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
10de0 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
10df0 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20  .ssize_t retval 
10e00 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74  = 0, unpadoffset
10e10 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
10e20 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70  len, padlen, tmp
10e30 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  outbuflen;..int 
10e40 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
10e50 0a 09 69 6e 74 20 6c 65 3b 0a 09 69 6e 74 20 70  ..int le;..int p
10e60 69 76 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  iv;...CACKEY_DEB
10e70 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
10e80 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
10e90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
10ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10eb0 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
10ec0 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
10ed0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
10ee0 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
10ef0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
10f00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
10f10 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
10f20 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
10f30 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
10f40 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
10f50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10f60 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
10f70 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
10f80 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
10f90 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
10fa0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
10fb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
10fc0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
10fd0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
10fe0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
10ff0 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
11000 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
11010 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
11020 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11030 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
11040 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
11050 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
11060 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
11070 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
11080 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
11090 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
110a0 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
110b0 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
110c0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
110d0 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
110e0 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
110f0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11100 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
11110 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
11120 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
11130 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
11140 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
11150 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
11160 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
11170 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
11180 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11190 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
111a0 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
111b0 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
111c0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
111d0 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
111e0 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
111f0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11200 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20  ->keysize + 3)) 
11210 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
11220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11230 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
11240 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
11250 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
11260 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
11270 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
11280 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
11290 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
112a0 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
112b0 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
112c0 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
112d0 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
112e0 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
112f0 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
11300 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b  ;....../* RSA PK
11310 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d  CS#1 EMSA-PKCS1-
11320 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a  v1_5 Padding */.
11330 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20  ....tmpbuf[0] = 
11340 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66  0x00;.....tmpbuf
11350 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09  [1] = 0x01;.....
11360 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32  memset(&tmpbuf[2
11370 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29  ], 0xFF, padlen)
11380 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64  ;.....tmpbuf[pad
11390 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a  len + 2]= 0x00;.
113a0 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62  ....memcpy(&tmpb
113b0 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20  uf[padlen + 3], 
113c0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  buf, buflen);...
113d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
113e0 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
113f0 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65  ed:", buf, bufle
11400 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  n);.....CACKEY_D
11410 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
11420 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c  added:", tmpbuf,
11430 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09   tmpbuflen);....
11440 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70  } else {.....tmp
11450 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74  buf = buf;.....t
11460 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
11470 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  n;.....free_tmpb
11480 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c  uf = 0;.....padl
11490 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  en = 0;....}...}
114a0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
114b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
114c0 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
114d0 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
114e0 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
114f0 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
11500 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62  ded!");.....tmpb
11510 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70  uf = buf;....tmp
11520 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
11530 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
11540 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d  = 0;....padlen =
11550 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20   0;...}..} else 
11560 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  {...tmpbuf = buf
11570 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ;...tmpbuflen = 
11580 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74  buflen;...free_t
11590 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64  mpbuf = 0;...pad
115a0 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  len = 0;..}.../*
115b0 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   Begin transacti
115c0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
115d0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
115e0 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 44 65 74 65  slot);.../* Dete
115f0 72 6d 69 6e 65 20 74 79 70 65 20 6f 66 20 74 72  rmine type of tr
11600 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 69 66  ansaction */..if
11610 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
11620 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65 20  _identity->file 
11630 3d 3d 20 30 78 46 46 46 46 29 20 7b 0a 09 09 70  == 0xFFFF) {...p
11640 69 76 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  iv = 1;..} else 
11650 7b 0a 09 09 70 69 76 20 3d 20 30 3b 0a 09 7d 0a  {...piv = 0;..}.
11660 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72  ../* Select corr
11670 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 69  ect applet */..i
11680 66 20 28 21 70 69 76 29 20 7b 0a 09 09 43 41 43  f (!piv) {...CAC
11690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
116a0 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
116b0 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
116c0 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
116d0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
116e0 70 6c 65 74 29 3b 0a 09 09 63 61 63 6b 65 79 5f  plet);...cackey_
116f0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
11700 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
11710 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
11720 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e  let, sizeof(iden
11730 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11740 69 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a  ity->applet));..
11750 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72  ../* Select corr
11760 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09 63 61  ect file */...ca
11770 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
11780 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d  (slot, identity-
11790 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
117a0 66 69 6c 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  file);..} else {
117b0 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
117c0 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a  late[0] = 0x7C;.
117d0 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
117e0 61 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09  ate[1] = 0x82;..
117f0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
11800 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66  te[2] = ((tmpbuf
11810 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30  len + 6) & 0xff0
11820 30 29 20 3e 3e 20 38 3b 0a 09 09 64 79 6e 5f 61  0) >> 8;...dyn_a
11830 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20  uth_template[3] 
11840 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36  = (tmpbuflen + 6
11850 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 64 79  ) & 0x00ff;...dy
11860 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
11870 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 64 79 6e  4] = 0x82;...dyn
11880 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35  _auth_template[5
11890 5d 20 3d 20 30 78 30 30 3b 0a 09 09 64 79 6e 5f  ] = 0x00;...dyn_
118a0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d  auth_template[6]
118b0 20 3d 20 30 78 38 31 3b 0a 09 09 64 79 6e 5f 61   = 0x81;...dyn_a
118c0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20  uth_template[7] 
118d0 3d 20 30 78 38 32 3b 0a 09 09 64 79 6e 5f 61 75  = 0x82;...dyn_au
118e0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d  th_template[8] =
118f0 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78   (tmpbuflen & 0x
11900 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 64 79  ff00) >> 8;...dy
11910 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
11920 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26  9] = tmpbuflen &
11930 20 30 78 30 30 66 66 3b 0a 0a 09 09 73 65 6e 64   0x00ff;....send
11940 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
11950 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 30 78  nd_apdu(slot, 0x
11960 31 30 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33  10, NISTSP800_73
11970 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48  _3_INSTR_GENAUTH
11980 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  , NISTSP800_78_3
11990 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69  _ALGO_RSA2048, i
119a0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
119b0 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 5b 30  entity->applet[0
119c0 5d 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75  ], sizeof(dyn_au
119d0 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20 64 79  th_template), dy
119e0 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c  n_auth_template,
119f0 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
11a00 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  L, NULL);..}...t
11a10 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66  mpbuf_s = tmpbuf
11a20 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
11a30 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d  tbuf;..while (tm
11a40 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20  pbuflen) {...if 
11a50 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35  (tmpbuflen > 245
11a60 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
11a70 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 69  send = 245;....i
11a80 66 20 28 70 69 76 29 20 7b 0a 09 09 09 09 63 6c  f (piv) {.....cl
11a90 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09  ass = 0x10;.....
11aa0 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 7d 20  le = 0x00;....} 
11ab0 65 6c 73 65 20 7b 0a 09 09 09 09 70 31 20 3d 20  else {.....p1 = 
11ac0 30 78 38 30 3b 0a 09 09 09 09 6c 65 20 3d 20 30  0x80;.....le = 0
11ad0 78 30 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  x00;....}...} el
11ae0 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  se {....bytes_to
11af0 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65  _send = tmpbufle
11b00 6e 3b 0a 09 09 09 69 66 20 28 70 69 76 29 20 7b  n;....if (piv) {
11b10 0a 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43  .....class = GSC
11b20 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
11b30 3b 0a 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a  ;.....le = 256;.
11b40 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
11b50 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 6c  p1 = 0x00;.....l
11b60 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 7d 0a 09  e = 0x00;....}..
11b70 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c  .}....tmpoutbufl
11b80 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a  en = outbuflen;.
11b90 0a 09 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
11ba0 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
11bb0 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
11bc0 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 53 50  t, class, NISTSP
11bd0 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11be0 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30  ENAUTH, NISTSP80
11bf0 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32  0_78_3_ALGO_RSA2
11c00 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  048, identity->p
11c10 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
11c20 70 6c 65 74 5b 30 5d 2c 20 62 79 74 65 73 5f 74  plet[0], bytes_t
11c30 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
11c40 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
11c50 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
11c60 66 6c 65 6e 29 3b 0a 09 09 7d 20 65 6c 73 65 20  flen);...} else 
11c70 7b 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  {....send_ret = 
11c80 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
11c90 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
11ca0 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
11cb0 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  RM, GSCIS_INSTR_
11cc0 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c  SIGNDECRYPT, p1,
11cd0 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f   0x00, bytes_to_
11ce0 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65  send, tmpbuf, le
11cf0 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74  , &respcode, out
11d00 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c  buf, &tmpoutbufl
11d10 65 6e 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28 73  en);...}...if (s
11d20 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
11d30 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
11d40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11d50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
11d60 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
11d70 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
11d80 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65  .");.....if (fre
11d90 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
11da0 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
11db0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
11dc0 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  _s);.....}....}.
11dd0 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ..../* End trans
11de0 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
11df0 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
11e00 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
11e10 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
11e20 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43  x6982) {.....CAC
11e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11e40 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75  ("Security statu
11e50 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64  s not satisified
11e60 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45  .  Returning NEE
11e70 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63  DLOGIN");......c
11e80 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
11e90 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09  reset(slot);....
11ea0 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
11eb0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
11ec0 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65  EQUIRED;......re
11ed0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
11ee0 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09  _E_NEEDLOGIN);..
11ef0 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64  ..}.....if (send
11f00 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
11f10 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
11f20 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  T) {.....CACKEY_
11f30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
11f40 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74  ken absent.  Ret
11f50 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45  urning TOKENABSE
11f60 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  NT");......cacke
11f70 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
11f80 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65  t(slot);......re
11f90 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
11fa0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
11fb0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
11fc0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  (-1);...}....tmp
11fd0 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  buf += bytes_to_
11fe0 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65  send;...tmpbufle
11ff0 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  n -= bytes_to_se
12000 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d  nd;....outbuf +=
12010 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
12020 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d  .outbuflen -= tm
12030 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65  poutbuflen;...re
12040 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tval += tmpoutbu
12050 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  flen;..}...if (f
12060 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
12070 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
12080 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
12090 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62  );...}..}...outb
120a0 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a  uf = outbuf_s;..
120b0 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
120c0 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
120d0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
120e0 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41  lot);..#ifdef CA
120f0 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
12100 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
12110 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74  IZE_MAX..if (out
12120 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  buflen > _POSIX_
12130 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
12140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12150 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78  TF("Outbuflen ex
12160 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
12170 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
12180 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
12190 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e  = %li, outbuflen
121a0 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
121b0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
121c0 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
121d0 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a  g) outbuflen);..
121e0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
121f0 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
12200 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65  .../* We must re
12210 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61  move the "7C" ta
12220 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20  g to get to the 
12230 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 69 66  signature */..if
12240 20 28 70 69 76 29 20 7b 0a 09 09 69 66 20 28 6f   (piv) {...if (o
12250 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 37 43  utbuf[0] != 0x7C
12260 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
12270 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
12280 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f  onse from PIV fo
12290 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45  r GENERATE AUTHE
122a0 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f  NTICATION was no
122b0 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65  t a 0x7C tag, re
122c0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
122d0 72 65 22 29 3b 0a 0a 0a 09 09 09 72 65 74 75 72  re");......retur
122e0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  n(-1);...}..../*
122f0 20 58 58 58 20 54 4f 44 4f 20 50 49 56 20 2a 2f   XXX TODO PIV */
12300 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75  ...memmove(outbu
12310 66 2c 20 6f 75 74 62 75 66 20 2b 20 38 2c 20 72  f, outbuf + 8, r
12320 65 74 76 61 6c 20 2d 20 38 29 3b 0a 09 09 72 65  etval - 8);...re
12330 74 76 61 6c 20 2d 3d 20 38 3b 0a 09 7d 0a 0a 09  tval -= 8;..}...
12340 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a  /* Unpad reply *
12350 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70  /..if (unpadOutp
12360 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76  ut) {...if (retv
12370 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43  al < 3) {....CAC
12380 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12390 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73  ("Reply is too s
123a0 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74  mall, we are not
123b0 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d   able to unpad -
123c0 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
123d0 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
123e0 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
123f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12400 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
12410 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
12420 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
12430 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
12440 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
12450 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f  l);...}....if (o
12460 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30  utbuf[0] != 0x00
12470 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
12480 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65  BUG_PRINTF("Unre
12490 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67  cognized padding
124a0 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69   scheme -- passi
124b0 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69  ng back and hopi
124c0 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21  ng for the best!
124d0 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
124e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
124f0 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
12500 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
12510 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
12520 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74   retval);....ret
12530 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d  urn(retval);...}
12540 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20  ....blocktype = 
12550 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70  outbuf[1];...unp
12560 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09  adoffset = 0;...
12570 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79  .switch (blockty
12580 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78  pe) {....case 0x
12590 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  00:...../* Paddi
125a0 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65  ng Scheme 1, the
125b0 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20   first non-zero 
125c0 62 79 74 65 20 69 73 20 74 68 65 20 73 74 61 72  byte is the star
125d0 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09  t of data */....
125e0 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
125f0 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
12600 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
12610 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
12620 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
12630 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78  padoffset] != 0x
12640 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  00) {.......brea
12650 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
12660 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
12670 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20  se 0x01:...../* 
12680 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32  Padding Scheme 2
12690 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20  , pad bytes are 
126a0 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79  0xFF followed by
126b0 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72   0x00 */.....for
126c0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
126d0 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c  2; unpadoffset <
126e0 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66   retval; unpadof
126f0 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69  fset++) {......i
12700 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
12710 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20  ffset] != 0xFF) 
12720 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74 62  {.......if (outb
12730 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
12740 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  == 0x00) {......
12750 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
12760 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  .........break;.
12770 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
12780 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
12790 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
127a0 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20  id padding data 
127b0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67  found, returning
127c0 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f   in failure, sho
127d0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78  uld have been 0x
127e0 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22  00 found 0x%02x"
127f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
12800 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66   outbuf[unpadoff
12810 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72  set]);.........r
12820 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
12830 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
12840 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
12850 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
12860 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61  lid padding data
12870 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e   found, returnin
12880 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68  g in failure, sh
12890 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30  ould have been 0
128a0 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78  xFF found 0x%02x
128b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
128c0 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66  ) outbuf[unpadof
128d0 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72  fset]);........r
128e0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
128f0 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
12900 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a  k;....case 0x02:
12910 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
12920 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79  Scheme 3, pad by
12930 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f  tes are non-zero
12940 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65   first zero byte
12950 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65   found is the se
12960 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a  perator byte */.
12970 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
12980 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
12990 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
129a0 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
129b0 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
129c0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d  [unpadoffset] ==
129d0 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75   0x00) {.......u
129e0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
129f0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
12a00 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  .}.....}.....bre
12a10 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75  ak;...}....if (u
12a20 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74  npadoffset > ret
12a30 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  val) {....CACKEY
12a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
12a50 66 66 73 65 74 20 67 72 65 61 74 65 72 20 74 68  ffset greater th
12a60 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61  an reply size, a
12a70 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64  borting.  (unpad
12a80 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65  offset = %lu, re
12a90 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75  tval = %lu)", (u
12aa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e  nsigned long) un
12ab0 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69  padoffset, (unsi
12ac0 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61  gned long) retva
12ad0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
12ae0 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  1);...}....CACKE
12af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12b00 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62  ("Padded:", outb
12b10 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  uf, retval);....
12b20 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f  retval -= unpado
12b30 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65  ffset;...memmove
12b40 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20  (outbuf, outbuf 
12b50 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72  + unpadoffset, r
12b60 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45  etval);....CACKE
12b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12b80 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75  ("Unpadded:", ou
12b90 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09  tbuf, retval);..
12ba0 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
12bb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
12bc0 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
12bd0 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
12be0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
12bf0 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
12c00 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20  retval);.}../*. 
12c10 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
12c20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
12c30 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
12c40 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
12c50 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
12c60 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
12c70 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
12c80 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
12c90 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75  ackey_login(stru
12ca0 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
12cb0 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
12cc0 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e  har *pin, unsign
12cd0 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c  ed long pin_len,
12ce0 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61   int *tries_rema
12cf0 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69  ining_p) {..unsi
12d00 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69  gned char cac_pi
12d10 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78  n[8] = {0xFF, 0x
12d20 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
12d30 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
12d40 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36  , 0xFF};..uint16
12d50 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  _t response_code
12d60 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
12d70 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e  aining;..int sen
12d80 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f  d_ret;..int key_
12d90 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30  reference = 0x00
12da0 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20  ;.../* Indicate 
12db0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b  that we do not k
12dc0 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61  now about how ma
12dd0 6e 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d  ny tries are rem
12de0 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74  aining */..if (t
12df0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
12e00 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d  ) {...*tries_rem
12e10 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09  aining_p = -1;..
12e20 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c  }.../* Apparentl
12e30 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20  y, CAC PINs are 
12e40 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65  *EXACTLY* 8 byte
12e50 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69  s long -- pad wi
12e60 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73  th 0xFF if too s
12e70 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
12e80 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d  _len >= 8) {...m
12e90 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
12ea0 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20  in, 8);..} else 
12eb0 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
12ec0 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e  in, pin, pin_len
12ed0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65  );..}.../* Issue
12ee0 20 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09   PIN Verify */..
12ef0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
12f00 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
12f10 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
12f20 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
12f30 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c  TR_VERIFY, 0x00,
12f40 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20   key_reference, 
12f50 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
12f60 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
12f70 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
12f80 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
12f90 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
12fa0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 26  CKEY_PCSC_S_OK &
12fb0 26 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  & response_code 
12fc0 3d 3d 20 30 78 36 41 38 38 29 20 7b 0a 09 09 6b  == 0x6A88) {...k
12fd0 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30  ey_reference = 0
12fe0 78 38 30 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74  x80;....send_ret
12ff0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
13000 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
13010 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
13020 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
13030 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66  Y, 0x00, key_ref
13040 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63  erence, sizeof(c
13050 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e  ac_pin), cac_pin
13060 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73  , 0x00, &respons
13070 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55  e_code, NULL, NU
13080 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65  LL);..}...if (se
13090 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
130a0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
130b0 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f  if ((response_co
130c0 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20  de & 0x63C0) == 
130d0 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69  0x63C0) {....tri
130e0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28  es_remaining = (
130f0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
13100 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  0xF);.....CACKEY
13110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
13120 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
13130 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73  failed, %i tries
13140 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69   remaining", tri
13150 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a  es_remaining);..
13160 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
13170 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09  aining_p) {.....
13180 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
13190 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  _p = tries_remai
131a0 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  ning;....}.....r
131b0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
131c0 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d  C_E_BADPIN);...}
131d0 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
131e0 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29  _code == 0x6983)
131f0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
13200 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
13210 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
13220 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f  ed, device is lo
13230 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  cked");.....retu
13240 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
13250 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09  _LOCKED);...}...
13260 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
13270 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
13280 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
13290 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
132a0 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65  rification succe
132b0 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
132c0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
132d0 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
132e0 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
132f0 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
13300 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13310 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
13320 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13330 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
13340 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
13350 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
13360 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
13370 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
13380 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
13390 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e  ey_ret pcsc_conn
133a0 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20  ect_ret;..DWORD 
133b0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20  reader_len = 0, 
133c0 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f  state = 0, proto
133d0 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e  col = 0, atr_len
133e0 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f  ;..BYTE atr[MAX_
133f0 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47  ATR_SIZE];..LONG
13400 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61   status_ret, sca
13410 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a  rd_reconn_ret;..
13420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13430 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
13440 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74  ...if (slot->int
13450 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45  ernal) {...CACKE
13460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13470 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  Returning token 
13480 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61  present (interna
13490 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72  l token)");....r
134a0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
134b0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
134c0 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
134d0 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
134e0 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
134f0 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  lot);..if (pcsc_
13500 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
13510 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
13520 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13530 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
13540 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63   to connect to c
13550 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
13560 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a  oken absent");..
13570 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
13580 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
13590 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65  NT);..}...atr_le
135a0 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b  n = sizeof(atr);
135b0 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
135c0 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
135d0 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
135e0 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
135f0 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
13600 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
13610 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72  ;...if (status_r
13620 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e  et == SCARD_E_IN
13630 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a  VALID_HANDLE) {.
13640 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13650 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61 74  RINTF("SCardStat
13660 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  us() returned SC
13670 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
13680 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73  NDLE, marking is
13690 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e   not already con
136a0 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e  nected and tryin
136b0 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63  g again");...cac
136c0 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
136d0 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63  set(slot);....pc
136e0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
136f0 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
13700 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66  card(slot);...if
13710 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
13720 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
13730 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
13740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13750 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
13760 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
13770 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
13780 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ent");.....retur
13790 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
137a0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
137b0 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73  }....atr_len = s
137c0 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74  izeof(atr);...st
137d0 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64  atus_ret = SCard
137e0 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73  Status(slot->pcs
137f0 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72  c_card, NULL, &r
13800 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74  eader_len, &stat
13810 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74  e, &protocol, at
13820 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d  r, &atr_len);..}
13830 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
13840 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
13850 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79  CESS) {...cackey
13860 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13870 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73  (slot);....if (s
13880 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
13890 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
138a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
138b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
138c0 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
138d0 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
138e0 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
138f0 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
13900 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
13910 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
13920 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
13930 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c  OL_T1, &protocol
13940 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
13950 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
13960 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
13970 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70  ...../* Update p
13980 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73  rotocol */.....s
13990 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
139a0 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f  protocol;....../
139b0 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
139c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
139d0 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
139e0 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
139f0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
13a00 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
13a10 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
13a20 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f  epth--;......slo
13a30 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
13a40 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
13a50 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
13a60 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
13a70 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
13a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13a90 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
13aa0 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69  essful, requeryi
13ab0 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73  ng");.....status
13ac0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
13ad0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
13ae0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
13af0 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
13b00 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
13b10 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66  atr_len);.....if
13b20 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20   (status_ret != 
13b30 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
13b40 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
13b50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69  EBUG_PRINTF("Sti
13b60 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65  ll unable to que
13b70 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
13b80 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
13b90 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
13ba0 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
13bb0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
13bc0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
13bd0 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
13be0 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13bf0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
13c00 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09  SENT);.....}....
13c10 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
13c20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13c30 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f  ("Unable to reco
13c40 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
13c50 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
13c60 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63  bsent.  SCardRec
13c70 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20  onnect() = %s", 
13c80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
13c90 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
13ca0 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  R(scard_reconn_r
13cb0 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  et));......retur
13cc0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
13cd0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
13ce0 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
13cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13d00 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
13d10 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
13d20 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
13d30 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
13d40 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
13d50 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
13d60 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
13d70 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
13d80 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
13d90 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
13da0 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
13db0 09 69 66 20 28 28 73 74 61 74 65 20 26 20 53 43  .if ((state & SC
13dc0 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53  ARD_ABSENT) == S
13dd0 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09  CARD_ABSENT) {..
13de0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13df0 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 61 62  INTF("Card is ab
13e00 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  sent, returning 
13e10 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
13e20 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
13e30 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
13e40 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ENT);..}...CACKE
13e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13e60 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  Returning token 
13e70 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65  present.");...re
13e80 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13e90 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
13ea0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
13eb0 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
13ec0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
13ed0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13ee0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
13ef0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
13f00 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
13f10 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
13f20 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ze_t cackey_pcsc
13f30 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
13f40 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  el(struct cackey
13f50 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
13f60 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
13f70 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62  ed char *label_b
13f80 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  uf, unsigned lon
13f90 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29  g label_buf_len)
13fa0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
13fb0 67 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  g certificate_le
13fc0 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f  n;..void *label_
13fd0 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72  asn1;..void *cer
13fe0 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78  tificate;..int x
13ff0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09  509_read_ret;...
14000 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64  certificate = id
14010 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
14020 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74  ate;..certificat
14030 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  e_len = identity
14040 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
14050 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69  n;...if (certifi
14060 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a  cate_len < 0) {.
14070 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
14080 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
14090 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65   = x509_to_subje
140a0 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ct(certificate, 
140b0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
140c0 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65   (void **) &labe
140d0 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35  l_asn1);..if (x5
140e0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
140f0 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
14100 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
14110 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
14120 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
14130 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
14140 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
14150 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
14160 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66  _len, "CN");..if
14170 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
14180 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72  <= 0) {...x509_r
14190 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64  ead_ret = x509_d
141a0 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65  n_to_string(labe
141b0 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61  l_asn1, x509_rea
141c0 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20  d_ret, (char *) 
141d0 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c  label_buf, label
141e0 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b  _buf_len, NULL);
141f0 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
14200 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
14210 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
14220 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
14230 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
14240 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
14250 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f  E_MAX..if (x509_
14260 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49  read_ret > _POSI
14270 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
14280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14290 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f  INTF("x509_read_
142a0 72 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  ret exceeds maxi
142b0 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
142c0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
142d0 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30   (max = %li, x50
142e0 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75  9_read_ret = %lu
142f0 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
14300 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
14310 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30  signed long) x50
14320 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09  9_read_ret);....
14330 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
14340 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
14350 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61  .return(x509_rea
14360 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  d_ret);.}../* Re
14370 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
14380 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
14390 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72   cackey_mutex_cr
143a0 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65  eate(void **mute
143b0 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
143c0 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
143d0 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
143e0 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
143f0 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
14400 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14410 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
14420 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
14430 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
14440 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
14450 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
14460 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
14470 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f  ad_mutex = mallo
14480 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61  c(sizeof(*pthrea
14490 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20  d_mutex));...if 
144a0 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  (!pthread_mutex)
144b0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
144c0 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
144d0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
144e0 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74  mory.");.....ret
144f0 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
14500 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
14510 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69   pthread_mutex_i
14520 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65  nit(pthread_mute
14530 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28  x, NULL);...if (
14540 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
14550 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
14560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
14570 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
14580 74 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  t() returned err
14590 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
145a0 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
145b0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
145c0 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72  ...*mutex = pthr
145d0 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c  ead_mutex;..} el
145e0 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
145f0 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
14600 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
14610 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
14620 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
14630 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
14640 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
14650 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
14660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14670 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
14680 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 72  .CreateMutex() r
14690 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
146a0 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75  li).", (long) cu
146b0 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  stom_retval);...
146c0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
146d0 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ..}...}..}...CAC
146e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
146f0 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65  ("Returning suce
14700 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a  ssfully (0)");..
14710 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
14720 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
14730 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
14740 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
14750 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74  x_lock(void *mut
14760 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
14770 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
14780 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
14790 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
147a0 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
147b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
147c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
147d0 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
147e0 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
147f0 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
14800 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
14810 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
14820 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65  ead_mutex = mute
14830 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  x;....pthread_re
14840 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
14850 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61  utex_lock(pthrea
14860 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
14870 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
14880 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
14890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
148a0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
148b0 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
148c0 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
148d0 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
148e0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
148f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
14900 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
14910 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
14920 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
14930 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
14940 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
14950 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
14960 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
14970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14980 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
14990 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65  s.LockMutex() re
149a0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
149b0 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
149c0 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
149d0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
149e0 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
149f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14a00 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
14a10 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
14a20 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
14a30 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
14a40 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
14a50 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
14a60 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75  _unlock(void *mu
14a70 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
14a80 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
14a90 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
14aa0 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
14ab0 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
14ac0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
14ad0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
14ae0 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
14af0 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
14b00 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
14b10 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
14b20 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
14b30 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74  read_mutex = mut
14b40 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ex;....pthread_r
14b50 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
14b60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68  mutex_unlock(pth
14b70 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
14b80 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
14b90 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
14ba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14bb0 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
14bc0 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  unlock() returne
14bd0 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
14be0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
14bf0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14c00 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
14c10 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
14c20 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  .UnlockMutex) {.
14c30 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
14c40 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55   = cackey_args.U
14c50 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  nlockMutex(mutex
14c60 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
14c70 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
14c80 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
14c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
14ca0 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
14cb0 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
14cc0 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
14cd0 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
14ce0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
14cf0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
14d00 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
14d10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14d20 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
14d30 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
14d40 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
14d50 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
14d60 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
14d70 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54  ibutes(CK_OBJECT
14d80 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61  _CLASS objectcla
14d90 73 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ss, struct cacke
14da0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
14db0 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67  *identity, unsig
14dc0 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
14dd0 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  y_num, CK_ULONG_
14de0 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
14df0 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
14e00 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73   ck_true = 1;..s
14e10 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
14e20 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74  k_false = 0;..st
14e30 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b  atic CK_TRUST ck
14e40 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52  _trusted = CK_TR
14e50 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b  USTED_DELEGATOR;
14e60 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74  ..CK_ULONG numat
14e70 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f  trs = 0, retval_
14e80 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49  count;..CK_ATTRI
14e90 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61  BUTE_TYPE curr_a
14ea0 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54  ttr_type;..CK_AT
14eb0 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74  TRIBUTE curr_att
14ec0 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  r, *retval;..CK_
14ed0 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
14ee0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
14ef0 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43  ueLen;..CK_OBJEC
14f00 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63  T_CLASS ck_objec
14f10 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52  t_class;..CK_CER
14f20 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b  TIFICATE_TYPE ck
14f30 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14f40 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20  e;..CK_KEY_TYPE 
14f50 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b  ck_key_type;..CK
14f60 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42  _UTF8CHAR ucTmpB
14f70 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43  uf[1024];..SHA1C
14f80 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b  ontext sha1_ctx;
14f90 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74  ..MD5_CTX md5_ct
14fa0 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31  x;..uint8_t sha1
14fb0 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68 53 69  _hash[SHA1HashSi
14fc0 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64  ze];..uint8_t md
14fd0 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69  5_hash[MD5HashSi
14fe0 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ze];..unsigned c
14ff0 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
15000 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69  ;..ssize_t certi
15010 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c  ficate_len = -1,
15020 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
15030 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65  .int pValue_free
15040 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15050 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20  _PRINTF("Called 
15060 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25  (objectClass = %
15070 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  lu, identity_num
15080 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
15090 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63  gned long) objec
150a0 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79  tclass, identity
150b0 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75  _num);...*pulCou
150c0 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62  nt = 0;...if (ob
150d0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
150e0 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
150f0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
15100 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26  KO_PUBLIC_KEY &&
15110 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
15120 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
15130 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
15140 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
15150 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  RUST) {...CACKEY
15160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15170 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
15180 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
15190 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22  id object class"
151a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
151b0 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20  L);..}.../* Get 
151c0 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65  Cert */..if (ide
151d0 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
151e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
151f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
15200 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
15210 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e  L), invalid iden
15220 74 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a  tiy provided");.
15230 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
15240 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74  ..}...certificat
15250 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  e = identity->ce
15260 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74  rtificate;..cert
15270 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64  ificate_len = id
15280 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
15290 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63  ate_len;...if (c
152a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
152b0 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63  = -1 || certific
152c0 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
152d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
152e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
152f0 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
15300 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20  , this identity 
15310 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
15320 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
15330 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  te associated wi
15340 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e  th it and will n
15350 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65  ot work");....re
15360 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
15370 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
15380 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41  certificate is A
15390 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35  SN.1 encoded X.5
153a0 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  09 certificate *
153b0 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73  /..if (x509_to_s
153c0 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74  erial(certificat
153d0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
153e0 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b  en, NULL) < 0) {
153f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15400 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
15410 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
15420 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65  L), the X.509 ce
15430 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
15440 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
15450 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76  dentity is not v
15460 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72  alid");....retur
15470 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
15480 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b  tval_count = 64;
15490 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
154a0 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  c(retval_count *
154b0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
154c0 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61  );...for (curr_a
154d0 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75  ttr_type = 0; cu
154e0 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30  rr_attr_type < 0
154f0 78 63 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f  xce5363bf; curr_
15500 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09  attr_type++) {..
15510 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74  .if (curr_attr_t
15520 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a  ype == 0x800) {.
15530 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70  ...curr_attr_typ
15540 65 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a  e = 0xce536300;.
15550 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72  ..}....pValue_fr
15560 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65  ee = 0;...pValue
15570 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c   = NULL;...ulVal
15580 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
15590 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20  ) -1;....switch 
155a0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29  (curr_attr_type)
155b0 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43   {....case CKA_C
155c0 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59  LASS:.....CACKEY
155d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
155e0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
155f0 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30  ute CKA_CLASS (0
15600 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15610 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15620 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15630 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  ....ck_object_cl
15640 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73  ass = objectclas
15650 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  s;......pValue =
15660 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73   &ck_object_clas
15670 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  s;.....ulValueLe
15680 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62  n = sizeof(ck_ob
15690 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09  ject_class);....
156a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
156b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
156c0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
156d0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
156e0 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43  ong) *((CK_OBJEC
156f0 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75  T_CLASS *) pValu
15700 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
15710 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15720 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15730 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15740 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b  _TOKEN:.....CACK
15750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15760 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15770 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20  ibute CKA_TOKEN 
15780 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15790 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
157a0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
157b0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
157c0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
157d0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
157e0 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
157f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15800 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15810 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
15820 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15830 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
15840 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
15850 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
15860 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
15870 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
15880 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a  ase CKA_PRIVATE:
15890 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
158a0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
158b0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
158c0 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78 25 30  KA_PRIVATE (0x%0
158d0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
158e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
158f0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
15900 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15910 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
15920 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
15930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15940 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
15950 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
15960 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
15970 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
15980 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
15990 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
159a0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
159b0 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
159c0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
159d0 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
159e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
159f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
15a00 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
15a10 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15a20 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
15a30 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
15a40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15a50 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
15a60 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
15a70 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09  e CKA_TRUSTED:..
15a80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15a90 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
15aa0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
15ab0 5f 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c  _TRUSTED (0x%08l
15ac0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
15ad0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
15ae0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
15af0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
15b00 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
15b10 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
15b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15b30 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
15b40 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
15b50 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
15b60 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
15b70 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
15b80 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c  .....}......pVal
15b90 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
15ba0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
15bb0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
15bc0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15bd0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15be0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
15bf0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15c00 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15c10 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15c20 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15c30 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
15c40 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
15c50 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
15c60 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
15c70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15c80 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
15c90 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
15ca0 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
15cb0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15cc0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15cd0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
15ce0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
15cf0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15d00 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
15d10 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
15d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15d30 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
15d40 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
15d50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
15d60 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
15d70 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
15d80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15d90 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15da0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15db0 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
15dc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15dd0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15de0 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
15df0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15e00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15e10 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
15e20 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65  ....../* XXX: De
15e30 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a  termine name */.
15e40 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
15e50 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20   snprintf((char 
15e60 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a  *) ucTmpBuf, siz
15e70 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22  eof(ucTmpBuf), "
15e80 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20  Identity #%lu", 
15e90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15ea0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09  identity_num);..
15eb0 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d  ...pValue = ucTm
15ec0 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 75  pBuf;......if (u
15ed0 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a  lValueLen >= siz
15ee0 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b  eof(ucTmpBuf)) {
15ef0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15f00 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 61 6c 75   = 0;......pValu
15f10 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  e = NULL;.....}.
15f20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15f30 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
15f40 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
15f50 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
15f60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15f70 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15f80 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15f90 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b  _VALUE:.....CACK
15fa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15fb0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15fc0 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20  ibute CKA_VALUE 
15fd0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15fe0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15ff0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
16000 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62  ......switch (ob
16010 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09  jectclass) {....
16020 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41  ..case CKO_PRIVA
16030 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41  TE_KEY:.......CA
16040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16050 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
16060 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
16070 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76  se we are a priv
16080 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09  ate key.");.....
16090 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
160a0 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45  ase CKO_NETSCAPE
160b0 5f 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41  _TRUST:.......CA
160c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
160d0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
160e0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
160f0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
16100 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
16110 74 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t");........brea
16120 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f  k;......case CKO
16130 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09  _PUBLIC_KEY:....
16140 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
16150 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
16160 09 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
16170 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75  ret = x509_to_pu
16180 62 6b 65 79 28 63 65 72 74 69 66 69 63 61 74 65  bkey(certificate
16190 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
161a0 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
161b0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
161c0 64 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09  d_ret < 0) { ...
161d0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
161e0 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c  ULL;........} el
161f0 73 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56  se {.........ulV
16200 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
16210 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09  ead_ret;........
16220 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  }.......}.......
16230 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
16240 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  e CKO_CERTIFICAT
16250 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  E:.......pValue 
16260 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  = certificate;..
16270 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
16280 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  = certificate_le
16290 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  n;........break;
162a0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
162b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
162c0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
162d0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
162e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
162f0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16300 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16310 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
16320 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16330 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
16340 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
16350 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29  ISSUER (0x%08lx)
16360 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16370 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16380 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
16390 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
163a0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
163b0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
163c0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
163d0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
163e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
163f0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
16400 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
16410 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
16420 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65  ertificate or Ne
16430 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
16440 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
16450 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
16460 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
16470 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
16480 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
16490 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63  x509_to_issuer(c
164a0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
164b0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
164c0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
164d0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
164e0 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
164f0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
16500 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
16510 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
16520 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
16530 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
16540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16550 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16560 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
16570 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16580 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16590 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
165a0 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
165b0 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BER:.....CACKEY_
165c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
165d0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
165e0 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  te CKA_SERIAL_NU
165f0 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  MBER (0x%08lx) .
16600 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
16610 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
16620 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
16630 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16640 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
16650 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
16660 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
16670 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
16680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16690 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
166a0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
166b0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
166c0 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73  tificate or Nets
166d0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
166e0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
166f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
16700 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
16710 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
16720 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
16730 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72  09_to_serial(cer
16740 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
16750 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
16760 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
16770 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
16780 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
16790 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
167a0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
167b0 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
167c0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
167d0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
167e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
167f0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
16800 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
16810 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16820 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16830 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16840 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09  e CKA_SUBJECT:..
16850 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16860 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16870 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16880 5f 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c  _SUBJECT (0x%08l
16890 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
168a0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
168b0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
168c0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
168d0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
168e0 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
168f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
16900 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
16910 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
16920 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
16930 69 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09  ificate");......
16940 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
16950 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
16960 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
16970 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
16980 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a  t = x509_to_subj
16990 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ect(certificate,
169a0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
169b0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
169c0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
169d0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
169e0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
169f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
16a00 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16a10 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
16a20 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
16a30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16a40 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
16a50 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
16a60 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
16a70 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
16a80 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
16a90 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09  ..case CKA_ID:..
16aa0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16ab0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16ac0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16ad0 5f 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  _ID (0x%08lx) ..
16ae0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16af0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
16b00 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
16b10 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
16b20 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
16b30 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
16b40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16b50 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
16b60 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
16b70 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
16b80 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
16b90 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
16ba0 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  }......ucTmpBuf[
16bb0 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f  0] = ((identity_
16bc0 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26  num + 1) >> 8) &
16bd0 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70   0xff;.....ucTmp
16be0 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74  Buf[1] =  (ident
16bf0 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30  ity_num + 1) & 0
16c00 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  xff;......pValue
16c10 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09   = &ucTmpBuf;...
16c20 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32  ..ulValueLen = 2
16c30 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
16c40 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16c50 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
16c60 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
16c70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
16c80 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
16c90 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
16ca0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
16cb0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
16cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
16cd0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
16ce0 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45   CKA_CERTIFICATE
16cf0 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
16d00 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
16d10 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
16d20 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
16d30 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
16d40 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
16d50 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
16d60 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16d70 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
16d80 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
16d90 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
16da0 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
16db0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
16dc0 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
16dd0 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63  ort one certific
16de0 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09  ate type */.....
16df0 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
16e00 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b  ype = CKC_X_509;
16e10 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
16e20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
16e30 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
16e40 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
16e50 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
16e60 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
16e70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16e80 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f  . returning CKC_
16e90 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f  X_509 (%lu) (%p/
16ea0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
16eb0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
16ec0 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
16ed0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
16ee0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16ef0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
16f00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
16f10 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a  se CKA_KEY_TYPE:
16f20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16f30 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
16f40 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
16f50 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25  KA_KEY_TYPE (0x%
16f60 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16f70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16f80 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16f90 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
16fa0 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
16fb0 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
16fc0 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass != CKO_PUBLI
16fd0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41  C_KEY) {......CA
16fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16ff0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
17000 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
17010 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
17020 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  key.");.......br
17030 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
17040 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
17050 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20  rt one key type 
17060 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79  */.....ck_key_ty
17070 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09  pe = CKK_RSA;...
17080 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
17090 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  key_type;.....ul
170a0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
170b0 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a  f(ck_key_type);.
170c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
170d0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
170e0 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41  eturning CKK_RSA
170f0 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
17100 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17110 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
17120 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
17130 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
17140 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17150 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17160 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17170 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b  A_SIGN:.....CACK
17180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17190 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
171a0 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28  ibute CKA_SIGN (
171b0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
171c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
171d0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
171e0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
171f0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
17200 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
17210 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17220 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
17230 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
17240 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
17250 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
17260 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
17270 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17280 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17290 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
172a0 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
172b0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
172c0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
172d0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
172e0 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
172f0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
17300 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
17310 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
17320 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
17330 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
17340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17350 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
17360 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
17370 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
17380 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
17390 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
173a0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
173b0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
173c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
173d0 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09  SIGN_RECOVER:...
173e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
173f0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
17400 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
17410 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78  SIGN_RECOVER (0x
17420 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
17430 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
17440 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
17450 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17460 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
17470 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
17480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17490 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
174a0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
174b0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
174c0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
174d0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
174e0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
174f0 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20  /* We currently 
17500 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69  only support "Si
17510 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78  gn with Appendix
17520 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20  " */.....pValue 
17530 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
17540 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17550 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
17560 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17570 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
17580 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
17590 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
175a0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
175b0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
175c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
175d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
175e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
175f0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43  ....case CKA_DEC
17600 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  RYPT:.....CACKEY
17610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17620 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17630 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20  ute CKA_DECRYPT 
17640 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
17650 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17660 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
17670 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
17680 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
17690 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
176a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
176b0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
176c0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
176d0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
176e0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
176f0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17700 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17710 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17720 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
17730 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63  E_KEY || objectc
17740 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c  lass == CKO_PUBL
17750 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  IC_KEY) {......p
17760 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
17770 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
17780 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
17790 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
177a0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
177b0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
177c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
177d0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
177e0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
177f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17800 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
17810 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
17820 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
17830 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
17840 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
17850 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17860 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17870 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17880 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09  A_SENSITIVE:....
17890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
178a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
178b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
178c0 45 4e 53 49 54 49 56 45 20 28 30 78 25 30 38 6c  ENSITIVE (0x%08l
178d0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
178e0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
178f0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
17900 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
17910 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
17920 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
17930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17940 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
17950 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
17960 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
17970 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
17980 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
17990 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
179a0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
179b0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
179c0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
179d0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
179e0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
179f0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
17a00 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
17a10 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
17a20 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
17a30 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
17a40 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
17a50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17a60 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17a70 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
17a80 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
17a90 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
17aa0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
17ab0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17ac0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17ad0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17ae0 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43  .case CKA_EXTRAC
17af0 54 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  TABLE:.....CACKE
17b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17b10 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
17b20 62 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54  bute CKA_EXTRACT
17b30 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
17b40 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17b50 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17b60 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
17b70 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
17b80 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
17b90 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
17ba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17bb0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17bc0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
17bd0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
17be0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
17bf0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17c00 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
17c10 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
17c20 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
17c30 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
17c40 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
17c50 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
17c60 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
17c70 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
17c80 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
17c90 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17ca0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
17cb0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
17cc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17cd0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
17ce0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
17cf0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17d00 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
17d10 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
17d20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17d30 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
17d40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
17d50 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
17d60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17d70 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
17d80 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
17d90 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c  _MODULUS (0x%08l
17da0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
17db0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
17dc0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
17dd0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
17de0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
17df0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
17e00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17e10 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
17e20 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
17e30 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
17e40 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
17e50 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
17e60 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
17e70 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
17e80 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
17e90 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
17ea0 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72  9_to_modulus(cer
17eb0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
17ec0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
17ed0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
17ee0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
17ef0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
17f00 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
17f10 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
17f20 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
17f30 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
17f40 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
17f50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17f60 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
17f70 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
17f80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17f90 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
17fa0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
17fb0 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  e CKA_PUBLIC_EXP
17fc0 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45  ONENT:.....CACKE
17fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17fe0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
17ff0 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  bute CKA_PUBLIC_
18000 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c  EXPONENT (0x%08l
18010 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
18020 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18030 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
18040 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
18050 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
18060 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
18070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18080 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18090 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
180a0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
180b0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
180c0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
180d0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
180e0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
180f0 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
18100 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
18110 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65  9_to_exponent(ce
18120 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
18130 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
18140 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
18150 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
18160 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
18170 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
18180 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
18190 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
181a0 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
181b0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
181c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
181d0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
181e0 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
181f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18200 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18210 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
18220 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47  se CKA_TRUST_DIG
18230 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a  ITAL_SIGNATURE:.
18240 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
18250 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f  T_NON_REPUDIATIO
18260 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
18270 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45  RUST_KEY_ENCIPHE
18280 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43  RMENT:....case C
18290 4b 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e  KA_TRUST_DATA_EN
182a0 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63  CIPHERMENT:....c
182b0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
182c0 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09  Y_AGREEMENT:....
182d0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b  case CKA_TRUST_K
182e0 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09  EY_CERT_SIGN:...
182f0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
18300 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73  CRL_SIGN:....cas
18310 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56  e CKA_TRUST_SERV
18320 45 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65  ER_AUTH:....case
18330 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e   CKA_TRUST_CLIEN
18340 54 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20  T_AUTH:....case 
18350 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53  CKA_TRUST_CODE_S
18360 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20  IGNING:....case 
18370 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
18380 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09  PROTECTION:.....
18390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
183a0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
183b0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
183c0 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78  UST_... (0x%08lx
183d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
183e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
183f0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
18400 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74  alue = &ck_trust
18410 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ed;.....ulValueL
18420 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
18430 72 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41  rusted);......CA
18440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18450 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18460 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18470 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18480 20 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20   *((CK_TRUST *) 
18490 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
184a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
184b0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
184c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
184d0 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f  e CKA_CERT_SHA1_
184e0 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59  HASH:.....CACKEY
184f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18500 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18510 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41  ute CKA_CERT_SHA
18520 31 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29  1_HASH (0x%08lx)
18530 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18540 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18550 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
18560 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
18570 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
18580 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
18590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
185a0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
185b0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
185c0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74  we are not a Net
185d0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
185e0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
185f0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48  k;.....}......SH
18600 41 31 52 65 73 65 74 28 26 73 68 61 31 5f 63 74  A1Reset(&sha1_ct
18610 78 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75  x);.....SHA1Inpu
18620 74 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72  t(&sha1_ctx, cer
18630 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
18640 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
18650 53 48 41 31 52 65 73 75 6c 74 28 26 73 68 61 31  SHA1Result(&sha1
18660 5f 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29  _ctx, sha1_hash)
18670 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
18680 73 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75  sha1_hash;.....u
18690 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
186a0 6f 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a  of(sha1_hash);..
186b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
186c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
186d0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
186e0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
186f0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18700 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18710 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
18720 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09  RT_MD5_HASH:....
18730 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18740 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18750 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
18760 45 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78  ERT_MD5_HASH (0x
18770 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18780 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18790 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
187a0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
187b0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
187c0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
187d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
187e0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
187f0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
18800 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
18810 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
18820 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
18830 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18840 09 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35  ....MD5Init(&md5
18850 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70  _ctx);.....MD5Up
18860 64 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63  date(&md5_ctx, c
18870 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
18880 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
18890 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68  ..MD5Final(md5_h
188a0 61 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a  ash, &md5_ctx);.
188b0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64  .....pValue = md
188c0 35 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61  5_hash;.....ulVa
188d0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
188e0 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09  md5_hash);......
188f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18900 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18910 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
18920 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
18930 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
18940 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18950 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56  .default:.....pV
18960 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
18970 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
18980 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09  K_LONG) -1;.....
18990 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
189a0 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56   (((CK_LONG) ulV
189b0 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b  alueLen) != ((CK
189c0 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09  _LONG) -1)) {...
189d0 09 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74  ./* Push curr_at
189e0 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  tr onto the stac
189f0 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74  k */....curr_att
18a00 72 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74  r.type = curr_at
18a10 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72  tr_type;....curr
18a20 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
18a30 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a   = ulValueLen;..
18a40 09 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61  ...curr_attr.pVa
18a50 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72  lue = malloc(cur
18a60 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
18a70 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
18a80 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20  rr_attr.pValue, 
18a90 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74  pValue, curr_att
18aa0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  r.ulValueLen);..
18ab0 09 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72  ...if (pValue_fr
18ac0 65 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ee && pValue) {.
18ad0 09 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29  ....free(pValue)
18ae0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e  ;....}.....if (n
18af0 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61  umattrs >= retva
18b00 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72  l_count) {.....r
18b10 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
18b20 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63  retval, retval_c
18b30 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
18b40 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09  etval));....}...
18b50 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c  ..memcpy(&retval
18b60 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72  [numattrs], &cur
18b70 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63  r_attr, sizeof(c
18b80 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e  urr_attr));....n
18b90 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09  umattrs++;...}..
18ba0 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73  }...if (numattrs
18bb0 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61   != 0) {...retva
18bc0 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  l_count = numatt
18bd0 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72  rs;...retval = r
18be0 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72  ealloc(retval, r
18bf0 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
18c00 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
18c10 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65  .} else {...free
18c20 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74  (retval);....ret
18c30 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  val = NULL;..}..
18c40 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d  .*pulCount = num
18c50 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  attrs;...CACKEY_
18c60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18c70 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65  turning %lu obje
18c80 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61  cts (%p).", numa
18c90 74 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72  ttrs, (void *) r
18ca0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
18cb0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
18cc0 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
18cd0 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
18ce0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
18cf0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69  entity *identiti
18d00 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  es, unsigned lon
18d10 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  g identities_cou
18d20 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
18d30 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
18d40 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
18d50 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b  d_idx, attr_idx;
18d60 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
18d70 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65  s == NULL || ide
18d80 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d  ntities_count ==
18d90 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a   0) {...return;.
18da0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78  .}...for (id_idx
18db0 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69   = 0; id_idx < i
18dc0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
18dd0 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69   id_idx++) {...i
18de0 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f (identities[id
18df0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
18e00 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72  ) {....for (attr
18e10 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69  _idx = 0; attr_i
18e20 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b  dx < identities[
18e30 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
18e40 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69  es_count; attr_i
18e50 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72  dx++) {.....curr
18e60 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74  _attr = &identit
18e70 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
18e80 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d  ibutes[attr_idx]
18e90 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f  ;......if (curr_
18ea0 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a  attr->pValue) {.
18eb0 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61  .....free(curr_a
18ec0 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09  ttr->pValue);...
18ed0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ..}....}.....if 
18ee0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
18ef0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20  dx].attributes) 
18f00 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e 74  {.....free(ident
18f10 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
18f20 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a  tributes);....}.
18f30 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
18f40 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 73  certs(identities
18f50 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
18f60 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09  entity, 1, 1);..
18f70 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65  .}..}...free(ide
18f80 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61  ntities);.}..sta
18f90 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
18fa0 67 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  g cackey_read_do
18fb0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  d_identities(str
18fc0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
18fd0 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c  ity *identities,
18fe0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e   unsigned long n
18ff0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a  um_dod_certs) {.
19000 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63  .unsigned long c
19010 65 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20  ert_idx, id_idx 
19020 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  = 0;...if (ident
19030 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ities == NULL) {
19040 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f  ...return(num_do
19050 64 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d  d_certs * 3);..}
19060 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
19070 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
19080 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20   num_dod_certs; 
19090 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  cert_idx++) {...
190a0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
190b0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
190c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74   = NULL;...ident
190d0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
190e0 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
190f0 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
19100 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45  (CKO_CERTIFICATE
19110 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63  , &extra_certs[c
19120 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30  ert_idx], 0xf000
19130 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64   | cert_idx, &id
19140 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19150 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
19160 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  t);...id_idx++;.
19170 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
19180 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
19190 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64  ity = NULL;...id
191a0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
191b0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
191c0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
191d0 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  tes(CKO_PUBLIC_K
191e0 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  EY, &extra_certs
191f0 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
19200 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
19210 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19220 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
19230 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b  unt);...id_idx++
19240 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  ;....identities[
19250 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
19260 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
19270 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19280 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
19290 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
192a0 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41  butes(CKO_NETSCA
192b0 50 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61  PE_TRUST, &extra
192c0 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d  _certs[cert_idx]
192d0 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f  , 0xf000 | cert_
192e0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
192f0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
19300 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64  tes_count);...id
19310 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74  _idx++;..}...ret
19320 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a  urn(id_idx);.}..
19330 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
19340 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
19350 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
19360 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63  ities(struct cac
19370 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
19380 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69  unsigned long *i
19390 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72  ds_found) {..str
193a0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
193b0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
193c0 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75  dentities;..stru
193d0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
193e0 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a  ty *identities;.
193f0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
19400 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20  um_ids, id_idx, 
19410 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75  curr_id_type;..u
19420 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
19430 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f  _certs, num_dod_
19440 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b  certs, cert_idx;
19450 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78  ..int include_ex
19460 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 0a  tra_certs = 0;..
19470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19480 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
19490 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64  ...if (ids_found
194a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
194b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
194c0 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66  F("Error.  ids_f
194d0 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  ound is NULL");.
194e0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
194f0 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
19500 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43  EY_CARD_SLOT_INC
19510 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53  LUDE_EXTRA_CERTS
19520 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
19530 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69  certs = 1;.#endi
19540 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  f...if (getenv("
19550 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53  CACKEY_DOD_CERTS
19560 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21  _ON_HW_SLOTS") !
19570 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
19580 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
19590 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  = 1;..}...if (ge
195a0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
195b0 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f  DOD_CERTS_ON_HW_
195c0 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  SLOTS") != NULL)
195d0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74   {...include_ext
195e0 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  ra_certs = 0;..}
195f0 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
19600 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
19610 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
19620 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  {...num_dod_cert
19630 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 0;..} else {
19640 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ...num_dod_certs
19650 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f   = sizeof(extra_
19660 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  certs) / sizeof(
19670 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b  extra_certs[0]);
19680 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
19690 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75  internal) {...nu
196a0 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72  m_ids = cackey_r
196b0 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
196c0 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64  es(NULL, num_dod
196d0 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28  _certs);....if (
196e0 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a  num_ids != 0) {.
196f0 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
19700 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
19710 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
19720 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ies));.....cacke
19730 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
19740 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73  ities(identities
19750 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
19760 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
19770 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
19780 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66  L;...}....*ids_f
19790 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ound = num_ids;.
197a0 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69  ...return(identi
197b0 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ties);..}...pcsc
197c0 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
197d0 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
197e0 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
197f0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63  _certs);..if (pc
19800 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
19810 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f   NULL) {.../* Co
19820 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20  nvert number of 
19830 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20  Certs to number 
19840 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09  of objects */...
19850 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50  num_ids = (CKO_P
19860 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f  RIVATE_KEY - CKO
19870 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31  _CERTIFICATE + 1
19880 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a  ) * num_certs;..
19890 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
198a0 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
198b0 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65  num_ids += cacke
198c0 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
198d0 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f  ities(NULL, num_
198e0 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
198f0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
19900 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
19910 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
19920 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64  ies));..../* Add
19930 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20 70   certificates, p
19940 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20  ublic keys, and 
19950 70 72 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f  private keys fro
19960 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72 64 20  m the smartcard 
19970 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b  */...id_idx = 0;
19980 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
19990 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
199a0 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74   num_certs; cert
199b0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72  _idx++) {....for
199c0 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d   (curr_id_type =
199d0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
199e0 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c  ; curr_id_type <
199f0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
19a00 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b  Y; curr_id_type+
19a10 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74  +) {.....identit
19a20 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
19a30 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
19a40 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63  get_attributes(c
19a50 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63  urr_id_type, &pc
19a60 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
19a70 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64  rt_idx], cert_id
19a80 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
19a90 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
19aa0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69  s_count);......i
19ab0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
19ac0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
19ad0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
19ae0 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  *identities[id_i
19af0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
19b00 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  y));.....memcpy(
19b10 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19b20 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
19b30 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69  , &pcsc_identiti
19b40 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69  es[cert_idx], si
19b50 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
19b60 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
19b70 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69  entity));......i
19b80 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
19b90 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
19ba0 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
19bb0 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74  alloc(pcsc_ident
19bc0 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e  ities[cert_idx].
19bd0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
19be0 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
19bf0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19c00 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
19c10 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
19c20 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
19c30 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
19c40 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
19c50 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
19c60 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a  tificate_len);..
19c70 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  ....id_idx++;...
19c80 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e  .}...}....if (in
19c90 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
19ca0 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  s) {....CACKEY_D
19cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
19cc0 6c 75 64 69 6e 67 20 44 6f 44 20 43 65 72 74 69  luding DoD Certi
19cd0 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64 77  ficates on hardw
19ce0 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09  are slot");.....
19cf0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
19d00 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74  identities(ident
19d10 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c 20  ities + id_idx, 
19d20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
19d30 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
19d40 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
19d50 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
19d60 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73  rts, 1);....*ids
19d70 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
19d80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
19d90 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a  tities);..}....*
19da0 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09  ids_found = 0;..
19db0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a  return(NULL);.}.
19dc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
19dd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
19de0 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  tialize)(CK_VOID
19df0 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20  _PTR pInitArgs) 
19e00 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  {..CK_C_INITIALI
19e10 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61  ZE_ARGS CK_PTR a
19e20 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69  rgs;..uint32_t i
19e30 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  dx, highest_slot
19e40 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
19e50 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
19e60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19e70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
19e80 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
19e90 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
19ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19eb0 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74  r.  Already init
19ec0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
19ed0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
19ee0 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49  KI_ALREADY_INITI
19ef0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
19f00 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e   (pInitArgs != N
19f10 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20  ULL) {...args = 
19f20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d  pInitArgs;...mem
19f30 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73  cpy(&cackey_args
19f40 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63  , args, sizeof(c
19f50 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09  ackey_args));...
19f60 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
19f70 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  eMutex == NULL |
19f80 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
19f90 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
19fa0 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
19fb0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
19fc0 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  >UnlockMutex == 
19fd0 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61  NULL) {....if (a
19fe0 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
19ff0 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
1a000 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21  ->DestroyMutex !
1a010 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1a020 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  LockMutex != NUL
1a030 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
1a040 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20  kMutex != NULL) 
1a050 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
1a060 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a070 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20  . Some, but not 
1a080 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72  All threading pr
1a090 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 65  imitives provide
1a0a0 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
1a0b0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1a0c0 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  BAD);....}...}..
1a0d0 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
1a0e0 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
1a0f0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1a100 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79  key_args.Destroy
1a110 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1a120 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
1a130 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1a140 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
1a150 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
1a160 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ..cackey_args.fl
1a170 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ags = 0;..}...fo
1a180 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1a190 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1a1a0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1a1b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1a1c0 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1a1d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
1a1e0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
1a1f0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
1a200 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1a210 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1a220 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1a230 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1a240 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b   idx++) {...cack
1a250 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
1a260 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b  tive = 0;...cack
1a270 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1a280 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
1a290 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1a2a0 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
1a2b0 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63  n_depth = 0;...c
1a2c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1a2d0 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
1a2e0 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
1a2f0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1a300 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  x].slot_reset = 
1a310 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1a320 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  s[idx].token_fla
1a330 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  gs = 0;...cackey
1a340 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
1a350 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  l = NULL;...cack
1a360 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e  ey_slots[idx].in
1a370 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a  ternal = 0;..}..
1a380 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1a390 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1a3a0 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1a3b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a3c0 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f 74  RINTF("Asked not
1a3d0 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44 20   to include DoD 
1a3e0 63 65 72 74 69 66 69 63 61 74 65 73 22 29 3b 0a  certificates");.
1a3f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69 67 68  .} else {...high
1a400 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65  est_slot = (size
1a410 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1a420 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1a430 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b  _slots[0])) - 1;
1a440 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a450 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69  _PRINTF("Includi
1a460 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69 6e 20  ng DoD certs in 
1a470 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69  slot %lu", (unsi
1a480 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67 68 65  gned long) highe
1a490 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63  st_slot);....cac
1a4a0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1a4b0 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d  t_slot].active =
1a4c0 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   1;...cackey_slo
1a4d0 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1a4e0 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09  .internal = 1;..
1a4f0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1a500 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65  ghest_slot].labe
1a510 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  l = (unsigned ch
1a520 61 72 20 2a 29 20 22 44 6f 44 20 43 65 72 74 69  ar *) "DoD Certi
1a530 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b  ficates";...cack
1a540 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1a550 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  _slot].pcsc_read
1a560 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09  er = "CACKey";..
1a570 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1a580 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65  ghest_slot].toke
1a590 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  n_flags = 0;..}.
1a5a0 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
1a5b0 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28  ized = 1;...if (
1a5c0 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  !cackey_biglock_
1a5d0 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f  init) {...mutex_
1a5e0 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  init_ret = cacke
1a5f0 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26  y_mutex_create(&
1a600 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a610 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e  ....if (mutex_in
1a620 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
1a630 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a640 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
1a650 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  utex initializat
1a660 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ion failed.");..
1a670 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41  ...return(CKR_CA
1a680 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09  NT_LOCK);...}...
1a690 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  .cackey_biglock_
1a6a0 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43  init = 1;..}...C
1a6b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a6c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1a6d0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1a6e0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1a6f0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1a700 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1a710 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28  RV, C_Finalize)(
1a720 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
1a730 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33 32  erved) {..uint32
1a740 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  _t idx;...CACKEY
1a750 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1a760 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1a770 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
1a780 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1a790 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a7a0 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
1a7b0 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
1a7c0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1a7d0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1a7e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1a7f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1a800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a810 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1a820 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1a830 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1a840 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1a850 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  IZED);..}...for 
1a860 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1a870 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1a880 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1a890 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1a8a0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1a8b0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1a8c0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1a8d0 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65  ve) {....C_Close
1a8e0 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09  Session(idx);...
1a8f0 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c  }..}...cackey_sl
1a900 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
1a910 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  ll();...for (idx
1a920 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1a930 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1a940 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1a950 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
1a960 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
1a970 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
1a980 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f  nternal) {....co
1a990 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
1a9a0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1a9b0 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
1a9c0 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
1a9d0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1a9e0 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a  sc_reader);...}.
1a9f0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1aa00 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1aa10 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b  certs) {....cack
1aa20 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61  ey_free_certs(ca
1aa30 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1aa40 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61  cached_certs, ca
1aa50 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1aa60 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
1aa70 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b  nt, 1);.....cack
1aa80 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
1aa90 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c  ched_certs = NUL
1aaa0 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  L;...}..}...cack
1aab0 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
1aac0 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69  ct();...cackey_i
1aad0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
1aae0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1aaf0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ab00 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1ab10 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1ab20 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1ab30 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1ab40 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f  CK_RV, C_GetInfo
1ab50 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49  )(CK_INFO_PTR pI
1ab60 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43  nfo) {..static C
1ab70 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66  K_UTF8CHAR manuf
1ab80 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55  acturerID[] = "U
1ab90 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b  .S. Government";
1aba0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1abb0 43 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63  CHAR libraryDesc
1abc0 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43  ription[] = "CAC
1abd0 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  Key";...CACKEY_D
1abe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1abf0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1ac00 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1ac10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ac20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1ac30 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1ac40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1ac50 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1ac60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1ac70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1ac80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ac90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1aca0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1acb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1acc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1acd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49  ALIZED);..}...pI
1ace0 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72  nfo->cryptokiVer
1acf0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
1ad00 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
1ad10 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
1ad20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1ad30 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73  fo->cryptokiVers
1ad40 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
1ad50 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
1ad60 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
1ad70 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73  ) & 0xff;...mems
1ad80 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
1ad90 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
1ada0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
1adb0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
1adc0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1add0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
1ade0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
1adf0 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
1ae00 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  rID) - 1);...pIn
1ae10 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30  fo->flags = 0x00
1ae20 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1ae30 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1ae40 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
1ae50 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  f(pInfo->library
1ae60 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09  Description));..
1ae70 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69  memcpy(pInfo->li
1ae80 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1ae90 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  , libraryDescrip
1aea0 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62  tion, sizeof(lib
1aeb0 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
1aec0 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   - 1);...pInfo->
1aed0 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
1aee0 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  ajor = (cackey_g
1aef0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31  etversion() >> 1
1af00 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1af10 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f  o->libraryVersio
1af20 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65  n.minor = (cacke
1af30 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1af40 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43  > 8) & 0xff;...C
1af50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1af60 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1af70 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1af80 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1af90 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  R_OK);.}../*. * 
1afa0 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20  Process list of 
1afb0 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65  readers, and cre
1afc0 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77  ate mapping betw
1afd0 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20  een reader name 
1afe0 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a  and slot ID. */.
1aff0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b000 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
1b010 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f  lotList)(CK_BBOO
1b020 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20  L tokenPresent, 
1b030 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70  CK_SLOT_ID_PTR p
1b040 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f  SlotList, CK_ULO
1b050 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
1b060 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66   {..static int f
1b070 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09  irst_call = 1;..
1b080 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1b090 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
1b0a0 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f  ect_ret;..CK_ULO
1b0b0 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  NG count, slot_c
1b0c0 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c  ount = 0, currsl
1b0d0 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63  ot, slot_idx;..c
1b0e0 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72  har *pcsc_reader
1b0f0 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73  s, *pcsc_readers
1b100 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72  _s, *pcsc_reader
1b110 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 73 63  s_e;..DWORD pcsc
1b120 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c  _readers_len;..L
1b130 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72 65  ONG scard_listre
1b140 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a 65  aders_ret;..size
1b150 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  _t curr_reader_l
1b160 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  en;..int slot_re
1b170 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  set;...CACKEY_DE
1b180 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b190 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c  ed.");...if (pul
1b1a0 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
1b1b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b1c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1b1d0 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
1b1e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b1f0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1b200 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1b210 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b220 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b230 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b240 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b250 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b260 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b270 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b280 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1b290 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1b2a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1b2b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1b2c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1b2d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b2e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1b2f0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1b300 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1b310 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1b320 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73  }.../* Clear lis
1b330 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73  t of slots */..s
1b340 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
1b350 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b  if (pSlotList) {
1b360 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61 6c  ...if (first_cal
1b370 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 61  l) {....first_ca
1b380 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74  ll = 0;.....slot
1b390 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a  _reset = 1;...}.
1b3a0 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .../* If any of 
1b3b0 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20 62  the slots have b
1b3c0 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20 70  een reset then p
1b3d0 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  urge all informa
1b3e0 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 61  tion and check a
1b3f0 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63  gain */...for (c
1b400 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
1b410 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1b420 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1b430 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b440 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
1b450 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63  ot++) {....if (c
1b460 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1b470 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  slot].internal) 
1b480 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
1b490 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
1b4a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1b4b0 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
1b4c0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
1b4d0 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79  }.....if (cackey
1b4e0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1b4f0 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  .slot_reset) {..
1b500 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  ...slot_reset = 
1b510 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  1;......break;..
1b520 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ..}...}....if (s
1b530 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09  lot_reset) {....
1b540 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b550 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c 6c  NTF("Purging all
1b560 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
1b570 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c  n.");...../* Onl
1b580 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
1b590 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
1b5a0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
1b5b0 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73  ing supply the s
1b5c0 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
1b5d0 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  */....cackey_slo
1b5e0 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
1b5f0 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75  l();.....for (cu
1b600 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
1b610 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1b620 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1b630 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1b640 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1b650 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63  t++) {.....if (c
1b660 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1b670 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  slot].internal) 
1b680 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  {......continue;
1b690 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
1b6a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1b6b0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
1b6c0 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  er) {......free(
1b6d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1b6e0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
1b6f0 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65  er);.......cacke
1b700 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1b710 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1b720 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  NULL;.....}.....
1b730 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1b740 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1b750 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  l) {......free(c
1b760 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1b770 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09  slot].label);...
1b780 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1b790 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
1b7a0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a   = NULL;.....}..
1b7b0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1b7c0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
1b7d0 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20  e = 0;....}...} 
1b7e0 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a 09  else {.......}..
1b7f0 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
1b800 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
1b810 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63   */..pcsc_connec
1b820 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
1b830 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
1b840 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
1b850 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
1b860 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
1b870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b880 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
1b890 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61   PC/SC failed, a
1b8a0 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73  ssuming no slots
1b8b0 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e  ");....slot_coun
1b8c0 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  t = 0;..} else {
1b8d0 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
1b8e0 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72  len = 0;....scar
1b8f0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1b900 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
1b910 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
1b920 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
1b930 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
1b940 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20  ers_len);....if 
1b950 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
1b960 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
1b970 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a  F_COMM_ERROR) {.
1b980 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b990 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
1b9a0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
1b9b0 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
1b9c0 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61  _F_COMM_ERROR, a
1b9d0 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69  ssuming Connecti
1b9e0 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e 74  on to PC/SC went
1b9f0 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74   away. Reconnect
1ba00 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ing.");.....cack
1ba10 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
1ba20 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  ct();....cackey_
1ba30 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
1ba40 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ba50 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20  _PRINTF("Trying 
1ba60 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1ba70 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 73  () again");....s
1ba80 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1ba90 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1baa0 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1bab0 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1bac0 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
1bad0 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d  eaders_len);...}
1bae0 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1baf0 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1bb00 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
1bb10 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72 73   && pcsc_readers
1bb20 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
1bb30 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20 6d  pcsc_readers = m
1bb40 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64 65  alloc(pcsc_reade
1bb50 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63  rs_len);....pcsc
1bb60 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63 73  _readers_s = pcs
1bb70 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09 73  c_readers;.....s
1bb80 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1bb90 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1bba0 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1bbb0 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1bbc0 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c  L, pcsc_readers,
1bbd0 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
1bbe0 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72  en);....if (scar
1bbf0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1bc00 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1bc10 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73 63  CESS) {.....pcsc
1bc20 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63 73  _readers_e = pcs
1bc30 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73 63  c_readers + pcsc
1bc40 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09  _readers_len;...
1bc50 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
1bc60 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
1bc70 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
1bc80 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
1bc90 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
1bca0 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
1bcb0 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
1bcc0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
1bcd0 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c  11 */.....currsl
1bce0 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f 74  ot = 1;.....slot
1bcf0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09  _count = 0;.....
1bd00 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64  while (pcsc_read
1bd10 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65  ers < pcsc_reade
1bd20 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a 20  rs_e) {....../* 
1bd30 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 6c 61  Find next availa
1bd40 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09 09  ble slot */.....
1bd50 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f 74  .for (; currslot
1bd60 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1bd70 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1bd80 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1bd90 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1bda0 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63 61   {.......if (!ca
1bdb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1bdc0 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
1bdd0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bde0 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09  ...}......}.....
1bdf0 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  ..curr_reader_le
1be00 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63 5f  n = strlen(pcsc_
1be10 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09  readers);.......
1be20 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 65 72  if ((pcsc_reader
1be30 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72 5f  s + curr_reader_
1be40 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61 64  len) > pcsc_read
1be50 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09 62  ers_e) {.......b
1be60 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1be70 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 61 64  ...if (curr_read
1be80 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  er_len == 0) {..
1be90 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1bea0 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72  .}.......if (cur
1beb0 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66  rslot >= (sizeof
1bec0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1bed0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1bee0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09  lots[0]))) {....
1bef0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bf00 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f  PRINTF("Found mo
1bf10 72 65 20 72 65 61 64 65 72 73 20 74 68 61 6e 20  re readers than 
1bf20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61  slots are availa
1bf30 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09 62  ble!");........b
1bf40 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1bf50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bf60 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72 65  PRINTF("Found re
1bf70 61 64 65 72 3a 20 25 73 22 2c 20 70 63 73 63 5f  ader: %s", pcsc_
1bf80 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09  readers);.......
1bf90 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
1bfa0 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
1bfb0 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
1bfc0 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20  lly being asked 
1bfd0 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20  supply the slot 
1bfe0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09  information */..
1bff0 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  ....if (pSlotLis
1c000 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73  t) {.......if (s
1c010 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09  lot_reset) {....
1c020 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1c030 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
1c040 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61  e = 1;........ca
1c050 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1c060 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  lot].internal = 
1c070 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
1c080 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c090 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73  .pcsc_reader = s
1c0a0 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65  trdup(pcsc_reade
1c0b0 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  rs);........cack
1c0c0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1c0d0 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t].pcsc_card_con
1c0e0 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09  nected = 0;.....
1c0f0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c100 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61  currslot].transa
1c110 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
1c120 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1c130 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
1c140 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
1c150 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09  hw_lock = 0;....
1c160 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1c170 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
1c180 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
1c190 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09  IN_REQUIRED;....
1c1a0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1c1b0 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
1c1c0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09   = NULL;........
1c1d0 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
1c1e0 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
1c1f0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29  slots[currslot])
1c200 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
1c210 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 2f 2a   else {......./*
1c220 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e   Artificially in
1c230 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65  crease the numbe
1c240 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74  r of active slot
1c250 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62  s by what will b
1c260 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a  ecome active */.
1c270 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ......slot_count
1c280 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09  ++;......}......
1c290 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09  currslot++;.....
1c2a0 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
1c2b0 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
1c2c0 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09  n + 1;.....}....
1c2d0 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
1c2e0 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
1c2f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1c300 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1c310 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1c320 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
1c330 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1c340 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1c350 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09  active) {.......
1c360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c370 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69 76  NTF("Found activ
1c380 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e  e slot %lu", (un
1c390 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1c3a0 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 73  rslot);........s
1c3b0 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
1c3c0 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  ..}.....}....} e
1c3d0 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
1c3e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
1c3f0 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43  econd call to SC
1c400 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
1c410 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
1c420 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
1c430 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
1c440 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
1c450 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
1c460 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
1c470 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
1c480 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63  ...}.....free(pc
1c490 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09  sc_readers_s);..
1c4a0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
1c4b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c4c0 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  ("First call to 
1c4d0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1c4e0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
1c4f0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
1c500 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
1c510 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
1c520 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1c530 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
1c540 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
1c550 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
1c560 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1c570 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1c580 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1c590 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1c5a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1c5b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c5c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1c5d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1c5e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1c5f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1c600 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  if (pSlotList ==
1c610 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
1c620 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e  ount = slot_coun
1c630 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  t;....CACKEY_DEB
1c640 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c650 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1c660 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
1c670 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74  ders, but not st
1c680 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74  oring IDs (pSlot
1c690 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20  List == NULL)", 
1c6a0 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
1c6b0 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
1c6c0 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
1c6d0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75  KR_OK);..}...cou
1c6e0 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a  nt = *pulCount;.
1c6f0 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f  .if (count < slo
1c700 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43  t_count) {...CAC
1c710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c720 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
1c730 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
1c740 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65  ies, but we have
1c750 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20   %lu entries.", 
1c760 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
1c770 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
1c780 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1c790 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
1c7a0 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09  _TOO_SMALL");...
1c7b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
1c7c0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a  ER_TOO_SMALL);..
1c7d0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1c7e0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1c7f0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1c800 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1c810 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1c820 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c830 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c840 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1c850 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c860 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1c870 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d  ..}...slot_idx =
1c880 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c   0;..for (currsl
1c890 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f  ot = 0; (currslo
1c8a0 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1c8b0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1c8c0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1c8d0 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  0]))); currslot+
1c8e0 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
1c8f0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1c900 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
1c910 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
1c920 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d  .if (slot_idx >=
1c930 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43   count) {....CAC
1c940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c950 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
1c960 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
1c970 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74  ies, but we just
1c980 20 74 72 69 65 64 20 74 6f 20 77 72 69 74 65 20   tried to write 
1c990 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78  to the %lu index
1c9a0 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63   -- ignoring", c
1c9b0 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b  ount, slot_idx);
1c9c0 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
1c9d0 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b  .}....pSlotList[
1c9e0 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72  slot_idx] = curr
1c9f0 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78  slot;...slot_idx
1ca00 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ++;..}...mutex_r
1ca10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1ca20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ca30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1ca40 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1ca50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1ca60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ca70 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1ca80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ca90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1caa0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70  _ERROR);..}...*p
1cab0 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
1cac0 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ount;...CACKEY_D
1cad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1cae0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1caf0 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
1cb00 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b  eaders.", CKR_OK
1cb10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1cb20 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a  ) slot_count);..
1cb30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1cb40 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20  ...tokenPresent 
1cb50 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20  = tokenPresent; 
1cb60 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
1cb70 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
1cb80 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
1cb90 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1cba0 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f  V, C_GetSlotInfo
1cbb0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1cbc0 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46  tID, CK_SLOT_INF
1cbd0 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
1cbe0 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
1cbf0 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  AR slotDescripti
1cc00 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53  on[] = "CACKey S
1cc10 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78  lot";..int mutex
1cc20 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79  _retval;..int by
1cc30 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43  tes_to_copy;...C
1cc40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cc50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1cc60 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1cc70 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1cc80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cc90 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1cca0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1ccb0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1ccc0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1ccd0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1cce0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ccf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cd00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1cd10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1cd20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1cd30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1cd40 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1cd50 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1cd60 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1cd70 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1cd80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1cd90 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1cda0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cdb0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1cdc0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1cdd0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1cde0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1cdf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ce00 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1ce10 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1ce20 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1ce30 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1ce40 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1ce50 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1ce60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ce70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ce80 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1ce90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1cea0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1ceb0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1cec0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1ced0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1cee0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cef0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1cf00 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1cf10 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1cf20 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1cf30 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1cf40 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1cf50 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1cf60 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1cf70 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1cf80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
1cf90 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
1cfa0 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20  F_HW_SLOT;...if 
1cfb0 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (!cackey_slots[s
1cfc0 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29  lotID].internal)
1cfd0 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
1cfe0 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42  s |= CKF_REMOVAB
1cff0 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09  LE_DEVICE;..}...
1d000 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
1d010 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
1d020 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
1d030 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  == CACKEY_PCSC_S
1d040 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
1d050 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1d060 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45  |= CKF_TOKEN_PRE
1d070 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73  SENT;..}...bytes
1d080 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65  _to_copy = strle
1d090 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  n(cackey_slots[s
1d0a0 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
1d0b0 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66  er);..if (sizeof
1d0c0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1d0d0 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f  urerID) < bytes_
1d0e0 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74  to_copy) {...byt
1d0f0 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a  es_to_copy = siz
1d100 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
1d110 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09  acturerID);..}..
1d120 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1d130 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61  nufacturerID, ca
1d140 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1d150 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  D].pcsc_reader, 
1d160 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
1d170 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1d180 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1d190 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1d1a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1d1b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1d1c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d1d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1d1e0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1d1f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d200 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1d210 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
1d220 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
1d230 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
1d240 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  f(pInfo->slotDes
1d250 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
1d260 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  cpy(pInfo->slotD
1d270 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74  escription, slot
1d280 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
1d290 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74  eof(slotDescript
1d2a0 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  ion) - 1);...mem
1d2b0 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
1d2c0 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
1d2d0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1d2e0 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
1d2f0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1d300 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
1d310 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1d320 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1d330 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
1d340 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
1d350 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1d360 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
1d370 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
1d380 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
1d390 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
1d3a0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1d3b0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
1d3c0 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  x00;...CACKEY_DE
1d3d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1d3e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1d3f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1d400 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1d410 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1d420 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1d430 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53  tTokenInfo)(CK_S
1d440 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1d450 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52  K_TOKEN_INFO_PTR
1d460 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
1d470 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
1d480 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
1d490 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
1d4a0 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
1d4b0 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c  TF8CHAR defaultL
1d4c0 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77  abel[] = "Unknow
1d4d0 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69  n Token";..stati
1d4e0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f  c CK_UTF8CHAR mo
1d4f0 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b  del[] = "CAC Tok
1d500 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63  en";..struct cac
1d510 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
1d520 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
1d530 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  es;..unsigned lo
1d540 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73  ng num_certs;..s
1d550 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74  size_t label_ret
1d560 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1d570 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65  val;..int use_de
1d580 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43  fault_label;...C
1d590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d5a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1d5b0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1d5c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1d5d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d5e0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1d5f0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1d600 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1d610 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1d620 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d630 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d640 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d650 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1d660 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d670 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1d680 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1d690 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1d6a0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1d6b0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d6c0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1d6d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1d6e0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1d6f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d700 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1d710 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1d720 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1d730 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1d740 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d750 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1d760 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1d770 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1d780 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1d790 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1d7a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1d7b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d7c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d7d0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1d7e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1d7f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1d800 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1d810 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1d820 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1d830 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d840 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1d850 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1d860 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1d870 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1d880 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1d890 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1d8a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d8b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1d8c0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1d8d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1d8e0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
1d8f0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
1d900 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
1d910 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
1d920 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
1d930 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d940 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20  RINTF("No token 
1d950 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c  is present in sl
1d960 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f  otID = %lu", slo
1d970 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1d980 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1d990 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1d9a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
1d9b0 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a  N_NOT_PRESENT);.
1d9c0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1d9d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1d9e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1d9f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1da00 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1da10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1da20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1da30 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1da40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1da50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1da60 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  OR);..}.../* Det
1da70 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62  ermine token lab
1da80 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63  el from certific
1da90 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28  ates */..memset(
1daa0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20  pInfo->label, ' 
1dab0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1dac0 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64  >label));..use_d
1dad0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31  efault_label = 1
1dae0 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ;...if (cackey_s
1daf0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1db00 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el == NULL) {...
1db10 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1db20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
1db30 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
1db40 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c  s[slotID], NULL,
1db50 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09   &num_certs);...
1db60 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
1db70 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
1db80 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
1db90 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c  > 0) {.....label
1dba0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
1dbb0 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
1dbc0 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69  abel(pcsc_identi
1dbd0 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62  ties, pInfo->lab
1dbe0 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
1dbf0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69  ->label));.....i
1dc00 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30  f (label_ret > 0
1dc10 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66  ) {......use_def
1dc20 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
1dc30 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1dc40 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1dc50 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
1dc60 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1dc70 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  .......memcpy(ca
1dc80 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1dc90 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d  D].label, pInfo-
1dca0 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
1dcb0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
1dcc0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
1dcd0 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
1dce0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
1dcf0 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
1dd00 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
1dd10 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
1dd20 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  bel, cackey_slot
1dd30 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
1dd40 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1dd50 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64  abel));....use_d
1dd60 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
1dd70 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64  ;..}...if (use_d
1dd80 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a  efault_label) {.
1dd90 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1dda0 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61  label, defaultLa
1ddb0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61  bel, sizeof(defa
1ddc0 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a  ultLabel) - 1);.
1ddd0 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
1dde0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1ddf0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
1de00 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1de10 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
1de20 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1de30 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
1de40 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
1de50 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
1de60 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1de70 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20  fo->model, ' ', 
1de80 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f  sizeof(pInfo->mo
1de90 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  del));..memcpy(p
1dea0 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64  Info->model, mod
1deb0 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c  el, sizeof(model
1dec0 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
1ded0 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
1dee0 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f  mber, ' ', sizeo
1def0 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  f(pInfo->serialN
1df00 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65  umber));...memse
1df10 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  t(pInfo->utcTime
1df20 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1df30 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a  nfo->utcTime));.
1df40 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1df50 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
1df60 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1df70 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1df80 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
1df90 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
1dfa0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1dfb0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
1dfc0 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
1dfd0 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
1dfe0 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
1dff0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1e000 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
1e010 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c  x00;...pInfo->fl
1e020 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f  ags = CKF_WRITE_
1e030 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f  PROTECTED | CKF_
1e040 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c  USER_PIN_INITIAL
1e050 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e  IZED | CKF_TOKEN
1e060 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63  _INITIALIZED | c
1e070 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e080 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  ID].token_flags;
1e090 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53  ...pInfo->ulMaxS
1e0a0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73  essionCount = (s
1e0b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1e0c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1e0d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e0e0 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f  0])) - 1;..pInfo
1e0f0 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ->ulSessionCount
1e100 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1e110 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1e120 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65  pInfo->ulMaxRwSe
1e130 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a  ssionCount = 0;.
1e140 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73  .pInfo->ulRwSess
1e150 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
1e160 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1e170 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1e180 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38  lMaxPinLen = 128
1e190 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50  ;..pInfo->ulMinP
1e1a0 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66  inLen = 0;..pInf
1e1b0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63  o->ulTotalPublic
1e1c0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
1e1d0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1e1e0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
1e1f0 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  reePublicMemory 
1e200 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1e210 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1e220 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69  Info->ulTotalPri
1e230 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
1e240 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
1e250 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
1e260 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65  >ulFreePrivateMe
1e270 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1e280 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1e290 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  N;...CACKEY_DEBU
1e2a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e2b0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1e2c0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1e2d0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1e2e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1e2f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74  ON(CK_RV, C_Wait
1e300 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b  ForSlotEvent)(CK
1e310 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
1e320 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
1e330 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  otID, CK_VOID_PT
1e340 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
1e350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e360 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1e370 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
1e380 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
1e390 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e3a0 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
1e3b0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
1e3c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e3d0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1e3e0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1e3f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1e400 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e410 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e420 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1e430 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e440 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1e450 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1e460 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20  ../* XXX: TODO: 
1e470 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e  Implement this..
1e480 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  . */..CACKEY_DEB
1e490 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1e4a0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1e4b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1e4c0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1e4d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1e4e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1e4f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e500 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1e510 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1e520 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
1e530 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
1e540 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1e550 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
1e560 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
1e570 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
1e580 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
1e590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e5a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1e5b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e5c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e5d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e5e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e5f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e600 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e610 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e620 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1e630 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
1e640 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e650 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e660 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
1e670 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1e680 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1e690 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
1e6a0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
1e6b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
1e6c0 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43  ount = 1;....CAC
1e6d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e6e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1e6f0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1e700 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e710 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
1e720 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a  pulCount < 1) {.
1e730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
1e750 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
1e760 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e770 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
1e780 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
1e790 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
1e7a0 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75  M_RSA_PKCS;..*pu
1e7b0 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41  lCount = 1;...CA
1e7c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e7d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e7e0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1e7f0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1e800 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1e810 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1e820 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
1e830 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  mInfo)(CK_SLOT_I
1e840 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
1e850 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65  HANISM_TYPE type
1e860 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49  , CK_MECHANISM_I
1e870 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1e880 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1e890 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1e8a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1e8b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1e8c0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1e8d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e8e0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1e8f0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1e900 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1e910 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1e920 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e930 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e950 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e960 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e970 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e980 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e990 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1e9a0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1e9b0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1e9c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1e9d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1e9e0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1e9f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ea00 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1ea10 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1ea20 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1ea30 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1ea40 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1ea50 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1ea60 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1ea70 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1ea80 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1ea90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1eaa0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1eab0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1eac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ead0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1eae0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1eaf0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1eb00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1eb10 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1eb20 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1eb30 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1eb40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eb50 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1eb60 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1eb70 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1eb80 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1eb90 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1eba0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ebb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ebc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ebd0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1ebe0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1ebf0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1ec00 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1ec10 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1ec20 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1ec30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ec40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ec50 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1ec60 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1ec70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1ec80 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
1ec90 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73  h (type) {...cas
1eca0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
1ecb0 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
1ecc0 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
1ecd0 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
1ece0 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
1ecf0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1ed00 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52  KF_HW | CKF_ENCR
1ed10 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50  YPT | CKF_DECRYP
1ed20 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43  T | CKF_SIGN | C
1ed30 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72  KF_VERIFY;....br
1ed40 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  eak;..}...CACKEY
1ed50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1ed60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1ed70 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1ed80 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1ed90 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
1eda0 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
1edb0 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
1edc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1edd0 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28  V, C_InitToken)(
1ede0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1edf0 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  D, CK_UTF8CHAR_P
1ee00 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
1ee10 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  G ulPinLen, CK_U
1ee20 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62  TF8CHAR_PTR pLab
1ee30 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  el) {..CACKEY_DE
1ee40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ee50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1ee60 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1ee70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ee80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ee90 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1eea0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1eeb0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1eec0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1eed0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1eee0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1eef0 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
1ef00 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
1ef10 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
1ef20 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
1ef30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
1ef40 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
1ef50 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
1ef60 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
1ef70 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
1ef80 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1ef90 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e  CK_RV, C_InitPIN
1efa0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1efb0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1efc0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
1efd0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
1efe0 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
1eff0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1f000 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1f010 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1f020 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1f030 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f040 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1f050 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1f060 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1f070 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1f080 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1f090 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1f0a0 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
1f0b0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
1f0c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
1f0d0 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
1f0e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1f0f0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
1f100 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57  TECTED);.}../* W
1f110 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
1f120 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
1f130 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1f140 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50  ON(CK_RV, C_SetP
1f150 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  IN)(CK_SESSION_H
1f160 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1f170 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
1f180 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  pOldPin, CK_ULON
1f190 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43  G ulOldPinLen, C
1f1a0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
1f1b0 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  NewPin, CK_ULONG
1f1c0 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a   ulNewPinLen) {.
1f1d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f1e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1f1f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1f200 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1f230 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f240 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f250 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1f260 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1f270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f280 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1f290 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f2a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1f2b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f2c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1f2d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1f2e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f2f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f300 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f310 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43  C_OpenSession)(C
1f320 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1f330 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  , CK_FLAGS flags
1f340 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  , CK_VOID_PTR pA
1f350 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e  pplication, CK_N
1f360 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b  OTIFY notify, CK
1f370 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1f380 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b  PTR phSession) {
1f390 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
1f3a0 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
1f3b0 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75  retval;..int fou
1f3c0 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  nd_session = 0;.
1f3d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f3e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f3f0 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26  ;...if ((flags &
1f400 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
1f410 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49  ION) != CKF_SERI
1f420 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09  AL_SESSION) {...
1f430 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1f440 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f  ON_PARALLEL_NOT_
1f450 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a  SUPPORTED);..}..
1f460 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1f470 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1f480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f490 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1f4a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1f4b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1f4c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1f4d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1f4e0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
1f4f0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
1f500 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1f510 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1f520 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
1f530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f540 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1f550 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1f560 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
1f570 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
1f580 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
1f590 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1f5a0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1f5b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1f5c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1f5d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f5e0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1f5f0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1f600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f610 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1f620 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1f630 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1f640 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1f650 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1f660 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
1f670 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1f680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f690 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1f6a0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1f6b0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
1f6c0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
1f6d0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1f6e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1f6f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f700 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f710 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1f720 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
1f730 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69   that the card i
1f740 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68  s actually in th
1f750 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58  e slot. */../* X
1f760 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b  XX: Check to mak
1f770 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69  e sure this is i
1f780 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70  n the PKCS#11 sp
1f790 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  ecification */..
1f7a0 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
1f7b0 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
1f7c0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
1f7d0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
1f7e0 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
1f7f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f800 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f810 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74  Card not present
1f820 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  .  Returning CKR
1f830 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22  _DEVICE_REMOVED"
1f840 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1f850 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1f860 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1f870 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f  turn(CKR_DEVICE_
1f880 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66  REMOVED);..}...f
1f890 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
1f8a0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1f8b0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1f8c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1f8d0 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1f8e0 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
1f8f0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1f900 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75  active) {....fou
1f910 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a  nd_session = 1;.
1f920 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d  ....*phSession =
1f930 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79   idx;.....cackey
1f940 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
1f950 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61  ctive = 1;....ca
1f960 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1f970 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74  x].slotID = slot
1f980 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ID;....cackey_se
1f990 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74  ssions[idx].stat
1f9a0 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
1f9b0 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61  C_SESSION;....ca
1f9c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1f9d0 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  x].flags = flags
1f9e0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1f9f0 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69  ions[idx].ulDevi
1fa00 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09  ceError = 0;....
1fa10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1fa20 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f  idx].pApplicatio
1fa30 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  n = pApplication
1fa40 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1fa50 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79  ions[idx].Notify
1fa60 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63   = notify;.....c
1fa70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1fa80 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
1fa90 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
1faa0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
1fab0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
1fac0 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
1fad0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65  sessions[idx].se
1fae0 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
1faf0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
1fb00 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61  ions[idx].sign_a
1fb10 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
1fb20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1fb30 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  dx].decrypt_acti
1fb40 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
1fb50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1fb60 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
1fb70 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
1fb80 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
1fb90 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
1fba0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1fbb0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1fbc0 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b  nt);......break;
1fbd0 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
1fbe0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1fbf0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1fc00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1fc10 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1fc20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1fc30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fc40 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1fc50 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1fc60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1fc70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1fc80 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f  f (!found_sessio
1fc90 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
1fca0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1fcb0 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f  rning CKR_SESSIO
1fcc0 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43  N_COUNT (%i)", C
1fcd0 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
1fce0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fcf0 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
1fd00 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1fd10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1fd20 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1fd30 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1fd40 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1fd50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1fd60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
1fd70 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45  seSession)(CK_SE
1fd80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1fd90 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
1fda0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
1fdb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fdc0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1fdd0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1fde0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1fdf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fe00 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1fe10 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1fe20 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1fe30 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1fe40 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1fe50 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
1fe60 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
1fe70 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1fe80 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1fe90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1fea0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1feb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fec0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
1fed0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
1fee0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1fef0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1ff00 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1ff10 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1ff20 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1ff30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1ff40 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1ff50 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1ff60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ff70 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1ff80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1ff90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1ffa0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1ffb0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1ffc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
1ffd0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
1ffe0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1fff0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
20000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
20020 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
20030 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
20040 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
20050 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
20060 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20070 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
20080 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  ive = 0;..cackey
20090 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
200a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
200b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
200c0 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
200d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
200e0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
200f0 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  t);...mutex_retv
20100 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
20110 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20120 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
20130 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
20140 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20150 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20160 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
20170 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20180 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20190 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
201a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
201b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
201c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
201d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
201e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
201f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20200 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
20210 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  ns)(CK_SLOT_ID s
20220 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32  lotID) {..uint32
20230 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  _t idx;..int mut
20240 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
20250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20260 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20270 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
20280 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
202a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
202b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
202c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
202d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
202e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
202f0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
20300 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
20310 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
20320 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
20330 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
20340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20350 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
20360 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
20370 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
20380 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
20390 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
203a0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
203b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
203c0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
203d0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
203e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
203f0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
20400 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20420 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
20430 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20440 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20450 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20460 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
20470 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
20480 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
204a0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
204b0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
204c0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
204d0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
204e0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
204f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
20500 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20510 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
20520 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
20530 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
20540 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
20550 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
20560 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
20570 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
20580 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
20590 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
205a0 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
205b0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
205c0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49  sions[idx].slotI
205d0 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09  D != slotID) {..
205e0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
205f0 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  }.....cackey_mut
20600 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20610 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f  _biglock);....C_
20620 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
20630 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
20640 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
20650 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a  iglock);...}..}.
20660 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
20670 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
20680 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20690 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
206a0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
206b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
206c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
206d0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
206e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
206f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
20700 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
20710 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20720 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20730 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
20740 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
20750 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
20760 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
20770 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b  tSessionInfo)(CK
20780 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
20790 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53  hSession, CK_SES
207a0 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SION_INFO_PTR pI
207b0 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
207c0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
207d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
207e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
207f0 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
20800 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20810 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20820 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
20830 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20840 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
20850 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
20860 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20870 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20880 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20890 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
208a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
208b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
208c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
208d0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
208e0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
208f0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
20900 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
20910 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
20920 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
20930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20940 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
20950 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
20960 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
20970 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
20980 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
20990 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
209a0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
209b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
209c0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
209d0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
209e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
209f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
20a00 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20a10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20a20 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20a30 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
20a40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20a50 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
20a60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20a70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20a80 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
20a90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20aa0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
20ab0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
20ac0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
20ad0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
20ae0 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
20af0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
20b00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20b10 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66  n].slotID;..pInf
20b20 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65  o->state = cacke
20b30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
20b40 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e  ion].state;..pIn
20b50 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b  fo->flags = cack
20b60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20b70 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49  sion].flags;..pI
20b80 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72  nfo->ulDeviceErr
20b90 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  or = cackey_sess
20ba0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75  ions[hSession].u
20bb0 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09  lDeviceError;...
20bc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
20bd0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20be0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20bf0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
20c00 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
20c10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20c20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
20c30 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20c40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20c50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20c60 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
20c70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20c80 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
20c90 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
20ca0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
20cb0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20cc0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
20cd0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
20ce0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20cf0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
20d00 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
20d10 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
20d20 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f  _PTR pulOperatio
20d30 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41  nStateLen) {..CA
20d40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20d50 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20d60 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20d70 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20d80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20d90 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20da0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20db0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20dc0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20dd0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
20de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20df0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20e00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20e10 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20e20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20e30 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
20e40 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
20e50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20e60 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20e70 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
20e80 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
20e90 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20ea0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20eb0 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
20ec0 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
20ed0 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53  ONG ulOperationS
20ee0 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45  tateLen, CK_OBJE
20ef0 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79  CT_HANDLE hEncry
20f00 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ptionKey, CK_OBJ
20f10 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68  ECT_HANDLE hAuth
20f20 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b  enticationKey) {
20f30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20f40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
20f50 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
20f60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
20f70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20f80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
20f90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
20fa0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20fb0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
20fc0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
20fd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20fe0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20ff0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21000 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
21010 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
21020 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
21030 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
21040 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21050 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
21060 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
21070 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53   C_Login)(CK_SES
21080 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
21090 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59  sion, CK_USER_TY
210a0 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f  PE userType, CK_
210b0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
210c0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
210d0 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  nLen) {..CK_SLOT
210e0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
210f0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
21100 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
21110 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f  ing;..int login_
21120 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
21130 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
21140 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
21150 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21160 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21170 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21180 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21190 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
211a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
211b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
211c0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
211d0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
211e0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
211f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
21200 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
21210 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
21220 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21230 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
21240 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
21250 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
21260 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
21270 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
21280 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79  ..}...if (userTy
21290 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20  pe != CKU_USER) 
212a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
212b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
212c0 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
212d0 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65   USER mode, aske
212e0 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22  d for %lu mode."
212f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
21300 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72  ) userType)....r
21310 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54  eturn(CKR_USER_T
21320 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  YPE_INVALID);..}
21330 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
21340 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
21350 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21360 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21370 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21380 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21390 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
213a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
213b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
213c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
213d0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
213e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
213f0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
21400 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21410 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21420 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
21430 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21440 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
21450 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
21460 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
21470 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
21480 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
21490 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
214a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
214b0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
214c0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
214d0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
214e0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
214f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
21500 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
21510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21520 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
21530 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
21540 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
21550 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
21560 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
21570 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21580 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
21590 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
215a0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
215b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
215c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
215d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
215e0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
215f0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
21600 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
21610 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21620 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21630 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
21640 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21650 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e  ROR);..}...login
21660 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f  _ret = cackey_lo
21670 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  gin(&cackey_slot
21680 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c  s[slotID], pPin,
21690 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65   ulPinLen, &trie
216a0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69  s_remaining);..i
216b0 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20  f (login_ret != 
216c0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
216d0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
216e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
216f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
21700 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
21710 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
21720 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  KED) {....CACKEY
21730 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21740 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20  rror.  Token is 
21750 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63  locked.");.....c
21760 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21770 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
21780 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
21790 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75  LOCKED;.....retu
217a0 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  rn(CKR_PIN_LOCKE
217b0 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  D);...} else if 
217c0 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
217d0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
217e0 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  IN) {....CACKEY_
217f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21800 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49  ror.  Invalid PI
21810 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  N.");.....cackey
21820 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
21830 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
21840 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
21850 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72  _LOW;.....if (tr
21860 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  ies_remaining ==
21870 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79   1) {.....cackey
21880 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
21890 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
218a0 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c  F_USER_PIN_FINAL
218b0 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  _TRY;....}.....r
218c0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
218d0 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
218e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
218f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
21900 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75  known error retu
21910 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79  rned from cackey
21920 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20  _login() (%i)", 
21930 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72  login_ret);....r
21940 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21950 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
21960 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21970 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
21980 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49  &= ~(CKF_USER_PI
21990 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55  N_LOCKED | CKF_U
219a0 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
219b0 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  W | CKF_LOGIN_RE
219c0 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45  QUIRED | CKF_USE
219d0 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29  R_PIN_FINAL_TRY)
219e0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
219f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
21a00 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45  ate = CKS_RO_USE
21a10 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d  R_FUNCTIONS;...m
21a20 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21a30 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21a40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21a50 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
21a60 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
21a70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21a80 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
21a90 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
21aa0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
21ab0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
21ac0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
21ad0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21ae0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
21af0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
21b00 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
21b10 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21b20 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75  N(CK_RV, C_Logou
21b30 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
21b40 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
21b50 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
21b60 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
21b70 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
21b80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21b90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21ba0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21bb0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
21bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21bd0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
21be0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
21bf0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
21c00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
21c10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
21c20 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
21c30 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
21c40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21c50 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21c60 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
21c70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21c80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21c90 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
21ca0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
21cb0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
21cc0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
21cd0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
21ce0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21cf0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
21d00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
21d10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
21d20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21d30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21d40 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
21d50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21d60 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21d70 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
21d80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21d90 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
21da0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
21db0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21dc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
21dd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21de0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
21df0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
21e00 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
21e10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
21e20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
21e30 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
21e40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21e50 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
21e60 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
21e70 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
21e80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
21e90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
21ea0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
21eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ec0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
21ed0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
21ee0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
21ef0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
21f00 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
21f10 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21f20 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21f30 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21f40 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
21f50 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21f60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21f70 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
21f80 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
21f90 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
21fa0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
21fb0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
21fc0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21fd0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21fe0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21ff0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22000 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
22010 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
22020 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
22030 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65  _SESSION;..cacke
22040 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
22050 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
22060 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
22070 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
22080 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
22090 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
220a0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
220b0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
220c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
220d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
220e0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
220f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22100 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22110 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
22120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22130 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22140 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
22150 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
22160 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22170 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22180 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b  CreateObject)(CK
22190 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
221a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
221b0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
221c0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
221d0 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
221e0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
221f0 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
22200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22210 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
22220 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22230 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22250 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22260 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22270 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22280 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22290 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
222a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
222b0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
222c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
222d0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
222e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
222f0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
22300 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22310 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
22320 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22330 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f  N(CK_RV, C_CopyO
22340 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
22350 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
22360 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
22370 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
22380 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
22390 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
223a0 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
223b0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
223c0 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09  phNewObject) {..
223d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
223e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
223f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22400 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22420 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22430 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22440 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22450 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22460 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22480 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22490 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
224a0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
224b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
224c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
224d0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
224e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
224f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22500 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22510 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28  _DestroyObject)(
22520 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22530 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
22540 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
22550 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
22560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22570 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22580 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22590 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
225a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
225b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
225c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
225d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
225e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
225f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22600 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22610 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
22620 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22630 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
22640 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22650 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
22660 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22670 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
22680 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22690 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a  (CK_RV, C_GetObj
226a0 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53  ectSize)(CK_SESS
226b0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
226c0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
226d0 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
226e0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
226f0 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ize) {..CACKEY_D
22700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22710 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22720 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
22730 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
22740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22750 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
22760 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
22770 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
22780 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22790 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
227a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
227b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
227c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
227d0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
227e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
227f0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22800 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22810 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22820 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22830 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72  CK_RV, C_GetAttr
22840 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
22850 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22860 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
22870 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
22880 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
22890 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
228a0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
228b0 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
228c0 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72  *curr_attr;..str
228d0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
228e0 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09  ity *identity;..
228f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
22900 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72  entity_idx, attr
22910 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f  _idx, sess_attr_
22920 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69  idx, num_ids;..i
22930 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
22940 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
22950 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49   CKR_OK;..CK_VOI
22960 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
22970 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
22980 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  en;...CACKEY_DEB
22990 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
229a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
229b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
229c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
229d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
229e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
229f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22a00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22a10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22a20 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
22a30 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
22a40 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
22a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
22a60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22a70 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
22a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22a90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22aa0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
22ab0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
22ac0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
22ad0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22ae0 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74  .}...if (hObject
22af0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
22b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22b10 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
22b20 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
22b30 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
22b40 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
22b50 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
22b60 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  }...if (ulCount 
22b70 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
22b80 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
22b90 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
22ba0 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
22bb0 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
22bc0 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41  ediately */...CA
22bd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22be0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22bf0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
22c00 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
22c10 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
22c20 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
22c30 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c  pTemplate == NUL
22c40 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
22c50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22c60 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  r.  pTemplate is
22c70 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
22c80 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
22c90 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  S_BAD);..}...ide
22ca0 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a  ntity_idx = hObj
22cb0 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78  ect - 1;...mutex
22cc0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
22cd0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
22ce0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
22cf0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
22d00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22d20 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
22d30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
22d40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22d50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
22d60 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
22d70 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
22d80 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
22d90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
22da0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
22db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22dc0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
22dd0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
22de0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
22df0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
22e00 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
22e10 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65  .num_ids = cacke
22e20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22e30 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
22e40 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65  count;...if (ide
22e50 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d  ntity_idx >= num
22e60 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79  _ids) {...cackey
22e70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22e80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
22e90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22ea0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
22eb0 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
22ec0 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e   of range.  iden
22ed0 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20  tity_idx = %lu, 
22ee0 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c  num_ids = %lu.",
22ef0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
22f00 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28   identity_idx, (
22f10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e  unsigned long) n
22f20 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75  um_ids);....retu
22f30 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
22f40 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
22f50 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26  }...identity = &
22f60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22f70 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
22f80 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64  ties[identity_id
22f90 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f  x];...for (attr_
22fa0 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
22fb0 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74  x < ulCount; att
22fc0 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  r_idx++) {...cur
22fd0 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c  r_attr = &pTempl
22fe0 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  ate[attr_idx];..
22ff0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
23000 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
23010 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
23020 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23030 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f  INTF("Looking fo
23040 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30  r attribute 0x%0
23050 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c  8lx (identity:%l
23060 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  u) ...", (unsign
23070 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
23080 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67  tr->type, (unsig
23090 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
230a0 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20  ty_idx);....for 
230b0 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d  (sess_attr_idx =
230c0 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64   0; sess_attr_id
230d0 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  x < identity->at
230e0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
230f0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
23100 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69   {....if (identi
23110 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
23120 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79  ess_attr_idx].ty
23130 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d  pe == curr_attr-
23140 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43  >type) {.....CAC
23150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23160 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c  (" ... found it,
23170 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c   pValue = %p, ul
23180 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c  ValueLen = %lu",
23190 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
231a0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
231b0 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65  idx].pValue, ide
231c0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
231d0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
231e0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
231f0 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
23200 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
23210 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
23220 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09  dx].pValue;.....
23230 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65  ulValueLen = ide
23240 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
23250 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
23260 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  .ulValueLen;....
23270 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72  }...}....if (cur
23280 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26  r_attr->pValue &
23290 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69  & pValue) {....i
232a0 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
232b0 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61  ValueLen >= ulVa
232c0 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65  lueLen) {.....me
232d0 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e  mcpy(curr_attr->
232e0 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
232f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
23300 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56  } else {.....ulV
23310 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
23320 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74  NG) -1;......ret
23330 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
23340 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
23350 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74  ...}....curr_att
23360 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  r->ulValueLen = 
23370 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a  ulValueLen;..}..
23380 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
23390 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
233a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
233b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
233c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
233d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
233e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
233f0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
23400 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23410 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23420 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ..}...if (retval
23430 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54   == CKR_ATTRIBUT
23440 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20  E_TYPE_INVALID) 
23450 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23460 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23470 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  ng CKR_ATTRIBUTE
23480 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25  _TYPE_INVALID (%
23490 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
234a0 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  l);..} else if (
234b0 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55  retval == CKR_BU
234c0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
234d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
234e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
234f0 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ng CKR_BUFFER_TO
23500 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28  O_SMALL (%i)", (
23510 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
23520 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
23530 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
23540 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23550 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23560 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e  KR_OK (%i)", (in
23570 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
23580 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  lse {...CACKEY_D
23590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
235a0 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
235b0 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  ) retval);..}...
235c0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
235d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
235e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
235f0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
23600 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
23610 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
23620 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
23630 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
23640 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
23650 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
23660 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
23670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23680 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23690 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
236a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
236b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
236c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
236d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
236e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
236f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23700 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23710 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23720 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
23730 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
23740 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
23750 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23760 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
23770 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23780 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23790 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
237a0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
237b0 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45  jectsInit)(CK_SE
237c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
237d0 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
237e0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
237f0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
23800 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  unt) {..CK_SLOT_
23810 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55  ID slotID;..CK_U
23820 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
23830 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
23840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23850 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23860 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23870 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23890 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
238a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
238b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
238c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
238d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
238e0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
238f0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
23900 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
23910 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
23920 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23930 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
23940 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23950 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
23960 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
23970 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23980 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
23990 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
239a0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
239b0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
239c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
239d0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
239e0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
239f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23a00 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
23a10 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
23a20 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
23a30 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
23a40 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
23a50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
23a60 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
23a70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23a80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
23a90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23aa0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
23ab0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
23ac0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
23ad0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
23ae0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
23af0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
23b00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23b10 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
23b20 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23b30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23b40 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
23b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23b60 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
23b70 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
23b80 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
23b90 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
23ba0 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  TIVE);..}...slot
23bb0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
23bc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23bd0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
23be0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
23bf0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
23c00 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
23c10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
23c20 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
23c30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23c40 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
23c50 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
23c60 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
23c70 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
23c80 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
23c90 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23ca0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
23cb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23cc0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
23cd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23ce0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23cf0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
23d00 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
23d10 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
23d20 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
23d30 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
23d40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23d50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23d60 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23d70 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
23d80 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
23d90 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
23da0 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
23db0 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20  BUG_PRINTF("The 
23dc0 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65  slot has been re
23dd0 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73  set since we las
23de0 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65  t looked for ide
23df0 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61  ntities -- resca
23e00 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28  nning");....if (
23e10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23e20 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
23e30 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
23e40 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ...cackey_free_i
23e50 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
23e60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23e70 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
23e80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23e90 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
23ea0 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
23eb0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23ec0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
23ed0 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
23ee0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23ef0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
23f00 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
23f10 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
23f20 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23f30 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  .label != NULL) 
23f40 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
23f50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
23f60 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79  abel);....cackey
23f70 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
23f80 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
23f90 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
23fa0 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
23fb0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23fc0 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  );...cackey_slot
23fd0 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
23fe0 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  eset = 0;..}...i
23ff0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
24000 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
24010 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
24020 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
24030 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
24040 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
24050 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
24060 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
24070 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
24080 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24090 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
240a0 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  count);..}...if 
240b0 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55  (pTemplate != NU
240c0 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  LL) {...if (ulCo
240d0 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
240e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
240f0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
24100 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c  query_count = ul
24110 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79  Count;....cackey
24120 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24130 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
24140 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e   = malloc(ulCoun
24150 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
24160 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d  plate));.....mem
24170 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
24180 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
24190 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d  arch_query, pTem
241a0 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a  plate, ulCount *
241b0 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
241c0 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64  te));....for (id
241d0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43  x = 0; idx < ulC
241e0 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
241f0 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
24200 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
24210 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61   == 0) {......ca
24220 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24230 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
24240 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
24250 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63   = NULL;.......c
24260 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a  ontinue;.....}..
24270 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24280 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
24290 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
242a0 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
242b0 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
242c0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
242d0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
242e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
242f0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
24300 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  .pValue) {......
24310 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
24320 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24330 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
24340 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
24350 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65  late[idx].pValue
24360 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
24370 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
24380 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  ..}....}...} els
24390 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  e {....cackey_se
243a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
243b0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
243c0 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  unt = 0;....cack
243d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
243e0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
243f0 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ry = NULL;...}..
24400 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75  } else {...if (u
24410 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
24420 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24430 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24440 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
24450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24460 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71  Error.  Search q
24470 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61  uery specified a
24480 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62  s NULL, but numb
24490 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d  er of query term
244a0 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
244b0 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74  as 0.");.....ret
244c0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
244d0 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  S_BAD);...}....c
244e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
244f0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
24500 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
24510 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24520 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
24530 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
24540 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
24550 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24560 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
24570 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   1;..cackey_sess
24580 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24590 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
245a0 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  0;...mutex_retva
245b0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
245c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
245d0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
245e0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
245f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24600 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24610 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
24620 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24630 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
24640 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
24650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24660 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
24670 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
24680 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
24690 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
246a0 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f  cackey_pkcs11_co
246b0 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73  mpare_attributes
246c0 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  (CK_ATTRIBUTE *a
246d0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  , CK_ATTRIBUTE *
246e0 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  b) {..unsigned c
246f0 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a  har *smallbuf, *
24700 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f  largebuf;..size_
24710 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20  t smallbuf_len, 
24720 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09  largebuf_len;...
24730 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62  if (a->type != b
24740 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75  ->type) {...retu
24750 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  rn(0);..}...CACK
24760 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24770 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
24780 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
24790 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
247a0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
247b0 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22   ... our value:"
247c0 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e  , a->pValue, a->
247d0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69  ulValueLen);...i
247e0 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20  f (b->pValue == 
247f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
24800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
24810 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
24820 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29  wildcard match")
24830 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
24840 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c  .}...if (a->pVal
24850 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ue == NULL) {...
24860 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20  return(0);..}.. 
24870 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c  .if (b->ulValueL
24880 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65  en == a->ulValue
24890 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d  Len && memcmp(a-
248a0 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c  >pValue, b->pVal
248b0 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, b->ulValueLe
248c0 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  n) == 0) {...CAC
248d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
248e0 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
248f0 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29  nd exact match")
24900 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
24910 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e  .}...switch (a->
24920 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
24930 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69  KA_MODULUS:....i
24940 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  f (a->ulValueLen
24950 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65   == b->ulValueLe
24960 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
24970 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e  ...}.....if (a->
24980 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e  ulValueLen > b->
24990 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
249a0 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e  ..smallbuf = b->
249b0 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c  pValue;.....smal
249c0 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c  lbuf_len = b->ul
249d0 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c  ValueLen;......l
249e0 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61  argebuf = a->pVa
249f0 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75  lue;.....largebu
24a00 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c  f_len = a->ulVal
24a10 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65  ueLen;....} else
24a20 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20   {.....smallbuf 
24a30 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = a->pValue;....
24a40 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20  .smallbuf_len = 
24a50 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  a->ulValueLen;..
24a60 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62  ....largebuf = b
24a70 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61  ->pValue;.....la
24a80 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e  rgebuf_len = b->
24a90 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
24aa0 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67  .....for (; larg
24ab0 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c  ebuf_len != smal
24ac0 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62  lbuf_len; largeb
24ad0 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65  uf++,largebuf_le
24ae0 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c  n--) {.....if (l
24af0 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29  argebuf[0] != 0)
24b00 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
24b10 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
24b20 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21   (largebuf_len !
24b30 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  = smallbuf_len) 
24b40 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
24b50 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70  }.....if (memcmp
24b60 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c  (largebuf, small
24b70 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  buf, smallbuf_le
24b80 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43  n) == 0) {.....C
24b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24ba0 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
24bb0 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65  ound approximate
24bc0 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72   match");......r
24bd0 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a  eturn(1);....}..
24be0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
24bf0 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f  eturn(0);.}..CK_
24c00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
24c10 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
24c20 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ects)(CK_SESSION
24c30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
24c40 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
24c50 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c  LE_PTR phObject,
24c60 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f   CK_ULONG ulMaxO
24c70 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55  bjectCount, CK_U
24c80 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65  LONG_PTR pulObje
24c90 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75  ctCount) {..stru
24ca0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
24cb0 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b  ty *curr_id;..CK
24cc0 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
24cd0 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _attr;..CK_ULONG
24ce0 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75   curr_id_idx, cu
24cf0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63  rr_out_id_idx, c
24d00 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65  urr_attr_idx, se
24d10 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b  ss_attr_idx;..CK
24d20 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63  _ULONG matched_c
24d30 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68  ount, prev_match
24d40 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d  ed_count;..int m
24d50 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66  utex_retval;.#if
24d60 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
24d70 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
24d80 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76 61  T..struct timeva
24d90 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75  l start, end;..u
24da0 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e  int64_t start_in
24db0 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64  t, end_int;.#end
24dc0 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
24dd0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24de0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24df0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
24e00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24e10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24e20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24e30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24e40 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
24e50 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
24e60 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74  ...if (pulObject
24e70 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
24e80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24e90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24ea0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69  pulObjectCount i
24eb0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
24ec0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24ed0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
24ee0 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
24ef0 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  LL && ulMaxObjec
24f00 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  tCount == 0) {..
24f10 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
24f20 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
24f30 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
24f40 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
24f50 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
24f60 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43  */...*pulObjectC
24f70 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43  ount = 0;....CAC
24f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24f90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24fa0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
24fb0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
24fc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24fd0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
24fe0 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29  hObject == NULL)
24ff0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25000 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25010 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55    phObject is NU
25020 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
25030 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
25040 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
25050 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  MaxObjectCount =
25060 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
25070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25080 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75  ror.  Maximum nu
25090 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
250a0 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72  specified as zer
250b0 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  o.");....return(
250c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
250d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
250e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
250f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
25100 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25110 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
25120 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
25130 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25140 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25150 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
25160 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
25170 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
25180 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
25190 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
251a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
251b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
251c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
251d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
251e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
251f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25200 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
25210 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25220 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25230 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
25240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25250 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
25260 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
25270 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25280 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
25290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
252a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
252b0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
252c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
252d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
252e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
252f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
25300 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25310 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
25320 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25330 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25340 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
25350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25360 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
25370 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
25380 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
25390 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
253a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66  ALIZED);..}..#if
253b0 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
253c0 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
253d0 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
253e0 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23  &start, NULL);.#
253f0 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74  endif...curr_out
25400 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  _id_idx = 0;..fo
25410 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d  r (curr_id_idx =
25420 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
25430 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
25440 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f  h_curr_id; curr_
25450 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  id_idx < cackey_
25460 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25470 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
25480 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  unt && ulMaxObje
25490 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64  ctCount; curr_id
254a0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
254b0 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  _id = &cackey_se
254c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
254d0 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72  .identities[curr
254e0 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43  _id_idx];....CAC
254f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25500 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65  ("Processing ide
25510 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73  ntity:%lu", (uns
25520 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
25530 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74  _id_idx);....mat
25540 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ched_count = 0;.
25550 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
25560 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f  r_idx = 0; curr_
25570 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65  attr_idx < cacke
25580 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25590 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
255a0 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74  y_count; curr_at
255b0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70  tr_idx++) {....p
255c0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
255d0 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  t = matched_coun
255e0 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  t;.....curr_attr
255f0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
25600 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25610 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f  arch_query[curr_
25620 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43  attr_idx];.....C
25630 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25640 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66  TF("  Checking f
25650 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20  or attribute %s 
25660 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65  (0x%08lx) in ide
25670 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41  ntity:%i...", CA
25680 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
25690 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
256a0 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65  (curr_attr->type
256b0 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
256c0 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
256d0 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  pe, (int) curr_i
256e0 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45  d_idx);....CACKE
256f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
25700 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b  ("    Value look
25710 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f  ing for:", curr_
25720 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
25730 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
25740 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73  Len);.....for (s
25750 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
25760 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
25770 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  < curr_id->attri
25780 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
25790 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
257a0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ....if (cackey_p
257b0 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74  kcs11_compare_at
257c0 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69  tributes(&curr_i
257d0 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
257e0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75  ss_attr_idx], cu
257f0 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09  rr_attr)) {.....
25800 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b  .matched_count++
25810 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
25820 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
25830 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74   If the attribut
25840 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d  e could not be m
25850 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74  atched, do not t
25860 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69  ry to match addi
25870 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65  tional attribute
25880 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76  s */....if (prev
25890 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
258a0 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29  = matched_count)
258b0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
258c0 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61  .}...}....if (ma
258d0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63  tched_count == c
258e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
258f0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
25900 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09  query_count) {..
25910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25920 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c  RINTF("  ... All
25930 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63   %i attributes c
25940 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
25950 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  , adding identit
25960 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64  y:%i to returned
25970 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61   list", (int) ca
25980 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25990 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
259a0 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
259b0 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
259c0 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72  ....phObject[cur
259d0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20  r_out_id_idx] = 
259e0 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b  curr_id_idx + 1;
259f0 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74  .....ulMaxObject
25a00 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72  Count--;.....cur
25a10 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a  r_out_id_idx++;.
25a20 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
25a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25a40 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c  F("  ... Not all
25a50 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20   %i (only found 
25a60 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63  %i) attributes c
25a70 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
25a80 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65  , not adding ide
25a90 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29  ntity:%i", (int)
25aa0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
25ab0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
25ac0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
25ad0 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75  int) matched_cou
25ae0 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  nt, (int) curr_i
25af0 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09  d_idx);...}..}..
25b00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25b10 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
25b20 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f  _curr_id = curr_
25b30 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a  id_idx;..*pulObj
25b40 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f  ectCount = curr_
25b50 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66  out_id_idx;..#if
25b60 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
25b70 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
25b80 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
25b90 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74  &end, NULL);..st
25ba0 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74  art_int = (start
25bb0 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
25bc0 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73  0) + start.tv_us
25bd0 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28  ec;..end_int = (
25be0 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  end.tv_sec * 100
25bf0 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75  0000) + end.tv_u
25c00 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  sec;..fprintf(st
25c10 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f  derr, "Search to
25c20 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f  ok %lu microseco
25c30 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65  nds\n", (unsigne
25c40 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74  d long) (end_int
25c50 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a   - start_int));.
25c60 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72  #endif...mutex_r
25c70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
25c80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25c90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
25ca0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
25cb0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
25cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25cd0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
25ce0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
25cf0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
25d00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
25d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25d20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
25d30 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62  _OK (%i), num ob
25d40 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b  jects = %lu", CK
25d50 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74  R_OK, *pulObject
25d60 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  Count);...return
25d70 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
25d80 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25d90 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
25da0 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ectsFinal)(CK_SE
25db0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25dc0 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  ssion) {..CK_ULO
25dd0 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  NG idx;..int mut
25de0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
25df0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25e00 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25e10 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25e20 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25e30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25e40 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
25e50 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
25e60 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
25e70 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
25e80 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
25e90 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
25ea0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
25eb0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
25ec0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
25ed0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
25ee0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
25ef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25f00 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
25f10 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
25f20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
25f30 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
25f40 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
25f50 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25f60 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
25f70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25f80 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25f90 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25fa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25fb0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
25fc0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
25fd0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25fe0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
25ff0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
26000 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
26010 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
26020 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
26030 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
26040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26050 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
26060 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
26070 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
26080 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
26090 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
260a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
260b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
260c0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
260d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
260e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
260f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
26100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26110 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
26120 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
26130 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
26140 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
26150 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26160 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26170 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26180 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66  _active = 0;...f
26190 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
261a0 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
261b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
261c0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
261d0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
261e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
261f0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26200 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
26210 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  ue) {....free(ca
26220 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26230 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26240 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
26250 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
26260 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26270 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26280 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65  _query) {...free
26290 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
262a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
262b0 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d  h_query);..}...m
262c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
262d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
262e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
262f0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
26300 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
26310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26320 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
26330 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
26340 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26350 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26360 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
26370 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26380 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
26390 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
263a0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
263b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
263c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
263d0 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
263e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
263f0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
26400 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
26410 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
26420 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
26430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26440 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26450 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26460 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26480 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26490 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
264a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
264b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
264c0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
264d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
264e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
264f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26500 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26510 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26520 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26530 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26540 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
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 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
26580 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26590 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
265a0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
265b0 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
265c0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
265d0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
265e0 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74   pulEncryptedDat
265f0 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
26600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26610 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26620 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
26630 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
26640 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26650 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
26660 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
26670 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
26680 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26690 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
266a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
266b0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
266c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
266d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
266e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
266f0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
26700 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26710 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
26720 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
26730 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
26740 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
26750 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26760 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
26770 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
26780 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
26790 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
267a0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
267b0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
267c0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
267d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
267e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
267f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26800 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26820 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26830 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26840 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26850 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26860 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
26870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26880 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
26890 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
268a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
268b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
268c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
268d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
268e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
268f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26900 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
26910 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
26920 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26930 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
26940 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74  PTR pLastEncrypt
26950 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
26960 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72  _PTR pulLastEncr
26970 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
26980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26990 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
269a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
269b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
269c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
269d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
269e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
269f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26a00 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26a10 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
26a20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26a30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26a40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26a50 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
26a60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26a70 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
26a80 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
26a90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26aa0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26ab0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26ac0 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43  C_DecryptInit)(C
26ad0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
26ae0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
26af0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
26b00 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
26b10 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
26b20 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
26b30 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
26b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26b50 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
26b60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26b70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26b90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26ba0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26bb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26bc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26bd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
26be0 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
26bf0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
26c00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26c10 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
26c20 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
26c30 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
26c40 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
26c50 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
26c60 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
26c70 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
26c80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26c90 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
26ca0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
26cb0 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
26cc0 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
26cd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26ce0 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
26cf0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
26d00 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
26d10 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
26d20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
26d30 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
26d40 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
26d50 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
26d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26d70 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
26d80 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
26d90 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
26da0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
26db0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
26dc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
26dd0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
26de0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26df0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26e00 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26e20 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
26e30 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
26e40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
26e50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
26e60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
26e70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26e80 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
26e90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26ea0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26eb0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
26ec0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26ed0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
26ee0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
26ef0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
26f00 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
26f10 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
26f20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26f30 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
26f40 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
26f50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
26f60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
26f70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26f80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
26f90 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20  rypt already in 
26fa0 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
26fb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
26fc0 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
26fd0 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
26fe0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
26ff0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
27000 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
27010 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27020 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27030 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
27040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27050 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
27060 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
27070 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
27080 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
27090 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
270a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
270b0 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
270c0 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
270d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
270e0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
270f0 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
27100 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
27110 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
27120 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27130 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
27140 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
27150 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27160 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
27170 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
27180 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
27190 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  sm;..cackey_sess
271a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
271b0 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
271c0 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70   = pMechanism->p
271d0 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b  Parameter;..cack
271e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
271f0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
27200 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65  ch_parmlen = pMe
27210 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d  chanism->ulParam
27220 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79  eterLen;..cackey
27230 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27240 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
27250 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
27260 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27270 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
27280 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
27290 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
272a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
272b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
272c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
272d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
272e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
272f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
27300 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
27310 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27320 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
27330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27340 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
27350 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
27360 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
27370 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
27380 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
27390 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45  C_Decrypt)(CK_SE
273a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
273b0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
273c0 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
273d0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  a, CK_ULONG ulEn
273e0 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
273f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
27400 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
27410 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
27420 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f  K_ULONG datalen_
27430 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f  update, datalen_
27440 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65  final;..CK_RV de
27450 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20  crypt_ret;..int 
27460 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
27470 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27480 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
27490 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
274a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
274b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
274c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
274d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
274e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
274f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27500 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
27510 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20   (pulDataLen == 
27520 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
27530 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27540 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e  rror. pulDataLen
27550 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
27560 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
27570 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
27580 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d  datalen_update =
27590 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09   *pulDataLen;...
275a0 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
275b0 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53  DecryptUpdate(hS
275c0 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74  ession, pEncrypt
275d0 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70  edData, ulEncryp
275e0 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74  tedDataLen, pDat
275f0 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61  a, &datalen_upda
27600 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  te);..if (decryp
27610 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
27620 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27630 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27640 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28    DecryptUpdate(
27650 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
27660 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
27670 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
27680 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
27690 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
276a0 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t != CKR_BUFFER_
276b0 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
276c0 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63  /* Terminate dec
276d0 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ryption operatio
276e0 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72  n */.....mutex_r
276f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
27700 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
27710 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
27720 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
27730 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
27740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27750 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
27760 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
27770 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
27780 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
27790 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
277a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
277b0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
277c0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
277d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
277e0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
277f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27800 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
27810 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
27820 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27830 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
27840 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
27850 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
27860 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27870 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
27880 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
27890 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
278a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
278b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
278c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
278d0 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
278e0 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
278f0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
27900 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
27910 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  D);....}.....cac
27920 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27930 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
27940 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d  ctive = 0;.....m
27950 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
27960 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27970 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27980 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
27990 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
279a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
279b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
279c0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
279d0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
279e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
279f0 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  OR);....}...}...
27a00 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
27a10 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
27a20 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20  Data) {...pData 
27a30 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  += datalen_updat
27a40 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66  e;..}..datalen_f
27a50 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c  inal = *pulDataL
27a60 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en - datalen_upd
27a70 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  ate;...decrypt_r
27a80 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  et = C_DecryptFi
27a90 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  nal(hSession, pD
27aa0 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69  ata, &datalen_fi
27ab0 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79  nal);..if (decry
27ac0 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
27ad0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27ae0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27af0 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28  .  DecryptFinal(
27b00 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
27b10 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
27b20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
27b30 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
27b40 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
27b50 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  _ret);..}...*pul
27b60 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65  DataLen = datale
27b70 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c  n_update + datal
27b80 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b  en_final;...CACK
27b90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27ba0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
27bb0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
27bc0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
27bd0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
27be0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27bf0 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
27c00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27c10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27c20 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
27c30 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
27c40 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
27c50 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
27c60 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
27c70 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
27c80 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
27c90 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b  BYTE buf[16384];
27ca0 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  ..ssize_t buflen
27cb0 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ;..CK_SLOT_ID sl
27cc0 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74  otID;..CK_RV ret
27cd0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
27ce0 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75  L_ERROR;..int mu
27cf0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
27d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27d10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27d20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
27d30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
27d40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27d50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27d60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27d70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27d80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27d90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
27da0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
27db0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27dc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27dd0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27de0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
27df0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
27e00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27e10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
27e20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
27e30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27e40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27e50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
27e60 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
27e70 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63  == NULL && ulEnc
27e80 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
27e90 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
27ea0 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
27eb0 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72  re asked to decr
27ec0 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ypt nothing... *
27ed0 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
27ee0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27ef0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
27f00 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
27f10 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
27f20 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
27f30 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64  ..if (pEncrypted
27f40 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
27f50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27f60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45  RINTF("Error. pE
27f70 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73 20  ncryptedPart is 
27f80 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72  NULL, but ulEncr
27f90 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
27fa0 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
27fb0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
27fc0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
27fd0 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  (ulEncryptedPart
27fe0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  Len == 0) {...CA
27ff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28000 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72  F("Error. ulEncr
28010 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
28020 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
28030 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
28040 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
28050 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
28060 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d  if (pulPartLen =
28070 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
28080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28090 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c  "Error. pulPartL
280a0 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
280b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
280c0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
280d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
280e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
280f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28100 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
28110 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
28120 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28130 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
28140 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
28150 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28160 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28170 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
28180 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28190 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
281a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
281b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
281c0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
281d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
281e0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
281f0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
28200 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
28210 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
28220 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
28230 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28240 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
28250 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28260 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28270 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28280 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28290 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
282a0 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
282b0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
282c0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
282d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
282e0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
282f0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
28300 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
28310 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
28320 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
28330 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
28340 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
28350 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
28360 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...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 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
28390 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
283a0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
283b0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
283c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
283d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
283e0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
283f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
28400 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
28410 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28420 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
28430 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
28440 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
28450 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
28460 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
28470 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
28480 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28490 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
284a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
284b0 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
284c0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
284d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
284e0 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ypt_mechanism) {
284f0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
28500 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20  PKCS:..../* Ask 
28510 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20  card to decrypt 
28520 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63  */....buflen = c
28530 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
28540 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
28550 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
28560 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28570 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
28580 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50  ity, pEncryptedP
28590 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  art, ulEncrypted
285a0 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69  PartLen, buf, si
285b0 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29  zeof(buf), 0, 1)
285c0 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  ;.....if (buflen
285d0 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44   < 0) {...../* D
285e0 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64  ecryption failed
285f0 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66  . */.....if (buf
28600 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
28610 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
28620 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
28630 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
28640 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
28650 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  se if (buflen ==
28660 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
28670 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
28680 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
28690 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a  DEVICE_REMOVED;.
286a0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
286b0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  ..retval = CKR_G
286c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09  ENERAL_ERROR;...
286d0 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66  ..}....} else if
286e0 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   (((unsigned lon
286f0 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75  g) buflen) > *pu
28700 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72  lPartLen && pPar
28710 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  t) {...../* Decr
28720 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  ypted data too l
28730 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76  arge */.....retv
28740 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
28750 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20  TOO_SMALL;....} 
28760 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70  else {.....if (p
28770 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d  Part) {......mem
28780 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20  cpy(pPart, buf, 
28790 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a  buflen);.....}..
287a0 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20  ....*pulPartLen 
287b0 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  = buflen;......r
287c0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
287d0 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
287e0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
287f0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
28800 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28810 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
28820 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
28830 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28840 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28850 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
28860 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28870 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28880 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
28890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
288a0 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
288b0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  nt) retval);...r
288c0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
288d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
288e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
288f0 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
28900 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
28910 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
28920 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43  PTR pLastPart, C
28930 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c  K_ULONG_PTR pulL
28940 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69  astPartLen) {..i
28950 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
28960 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
28970 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43  decrypt = 1;...C
28980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28990 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
289a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
289b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
289c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
289d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
289e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
289f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
28a00 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
28a10 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
28a20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
28a30 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
28a40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
28a50 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
28a60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28a70 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
28a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28a90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
28aa0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
28ab0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28ac0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
28ad0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
28ae0 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e   (pulLastPartLen
28af0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
28b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28b10 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73  F("Error. pulLas
28b20 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c  tPartLen is NULL
28b30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
28b40 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
28b50 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
28b60 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
28b70 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
28b80 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
28b90 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
28ba0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28bb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28bc0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
28bd0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28be0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
28bf0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
28c00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28c10 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
28c20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
28c30 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28c40 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
28c50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28c60 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28c70 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
28c80 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28c90 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
28ca0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
28cb0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
28cc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
28cd0 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
28ce0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28cf0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28d00 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
28d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28d20 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f  ror.  Decrypt no
28d30 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
28d40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
28d50 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
28d60 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70  ALIZED);..}...*p
28d70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20  ulLastPartLen = 
28d80 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61  0;...if (pLastPa
28d90 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
28da0 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
28db0 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
28dc0 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
28dd0 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  t) {...cackey_se
28de0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28df0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
28e00 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  = 0;..}...mutex_
28e10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28e20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28e30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
28e40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
28e50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
28e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28e70 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
28e80 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
28e90 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28ea0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
28eb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28ec0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
28ed0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
28ee0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
28ef0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
28f00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
28f10 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74  RV, C_DigestInit
28f20 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28f30 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28f40 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
28f50 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41  Mechanism) {..CA
28f60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28f70 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
28f80 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
28f90 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
28fa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28fb0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
28fc0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
28fd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
28fe0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
28ff0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
29000 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29010 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
29020 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29030 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
29040 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29050 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
29060 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
29070 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29080 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
29090 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
290a0 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f  igest)(CK_SESSIO
290b0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
290c0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
290d0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
290e0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
290f0 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43  E_PTR pDigest, C
29100 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
29110 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43  igestLen) {..CAC
29120 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29130 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29140 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29150 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29170 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29180 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29190 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
291a0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
291b0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
291c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
291d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
291e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
291f0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
29200 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29210 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
29220 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
29230 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29240 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29250 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
29260 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53  gestUpdate)(CK_S
29270 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29280 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
29290 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
292a0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
292b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
292c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
292d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
292e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
292f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29300 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29310 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29320 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29330 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29340 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29360 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29370 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29380 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29390 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
293a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
293b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
293c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
293d0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
293e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
293f0 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b   C_DigestKey)(CK
29400 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
29410 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
29420 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
29430 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
29440 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
29450 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
29460 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
29470 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29480 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29490 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
294a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
294b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
294c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
294d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
294e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
294f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29500 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
29510 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
29520 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29530 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
29540 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29550 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
29560 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
29570 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c  V, C_DigestFinal
29580 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29590 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
295a0 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73  _BYTE_PTR pDiges
295b0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
295c0 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a  pulDigestLen) {.
295d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
295e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
295f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
29600 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
29610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29620 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
29630 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
29640 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
29650 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29660 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
29670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29680 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
29690 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
296a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
296b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
296c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
296d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
296e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
296f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
29700 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29710 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53  C_SignInit)(CK_S
29720 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29730 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
29740 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
29750 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
29760 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69  ANDLE hKey) {..i
29770 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
29780 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43  ...hKey--;...CAC
29790 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
297a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
297b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
297c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
297d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
297e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
297f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29800 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29810 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29820 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
29830 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c  Mechanism == NUL
29840 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
29850 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29860 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73  r. pMechanism is
29870 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
29880 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
29890 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
298a0 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63  (pMechanism->mec
298b0 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53  hanism != CKM_RS
298c0 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
298d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
298e0 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
298f0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
29900 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
29910 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  KM_RSA_PKCS");..
29920 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
29930 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
29940 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
29950 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
29960 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
29970 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
29980 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
29990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
299a0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
299b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
299c0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
299d0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
299e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
299f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
29a00 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
29a10 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
29a20 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
29a30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
29a40 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
29a50 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
29a60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29a70 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
29a80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
29a90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29aa0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
29ab0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
29ac0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
29ad0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
29ae0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29af0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29b10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
29b20 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
29b30 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
29b40 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
29b50 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29b60 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
29b70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29b80 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
29b90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
29ba0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
29bb0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
29bc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29bd0 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65  rror.  Sign alre
29be0 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ady in progress.
29bf0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29c00 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
29c10 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  TIVE);..}...if (
29c20 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73  hKey >= cackey_s
29c30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29c40 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
29c50 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  nt) {...cackey_m
29c60 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
29c70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
29c80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29c90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79  NTF("Error.  Key
29ca0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
29cb0 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20  ange (requested 
29cc0 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c  key %lu, only %l
29cd0 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61  u identities ava
29ce0 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69  ilable).", (unsi
29cf0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c  gned long) hKey,
29d00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
29d10 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
29d20 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
29d30 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
29d40 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f  .return(CKR_KEY_
29d50 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
29d60 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
29d70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29d80 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b  sign_active = 1;
29d90 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29da0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
29db0 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  n_mechanism = pM
29dc0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
29dd0 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ism;...cackey_se
29de0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29df0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31  .sign_buflen = 1
29e00 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  28;..cackey_sess
29e10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29e20 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b  ign_bufused = 0;
29e30 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29e40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
29e50 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  _buf = malloc(si
29e60 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
29e70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29e80 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
29e90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29ea0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
29eb0 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  n);...CACKEY_DEB
29ec0 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69  UG_PRINTF("Sessi
29ed0 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e  on %lu sign_iden
29ee0 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e  tity is %p (iden
29ef0 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e  tity #%lu)", (un
29f00 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
29f10 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20  ssion, (void *) 
29f20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
29f30 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
29f40 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e  ities[hKey], (un
29f50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
29f60 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  y);..cackey_sess
29f70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29f80 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26  ign_identity = &
29f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29fa0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
29fb0 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75  ties[hKey];...mu
29fc0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29fd0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
29fe0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29ff0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2a000 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2a010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a020 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2a030 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2a040 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2a050 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2a060 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a070 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2a080 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2a090 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2a0a0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2a0b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2a0c0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28  (CK_RV, C_Sign)(
2a0d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2a0e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2a0f0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2a100 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
2a110 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a120 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2a130 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
2a140 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69  tureLen) {..unsi
2a150 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f  gned long start_
2a160 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43  sign_bufused;..C
2a170 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09  K_RV sign_ret;..
2a180 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2a190 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2a1a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2a1b0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2a1c0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2a1d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a1e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a1f0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2a200 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a210 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2a220 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a230 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
2a240 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
2a250 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2a260 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
2a270 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2a280 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
2a290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a2a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a2b0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
2a2c0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2a2d0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2a2e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2a2f0 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75  ...start_sign_bu
2a300 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73  fused = cackey_s
2a310 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a320 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  ].sign_bufused;.
2a330 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
2a340 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69  ignUpdate(hSessi
2a350 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74  on, pData, ulDat
2a360 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  aLen);..if (sign
2a370 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2a380 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a390 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a3a0 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65   SignUpdate() re
2a3b0 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
2a3c0 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
2a3d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
2a3e0 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73  n_ret);....if (s
2a3f0 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42  ign_ret != CKR_B
2a400 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
2a410 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76   {....mutex_retv
2a420 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2a430 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2a440 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2a450 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2a460 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2a470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a480 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2a490 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2a4a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a4b0 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
2a4c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2a4d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a4e0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2a4f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2a500 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2a510 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2a520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a530 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2a540 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2a550 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2a560 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2a570 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ALID);....}.....
2a580 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2a590 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2a5a0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
2a5b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2a5c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a5d0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2a5e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a5f0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
2a600 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2a610 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2a620 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2a630 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a  TIALIZED);....}.
2a640 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2a650 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2a660 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
2a670 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2a680 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2a690 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a6a0 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2a6b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2a6c0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2a6d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a6e0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2a6f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2a700 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2a710 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09  _ERROR);....}...
2a720 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  }....return(sign
2a730 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e  _ret);..}...sign
2a740 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e  _ret = C_SignFin
2a750 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69  al(hSession, pSi
2a760 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e  gnature, pulSign
2a770 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28  atureLen);..if (
2a780 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2a790 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e  OK) {...if (sign
2a7a0 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46  _ret == CKR_BUFF
2a7b0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
2a7c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a7d0 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61  PRINTF("SignFina
2a7e0 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52  l() returned CKR
2a7f0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2a800 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e  L (rv = %lu), un
2a810 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61  doing C_SignUpda
2a820 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  te()", (unsigned
2a830 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
2a840 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
2a850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a860 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73  sign_bufused = s
2a870 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
2a880 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69  d;.....return(si
2a890 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09  gn_ret);...}....
2a8a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a8b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2a8c0 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  nFinal() returne
2a8d0 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
2a8e0 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
2a8f0 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2a900 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  );....return(sig
2a910 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  n_ret);..}...if 
2a920 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e  (pSignature == N
2a930 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2a940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53  DEBUG_PRINTF("pS
2a950 69 67 6e 61 74 75 72 65 20 73 70 65 63 69 66 69  ignature specifi
2a960 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f  ed as NULL, undo
2a970 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
2a980 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  ()");....cackey_
2a990 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a9a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
2a9b0 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
2a9c0 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28  used;....return(
2a9d0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
2a9e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a9f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2aa00 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2aa10 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2aa20 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2aa30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2aa40 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74  _RV, C_SignUpdat
2aa50 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2aa60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2aa70 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2aa80 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2aa90 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
2aaa0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2aab0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2aac0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2aad0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2aae0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2aaf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ab00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2ab10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2ab20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2ab30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ab40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2ab50 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2ab60 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2ab70 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2ab80 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2ab90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2aba0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2abb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2abc0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2abd0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2abe0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2abf0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2ac00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2ac10 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  pPart == NULL &&
2ac20 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29   ulPartLen == 0)
2ac30 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2ac40 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
2ac50 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f  asked to sign no
2ac60 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
2ac70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ac80 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2ac90 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
2aca0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
2acb0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
2acc0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
2acd0 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pPart == NULL) {
2ace0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2acf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2ad00 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75  Part is NULL, bu
2ad10 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e  t ulPartLen is n
2ad20 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
2ad30 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2ad40 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2ad50 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  ulPartLen == 0) 
2ad60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ad70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ad80 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  ulPartLen is 0, 
2ad90 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
2ada0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2adb0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2adc0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
2add0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2ade0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2adf0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2ae00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2ae10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2ae20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ae30 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2ae40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2ae50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2ae60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2ae70 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2ae80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2ae90 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2aea0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2aeb0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2aec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aed0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2aee0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2aef0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2af00 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2af10 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2af20 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2af30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2af40 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2af50 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2af60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2af70 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2af80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2af90 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
2afa0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2afb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2afc0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2afd0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69  LIZED);..}...swi
2afe0 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
2aff0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b000 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ign_mechanism) {
2b010 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
2b020 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75  PKCS:..../* Accu
2b030 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20  mulate directly 
2b040 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65  */....if ((cacke
2b050 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b060 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2b070 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e  d + ulPartLen) >
2b080 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2b090 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2b0a0 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61  buflen) {.....ca
2b0b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b0c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2b0d0 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63  len *= 2;......c
2b0e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b0f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b100 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b  f = realloc(cack
2b110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b120 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
2b130 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
2b140 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b150 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
2b160 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b170 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2b180 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  len);....}.....m
2b190 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
2b1a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b1b0 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65  sign_buf + cacke
2b1c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b1d0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2b1e0 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74  d, pPart, ulPart
2b1f0 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  Len);.....cackey
2b200 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b210 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2b220 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a   += ulPartLen;..
2b230 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
2b240 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2b250 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b260 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b270 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2b280 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2b290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b2a0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2b2b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2b2c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2b2d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2b2e0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2b2f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2b300 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2b310 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2b320 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2b330 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b340 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46  N(CK_RV, C_SignF
2b350 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2b360 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2b370 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2b380 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2b390 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
2b3a0 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  ureLen) {..stati
2b3b0 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66  c CK_BYTE sigbuf
2b3c0 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74  [1024];..ssize_t
2b3d0 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f   sigbuflen;..CK_
2b3e0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
2b3f0 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
2b400 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b410 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  R;..int terminat
2b420 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74  e_sign = 1;..int
2b430 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2b440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b450 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b460 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b470 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b490 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b4a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b4b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b4c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b4d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2b4e0 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  f (pulSignatureL
2b4f0 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2b500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b510 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53  NTF("Error. pulS
2b520 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e  ignatureLen is N
2b530 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2b540 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2b550 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
2b560 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2b570 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2b580 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2b590 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2b5a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2b5b0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2b5c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b5d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2b5e0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2b5f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2b600 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2b610 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2b620 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2b630 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2b640 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2b650 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2b660 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2b670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b680 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2b690 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2b6a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2b6b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2b6c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2b6d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2b6e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2b6f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b700 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2b710 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b720 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2b730 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2b740 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2b750 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2b760 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2b770 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2b780 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b790 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
2b7a0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2b7b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2b7c0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2b7d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b7e0 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
2b7f0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2b800 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2b810 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2b820 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
2b830 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
2b840 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b850 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
2b860 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
2b870 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
2b880 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
2b890 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2b8a0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2b8b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b8c0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2b8d0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2b8e0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
2b8f0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
2b900 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
2b910 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b920 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2b930 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2b940 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
2b950 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b960 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b970 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2b980 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
2b990 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
2b9a0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
2b9b0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
2b9c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b9d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
2b9e0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2b9f0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
2ba00 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
2ba10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ba20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
2ba30 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
2ba40 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
2ba50 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f   card to sign */
2ba60 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ba70 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20  _PRINTF("Asking 
2ba80 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65  to sign from ide
2ba90 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73 73  ntity %p in sess
2baa0 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20  ion %lu", (void 
2bab0 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  *) cackey_sessio
2bac0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2bad0 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73  n_identity, (uns
2bae0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
2baf0 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66  sion);....sigbuf
2bb00 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
2bb10 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
2bb20 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
2bb30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bb40 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
2bb50 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
2bb60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2bb70 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
2bb80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bb90 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2bba0 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
2bbb0 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
2bbc0 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62  0);.....if (sigb
2bbd0 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
2bbe0 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
2bbf0 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ed. */.....if (s
2bc00 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
2bc10 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
2bc20 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
2bc30 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
2bc40 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
2bc50 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62  .} else if (sigb
2bc60 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2bc70 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
2bc80 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
2bc90 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
2bca0 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
2bcb0 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  se {......retval
2bcc0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2bcd0 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
2bce0 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
2bcf0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
2bd00 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e  flen) > *pulSign
2bd10 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67  atureLen && pSig
2bd20 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a  nature) {...../*
2bd30 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f   Signed data too
2bd40 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41   large */.....CA
2bd50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bd60 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  F("retval = CKR_
2bd70 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2bd80 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25  ;  sigbuflen = %
2bd90 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  lu, pulSignature
2bda0 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  Len = %lu", (uns
2bdb0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
2bdc0 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64  uflen, (unsigned
2bdd0 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61   long) *pulSigna
2bde0 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72  tureLen);......r
2bdf0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2be00 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09  ER_TOO_SMALL;...
2be10 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
2be20 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65  n = 0;....} else
2be30 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65   {.....terminate
2be40 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09  _sign = 0;......
2be50 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20  if (pSignature) 
2be60 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53  {......memcpy(pS
2be70 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66  ignature, sigbuf
2be80 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09  , sigbuflen);...
2be90 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2bea0 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  gn = 1;.....}...
2beb0 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  ...*pulSignature
2bec0 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b  Len = sigbuflen;
2bed0 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2bee0 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
2bef0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28  break;..}...if (
2bf00 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20  terminate_sign) 
2bf10 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
2bf20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2bf30 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09  ].sign_buf) {...
2bf40 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
2bf50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2bf60 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a  sign_buf);...}..
2bf70 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2bf80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2bf90 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
2bfa0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2bfb0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2bfc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2bfd0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2bfe0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2bff0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c000 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2c010 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2c020 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c030 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2c040 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2c050 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2c060 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
2c070 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
2c080 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
2c090 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c0a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
2c0b0 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
2c0c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2c0d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2c0e0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2c0f0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2c100 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2c110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c120 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c130 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c140 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c150 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c160 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c170 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c180 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c190 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c1a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2c1b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c1c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2c1d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c1e0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2c1f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c200 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2c210 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2c220 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2c230 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2c240 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2c250 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f  SignRecover)(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 42 59 54 45  Session, CK_BYTE
2c280 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
2c290 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
2c2a0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2c2b0 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2c2c0 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
2c2d0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2c2e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2c2f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2c300 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2c310 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2c320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c330 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2c340 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2c350 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2c360 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2c370 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2c380 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2c390 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2c3a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c3b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2c3c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c3d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2c3e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c3f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2c400 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2c410 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2c420 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2c430 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2c440 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2c450 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2c460 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2c470 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2c480 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2c490 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2c4a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2c4b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2c4c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c4d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2c4e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2c4f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2c500 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2c510 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2c520 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2c530 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2c540 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c550 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2c560 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c570 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2c580 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c590 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2c5a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2c5b0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2c5c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2c5d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2c5e0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2c5f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2c600 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2c610 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2c620 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2c630 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2c640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2c650 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2c660 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2c670 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2c680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c690 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2c6a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2c6b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2c6c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2c6d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2c6e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2c6f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2c700 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c710 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2c720 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c730 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2c740 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c750 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2c760 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2c770 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2c780 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2c790 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2c7a0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2c7b0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2c7c0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
2c7d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c7e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2c7f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2c800 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2c810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c820 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2c830 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2c840 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2c850 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2c860 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2c870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c880 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2c890 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c8a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2c8b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c8c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2c8d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2c8e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2c8f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2c900 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
2c910 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53  erifyFinal)(CK_S
2c920 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2c930 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2c940 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2c950 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
2c960 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
2c970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c980 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2c990 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2c9a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2c9b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c9c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2c9d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2c9e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2c9f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2ca00 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2ca10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2ca20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2ca30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ca40 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2ca50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ca60 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2ca70 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2ca80 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2ca90 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2caa0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2cab0 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ifyRecoverInit)(
2cac0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2cad0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2cae0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2caf0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2cb00 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2cb10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2cb20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2cb30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2cb40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2cb50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cb60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2cb70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2cb80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2cb90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2cba0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2cbb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cbc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2cbd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2cbe0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2cbf0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2cc00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2cc10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2cc20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2cc30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2cc40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2cc50 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
2cc60 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
2cc70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2cc80 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2cc90 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
2cca0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20  ulSignatureLen, 
2ccb0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2ccc0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2ccd0 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
2cce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ccf0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2cd00 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2cd10 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2cd20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cd30 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2cd40 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2cd50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2cd60 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2cd70 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2cd80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cd90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2cda0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2cdb0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2cdc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2cdd0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2cde0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2cdf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ce00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ce10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ce20 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
2ce30 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2ce40 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2ce50 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2ce60 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2ce70 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2ce80 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2ce90 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2cea0 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2ceb0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2cec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2ced0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2cee0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2cef0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2cf00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2cf10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2cf20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2cf30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2cf40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2cf50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2cf60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2cf70 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2cf80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2cf90 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2cfa0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2cfb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2cfc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2cfd0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2cfe0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2cff0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
2d000 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  tDigestUpdate)(C
2d010 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d020 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2d030 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2d040 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2d050 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2d060 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2d070 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2d080 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2d090 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2d0a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2d0b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2d0c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2d0d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d0e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2d0f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2d100 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d110 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2d120 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2d130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d140 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2d150 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d160 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2d170 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2d180 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2d190 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2d1a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d1b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2d1c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2d1d0 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  , C_SignEncryptU
2d1e0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2d1f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2d200 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2d210 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2d220 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
2d230 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2d240 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
2d250 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
2d260 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2d270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d280 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2d290 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2d2a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2d2b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d2c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2d2d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2d2e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2d2f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2d300 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2d310 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2d320 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2d330 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d340 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2d350 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d360 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2d370 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d380 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2d390 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d3a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2d3b0 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29  yptVerifyUpdate)
2d3c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2d3d0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2d3e0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2d3f0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2d400 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
2d410 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2d420 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2d430 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
2d440 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2d450 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d460 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d470 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d480 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d490 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d4a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d4b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d4c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d4d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d4e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d4f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d500 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2d510 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2d520 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2d530 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d540 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2d550 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d560 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2d570 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d580 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
2d590 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2d5a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2d5b0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2d5c0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
2d5d0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
2d5e0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
2d5f0 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
2d600 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
2d610 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2d620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d630 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d640 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d650 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d660 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d670 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d680 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d690 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d6a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d6b0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d6c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d6d0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d6e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d6f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d700 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d710 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d720 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d730 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d740 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d750 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
2d760 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45  teKeyPair)(CK_SE
2d770 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2d780 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2d790 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2d7a0 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
2d7b0 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54  _PTR pPublicKeyT
2d7c0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2d7d0 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74  G ulPublicKeyAtt
2d7e0 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
2d7f0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
2d800 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74  rivateKeyTemplat
2d810 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72  e, CK_ULONG ulPr
2d820 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74  ivateKeyAttribut
2d830 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
2d840 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
2d850 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ublicKey, CK_OBJ
2d860 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
2d870 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09  hPrivateKey) {..
2d880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d890 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2d8a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2d8b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2d8c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d8d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2d8e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2d8f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2d900 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2d910 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2d920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d930 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d940 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d950 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2d960 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d970 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2d980 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2d990 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d9a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2d9b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2d9c0 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  _WrapKey)(CK_SES
2d9d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2d9e0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2d9f0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2da00 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2da10 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79  DLE hWrappingKey
2da20 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2da30 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45  LE hKey, CK_BYTE
2da40 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
2da50 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2da60 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29  ulWrappedKeyLen)
2da70 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2da80 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2da90 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2daa0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2dab0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dac0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2dad0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2dae0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2daf0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2db00 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2db10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2db20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2db30 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2db40 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2db50 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2db60 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2db70 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2db80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2db90 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2dba0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2dbb0 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28  V, C_UnwrapKey)(
2dbc0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2dbd0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2dbe0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2dbf0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2dc00 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61  CT_HANDLE hUnwra
2dc10 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54  ppingKey, CK_BYT
2dc20 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
2dc30 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72  y, CK_ULONG ulWr
2dc40 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f  appedKeyLen, CK_
2dc50 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
2dc60 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2dc70 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
2dc80 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
2dc90 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
2dca0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2dcb0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2dcc0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2dcd0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2dce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2dcf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2dd00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2dd10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2dd20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2dd30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2dd40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2dd50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2dd60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2dd70 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2dd80 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2dd90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2dda0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ddb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ddc0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2ddd0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2dde0 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43  , C_DeriveKey)(C
2ddf0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2de00 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2de10 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2de20 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2de30 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65  T_HANDLE hBaseKe
2de40 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  y, CK_ATTRIBUTE_
2de50 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
2de60 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
2de70 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
2de80 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
2de90 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2dea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2deb0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2dec0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2ded0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2dee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2def0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2df00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2df10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2df20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2df30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2df40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2df50 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2df60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2df70 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2df80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2df90 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2dfa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2dfb0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2dfc0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2dfd0 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61  (CK_RV, C_SeedRa
2dfe0 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
2dff0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2e000 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2e010 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  eed, CK_ULONG ul
2e020 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  SeedLen) {..CACK
2e030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e040 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2e050 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2e060 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2e070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e080 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e090 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e0a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e0b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e0c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2e0d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e0e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e0f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e100 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2e110 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e120 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2e130 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2e140 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2e150 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e160 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
2e170 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f  erateRandom)(CK_
2e180 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e190 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2e1a0 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61  _PTR pRandomData
2e1b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e  , CK_ULONG ulRan
2e1c0 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  domLen) {..CACKE
2e1d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e1e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2e1f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2e200 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2e210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e220 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2e230 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2e240 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2e250 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2e260 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2e270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2e280 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2e290 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e2a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2e2b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e2c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2e2d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e2e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2e2f0 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
2e300 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
2e310 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e320 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
2e330 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53  nStatus)(CK_SESS
2e340 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2e350 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
2e360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2e370 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
2e380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e390 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e3a0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
2e3b0 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
2e3c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2e3d0 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
2e3e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e3f0 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
2e400 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
2e410 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
2e420 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
2e430 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65  ning */.}../* De
2e440 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
2e450 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
2e460 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e470 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29  _CancelFunction)
2e480 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2e490 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
2e4a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e4b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e4c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e4d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2e4e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e4f0 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
2e500 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2e510 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
2e520 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2e530 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2e540 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
2e550 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
2e560 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
2e570 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
2e580 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2e590 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
2e5a0 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28  etFunctionList)(
2e5b0 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
2e5c0 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74  _PTR_PTR ppFunct
2e5d0 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46  ionList) {..CK_F
2e5e0 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
2e5f0 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
2e600 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e610 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e620 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69  ;...if (ppFuncti
2e630 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  onList == NULL) 
2e640 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e650 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e660 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69  ppFunctionList i
2e670 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2e680 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2e690 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46  TS_BAD);..}...pF
2e6a0 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61  unctionList = ma
2e6b0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75  lloc(sizeof(*pFu
2e6c0 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09  nctionList));...
2e6d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
2e6e0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
2e6f0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
2e700 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
2e710 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
2e720 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
2e730 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
2e740 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
2e750 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
2e760 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46   8) & 0xff;...pF
2e770 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2e780 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e  nitialize = C_In
2e790 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  itialize;..pFunc
2e7a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61  tionList->C_Fina
2e7b0 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a  lize = C_Finaliz
2e7c0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2e7d0 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43  t->C_GetInfo = C
2e7e0 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  _GetInfo;..pFunc
2e7f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
2e800 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53  lotList = C_GetS
2e810 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  lotList;..pFunct
2e820 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
2e830 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c  otInfo = C_GetSl
2e840 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  otInfo;..pFuncti
2e850 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b  onList->C_GetTok
2e860 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f  enInfo = C_GetTo
2e870 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  kenInfo;..pFunct
2e880 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46  ionList->C_WaitF
2e890 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f  orSlotEvent = C_
2e8a0 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
2e8b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2e8c0 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
2e8d0 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68  List = C_GetMech
2e8e0 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e  anismList;..pFun
2e8f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2e900 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20  MechanismInfo = 
2e910 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
2e920 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
2e930 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20  st->C_InitToken 
2e940 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09  = C_InitToken;..
2e950 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2e960 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69  _InitPIN = C_Ini
2e970 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
2e980 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d  List->C_SetPIN =
2e990 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e   C_SetPIN;..pFun
2e9a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65  ctionList->C_Ope
2e9b0 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65  nSession = C_Ope
2e9c0 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  nSession;..pFunc
2e9d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
2e9e0 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f  eSession = C_Clo
2e9f0 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  seSession;..pFun
2ea00 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
2ea10 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20  seAllSessions = 
2ea20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
2ea30 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ns;..pFunctionLi
2ea40 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e  st->C_GetSession
2ea50 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73  Info = C_GetSess
2ea60 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ionInfo;..pFunct
2ea70 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70  ionList->C_GetOp
2ea80 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
2ea90 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
2eaa0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2eab0 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69  st->C_SetOperati
2eac0 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f  onState = C_SetO
2ead0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09  perationState;..
2eae0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2eaf0 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e  _Login = C_Login
2eb00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2eb10 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c  ->C_Logout = C_L
2eb20 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f  ogout;..pFunctio
2eb30 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f  nList->C_CreateO
2eb40 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65  bject = C_Create
2eb50 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
2eb60 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62  onList->C_CopyOb
2eb70 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a  ject = C_CopyObj
2eb80 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
2eb90 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62  ist->C_DestroyOb
2eba0 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79  ject = C_Destroy
2ebb0 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
2ebc0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a  onList->C_GetObj
2ebd0 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f  ectSize = C_GetO
2ebe0 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e  bjectSize;..pFun
2ebf0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2ec00 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
2ec10 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
2ec20 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
2ec30 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69  List->C_SetAttri
2ec40 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65  buteValue = C_Se
2ec50 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
2ec60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2ec70 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e  >C_FindObjectsIn
2ec80 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  it = C_FindObjec
2ec90 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  tsInit;..pFuncti
2eca0 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
2ecb0 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62  jects = C_FindOb
2ecc0 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f  jects;..pFunctio
2ecd0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
2ece0 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69  ectsFinal = C_Fi
2ecf0 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a  ndObjectsFinal;.
2ed00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ed10 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20  C_EncryptInit = 
2ed20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_EncryptInit;..
2ed30 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ed40 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63  _Encrypt = C_Enc
2ed50 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
2ed60 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55  List->C_EncryptU
2ed70 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70  pdate = C_Encryp
2ed80 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
2ed90 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
2eda0 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72  ptFinal = C_Encr
2edb0 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
2edc0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
2edd0 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72  yptInit = C_Decr
2ede0 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
2edf0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2ee00 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a  pt = C_Decrypt;.
2ee10 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ee20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20  C_DecryptUpdate 
2ee30 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
2ee40 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2ee50 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61  t->C_DecryptFina
2ee60 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  l = C_DecryptFin
2ee70 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2ee80 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74  st->C_DigestInit
2ee90 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b   = C_DigestInit;
2eea0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2eeb0 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69  >C_Digest = C_Di
2eec0 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gest;..pFunction
2eed0 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70  List->C_DigestUp
2eee0 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55  date = C_DigestU
2eef0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2ef00 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b  nList->C_DigestK
2ef10 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79  ey = C_DigestKey
2ef20 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2ef30 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20  ->C_DigestFinal 
2ef40 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b  = C_DigestFinal;
2ef50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2ef60 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f  >C_SignInit = C_
2ef70 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63  SignInit;..pFunc
2ef80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2ef90 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e   = C_Sign;..pFun
2efa0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2efb0 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  nUpdate = C_Sign
2efc0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2efd0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69  onList->C_SignFi
2efe0 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  nal = C_SignFina
2eff0 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
2f000 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
2f010 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63  Init = C_SignRec
2f020 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
2f030 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2f040 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e  Recover = C_Sign
2f050 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
2f060 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2f070 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  yInit = C_Verify
2f080 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2f090 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d  List->C_Verify =
2f0a0 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e   C_Verify;..pFun
2f0b0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
2f0c0 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65  ifyUpdate = C_Ve
2f0d0 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75  rifyUpdate;..pFu
2f0e0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2f0f0 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65  rifyFinal = C_Ve
2f100 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  rifyFinal;..pFun
2f110 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
2f120 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ifyRecoverInit =
2f130 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
2f140 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2f150 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65  List->C_VerifyRe
2f160 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79  cover = C_Verify
2f170 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
2f180 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
2f190 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  tEncryptUpdate =
2f1a0 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
2f1b0 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2f1c0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
2f1d0 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  tDigestUpdate = 
2f1e0 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
2f1f0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2f200 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63  nList->C_SignEnc
2f210 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53  ryptUpdate = C_S
2f220 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
2f230 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f240 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  ->C_DecryptVerif
2f250 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  yUpdate = C_Decr
2f260 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b  yptVerifyUpdate;
2f270 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f280 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d  >C_GenerateKey =
2f290 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a   C_GenerateKey;.
2f2a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f2b0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
2f2c0 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  r = C_GenerateKe
2f2d0 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f  yPair;..pFunctio
2f2e0 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79  nList->C_WrapKey
2f2f0 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70   = C_WrapKey;..p
2f300 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f310 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e  UnwrapKey = C_Un
2f320 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74  wrapKey;..pFunct
2f330 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76  ionList->C_Deriv
2f340 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b  eKey = C_DeriveK
2f350 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
2f360 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d  st->C_SeedRandom
2f370 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b   = C_SeedRandom;
2f380 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f390 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f  >C_GenerateRando
2f3a0 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61  m = C_GenerateRa
2f3b0 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
2f3c0 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
2f3d0 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65  ionStatus = C_Ge
2f3e0 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b  tFunctionStatus;
2f3f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f400 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f  >C_CancelFunctio
2f410 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  n = C_CancelFunc
2f420 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tion;..pFunction
2f430 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
2f440 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46  ionList = C_GetF
2f450 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a  unctionList;...*
2f460 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
2f470 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
2f480 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f490 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2f4a0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2f4b0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2f4c0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a           (CKR_OK);.}..