Hex Artifact Content

Artifact d345cec881717a7c5dc9772e69983dbd2bd1f517:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 23 20 20 20 20 64  time = 0;.#    d
1760: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1770: 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 7b 20 69  UG_PRINTTIME { i
1780: 66 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  f (cackey_debug_
1790: 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29  start_time == 0)
17a0: 20 7b 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f   { cackey_debug_
17b0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17c0: 65 28 4e 55 4c 4c 29 3b 20 7d 3b 20 66 70 72 69  e(NULL); }; fpri
17d0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
17e0: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 22  _fd(), "[%lu]: "
17f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1800: 29 20 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20  ) (time(NULL) - 
1810: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61  cackey_debug_sta
1820: 72 74 5f 74 69 6d 65 29 29 3b 20 7d 0a 23 20 20  rt_time)); }.#  
1830: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
1840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1850: 49 4e 54 54 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20  INTTIME /**/.#  
1860: 65 6e 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65  endif..#  define
1870: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1880: 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 43 41 43  INTF(x...) { CAC
1890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
18a0: 49 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63  IME; fprintf(cac
18b0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
18c0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66  "%s():%i: ", __f
18d0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
18e0: 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ; fprintf(cackey
18f0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 78 29 3b  _debug_fd(), x);
1900: 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f   fprintf(cackey_
1910: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22  debug_fd(), "\n"
1920: 29 3b 20 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ); fflush(cackey
1930: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a  _debug_fd()); }.
1940: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1960: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67  f, x, y) { unsig
1970: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46  ned char *TMPBUF
1980: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ; unsigned long 
1990: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75  idx; TMPBUF = (u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
19b0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55  (x); CACKEY_DEBU
19c0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72  G_PRINTTIME; fpr
19d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
19e0: 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69  g_fd(), "%s():%i
19f0: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1a00: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f  {%02x", __func__
1a10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23  , __LINE__, f, #
1a20: 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1a30: 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 5b 30  g) (y), TMPBUF[0
1a40: 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d 20 31  ]); for (idx = 1
1a50: 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 64 78  ; idx < (y); idx
1a60: 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 63 61  ++) { fprintf(ca
1a70: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1a80: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1a90: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69  F[idx]); }; fpri
1aa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1ab0: 5f 66 64 28 29 2c 20 22 7d 29 5c 6e 22 29 3b 20  _fd(), "})\n"); 
1ac0: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1ad0: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1ae0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
1af0: 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b 20  BUG_PERROR(x) { 
1b00: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1b10: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1b20: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f  :%i: ", __func__
1b30: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 43 41 43  , __LINE__); CAC
1b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
1b50: 49 4d 45 3b 20 70 65 72 72 6f 72 28 78 29 3b 20  IME; perror(x); 
1b60: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1b70: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1b80: 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b  define free(x) {
1b90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1ba0: 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28  INTF("FREE(%p) (
1bb0: 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78  %s)", (void *) x
1bc0: 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20  , #x); free(x); 
1bd0: 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  }..static FILE *
1be0: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1bf0: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
1c00: 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b  FILE *fd = NULL;
1c10: 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b  ..char *logfile;
1c20: 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c  ...if (fd != NUL
1c30: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64  L) {...return(fd
1c40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c  );..}.../*.. * L
1c50: 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69  og to stderr ini
1c60: 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e  tially so we can
1c70: 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77   use debugging w
1c80: 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66  ithin.. * this f
1c90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
1ca0: 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20  getting into an 
1cb0: 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20  infinite loop.. 
1cc0: 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b  */..fd = stderr;
1cd0: 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74  ...logfile = get
1ce0: 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55  env("CACKEY_DEBU
1cf0: 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66  G_LOGFILE");..if
1d00: 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c   (logfile != NUL
1d10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1d20: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d30: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
1d40: 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67  riable: %s", log
1d50: 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c  file);....logfil
1d60: 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69  e = strchr(logfi
1d70: 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28  le, '=');...if (
1d80: 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  logfile == NULL)
1d90: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20   {....logfile = 
1da0: 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1db0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a  EBUG_LOGFILE");.
1dc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f  ..} else {....lo
1dd0: 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  gfile++;...}..}.
1de0: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1df0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e10: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20  Found log file: 
1e20: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e30: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67  ..fd = fopen(log
1e40: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a  file, "a");..}..
1e50: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29  .if (fd == NULL)
1e60: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72   {...fd = stderr
1e70: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d  ;..}...if (fd ==
1e80: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43   stderr) {...CAC
1e90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65  ("Returning stde
1eb0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  rr");..} else {.
1ec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ee0: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66   %p", (void *) f
1ef0: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  d);..}...return(
1f00: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  fd);.}..static v
1f10: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
1f20: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
1f30: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
1f40: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
1f50: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
1f60: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
1f70: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
1f80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f90: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69  PRINTTIME;..fpri
1fa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1fb0: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a  _fd(), "%s():%i:
1fc0: 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b   ", func, line);
1fd0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1fe0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 4d 41  _debug_fd(), "MA
1ff0: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
2000: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
2010: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2020: 29 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73  ), "\n");..fflus
2030: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
2040: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  d());...return(r
2050: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
2060: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
2070: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
2080: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
2090: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
20a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
20b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
20c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
20d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73  = realloc(ptr, s
20e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  ize);...if (retv
20f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 43  al != ptr) {...C
2100: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2110: 54 54 49 4d 45 3b 0a 09 09 66 70 72 69 6e 74 66  TTIME;...fprintf
2120: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2130: 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  (), "%s():%i: ",
2140: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09   func, line);...
2150: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2160: 65 62 75 67 5f 66 64 28 29 2c 20 22 52 45 41 4c  ebug_fd(), "REAL
2170: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
2180: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
2190: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
21a0: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b  bug_fd(), "\n");
21b0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
21c0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
21d0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
21e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
21f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2200: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2210: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2220: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2230: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2240: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2250: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2260: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2280: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2290: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
22a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
22b0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
22c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
22d0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
22e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f0: 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74  INTTIME;..fprint
2300: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
2310: 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22  d(), "%s():%i: "
2320: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09  , func, line);..
2330: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2340: 65 62 75 67 5f 66 64 28 29 2c 20 22 53 54 52 44  ebug_fd(), "STRD
2350: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
2360: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72  ", retval);..fpr
2370: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2380: 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09  g_fd(), "\n");..
2390: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
23a0: 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74  bug_fd());...ret
23b0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
23c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
23e0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
2400: 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61  g) {..switch (ta
2410: 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49  g) {...case GSCI
2420: 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09  S_TAG_CARDID:...
2430: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2440: 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63  AG_CARDID");...c
2450: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43  ase GSCIS_TAG_CC
2460: 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  C_VER:....return
2470: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  ("GSCIS_TAG_CCC_
2480: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  VER");...case GS
2490: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a  CIS_TAG_CCG_VER:
24a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24b0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b  S_TAG_CCG_VER");
24c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
24d0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65  G_CARDURL:....re
24e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24f0: 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73  CARDURL");...cas
2500: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
2510: 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  15:....return("G
2520: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22  SCIS_TAG_PKCS15"
2530: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2540: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
2550: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  EL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54  SCIS_TAG_REG_DAT
2570: 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73  A_MODEL");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
2590: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
25a0: 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  ("GSCIS_TAG_ACR_
25b0: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TABLE");...case 
25c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25d0: 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  PDU:....return("
25e0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25f0: 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  PDU");...case GS
2600: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2610: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
2630: 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20  CTION");...case 
2640: 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09  GSCIS_TAG_CT:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2660: 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_CT");...case 
2670: 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09  GSCIS_TAG_ST:...
2680: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2690: 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_ST");...case 
26a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
26b0: 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  C:....return("GS
26c0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22  CIS_TAG_NEXTCCC"
26d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
26e0: 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_FNAME:....re
26f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2700: 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  FNAME");...case 
2710: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a  GSCIS_TAG_MNAME:
2720: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2730: 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09  S_TAG_MNAME");..
2740: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2750: 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  LNAME:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  ("GSCIS_TAG_LNAM
2770: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2780: 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09  S_TAG_SUFFIX:...
2790: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
27a0: 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63  AG_SUFFIX");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ase GSCIS_TAG_GO
27c0: 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65  VT_AGENCY:....re
27d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
27e0: 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09  GOVT_AGENCY");..
27f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2800: 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72  BUREAU:....retur
2810: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
2820: 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EAU");...case GS
2830: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2840: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2850: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2860: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
2880: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2890: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
28a0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
28b0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09  CIS_TAG_TITLE:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63  TAG_TITLE");...c
28e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
28f0: 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72  ILDING:....retur
2900: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49  n("GSCIS_TAG_BUI
2910: 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20  LDING");...case 
2920: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2930: 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72  _ADDR1:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2950: 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63  ICE_ADDR1");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2970: 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72  FICE_ADDR2:....r
2980: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2990: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b  _OFFICE_ADDR2");
29a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29b0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09  G_OFFICE_CITY:..
29c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
29d0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22  TAG_OFFICE_CITY"
29e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
29f0: 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45  TAG_OFFICE_STATE
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a10: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a20: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2a30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a  CIS_TAG_OFFICE_Z
2a40: 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IP:....return("G
2a50: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2a60: 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ZIP");...case GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72  OUNTRY:....retur
2a90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2aa0: 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09  ICE_COUNTRY");..
2ab0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ac0: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09  OFFICE_PHONE:...
2ad0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22  AG_OFFICE_PHONE"
2af0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b00: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b10: 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  _EXT:....return(
2b20: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b30: 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09  E_PHONE_EXT");..
2b40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b50: 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72  OFFICE_FAX:....r
2b60: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b70: 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09  _OFFICE_FAX");..
2b80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b90: 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09  OFFICE_EMAIL:...
2ba0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2bb0: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22  AG_OFFICE_EMAIL"
2bc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bd0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a  TAG_OFFICE_ROOM:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2bf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2c00: 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  M");...case GSCI
2c10: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45  S_TAG_NONGOV_AGE
2c20: 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NCY:....return("
2c30: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2c40: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73  _AGENCY");...cas
2c50: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  e GSCIS_TAG_SSN_
2c60: 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72  DESIGNATOR:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c80: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22  _SSN_DESIGNATOR"
2c90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ca0: 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75  TAG_SSN:....retu
2cb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53  rn("GSCIS_TAG_SS
2cc0: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  N");...case GSCI
2cd0: 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65  S_TAG_DOB:....re
2ce0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2cf0: 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DOB");...case GS
2d00: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a  CIS_TAG_GENDER:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09  _TAG_GENDER");..
2d30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d40: 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  USERID:....retur
2d50: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45  n("GSCIS_TAG_USE
2d60: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2d70: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a  CIS_TAG_DOMAIN:.
2d80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d90: 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09  _TAG_DOMAIN");..
2da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2db0: 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74  PASSWORD:....ret
2dc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50  urn("GSCIS_TAG_P
2dd0: 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73  ASSWORD");...cas
2de0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2df0: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2e00: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45  "GSCIS_TAG_ISSUE
2e10: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2e20: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09  CIS_TAG_SERNO:..
2e30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2e40: 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63  TAG_SERNO");...c
2e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2e60: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
2e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2e80: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58  ase GSCIS_TAG_EX
2ea0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  PIRE_DATE:....re
2eb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2ec0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65  CARD_TYPE:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f00: 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63  CARD_TYPE");...c
2f10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ase GSCIS_TAG_SE
2f20: 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09  CURITY_CODE:....
2f30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f40: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22  G_SECURITY_CODE"
2f50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f60: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a  TAG_CARDID_AID:.
2f70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2f80: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22  _TAG_CARDID_AID"
2f90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fa0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fc0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
2fd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2fe0: 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45  S_TAG_CERT_ISSUE
2ff0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
3000: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  ("GSCIS_TAG_CERT
3010: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
3020: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3030: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45  CERT_EXPIRE_DATE
3040: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3050: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49  IS_TAG_CERT_EXPI
3060: 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09  RE_DATE");..}...
3070: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
3080: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
3090: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
30a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
30b0: 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20  ERR_TO_STR(LONG 
30c0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74  retcode) {..swit
30d0: 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09  ch (retcode) {..
30e0: 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55  .case SCARD_S_SU
30f0: 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CCESS:....return
3100: 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  ("SCARD_S_SUCCES
3110: 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  S");...case SCAR
3120: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  D_E_CANCELLED:..
3130: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3140: 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09  E_CANCELLED");..
3150: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3160: 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72  NT_DISPOSE:....r
3170: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3180: 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09  ANT_DISPOSE");..
3190: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
31a0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
31b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
31c0: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
31d0: 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63  NT_BUFFER");...c
31e0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
31f0: 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75  LID_ATR:....retu
3200: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
3210: 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73  LID_ATR");...cas
3220: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
3230: 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74  D_HANDLE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3250: 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09  ALID_HANDLE");..
3260: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3270: 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a  VALID_PARAMETER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3290: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41  D_E_INVALID_PARA
32a0: 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20  METER");...case 
32b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
32c0: 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72  TARGET:....retur
32d0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
32e0: 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63  ID_TARGET");...c
32f0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3300: 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65  LID_VALUE:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3320: 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09  VALID_VALUE");..
3330: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3340: 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75  _MEMORY:....retu
3350: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  rn("SCARD_E_NO_M
3360: 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20  EMORY");...case 
3370: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3380: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3390: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
33a0: 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  WN_READER");...c
33b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45  ase SCARD_E_TIME
33c0: 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OUT:....return("
33d0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22  SCARD_E_TIMEOUT"
33e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33f0: 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  E_SHARING_VIOLAT
3400: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
3410: 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f  SCARD_E_SHARING_
3420: 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63  VIOLATION");...c
3430: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  ase SCARD_E_NO_S
3440: 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74  MARTCARD:....ret
3450: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
3460: 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63  SMARTCARD");...c
3470: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3480: 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  OWN_CARD:....ret
3490: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
34a0: 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63  NOWN_CARD");...c
34b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ase SCARD_E_PROT
34c0: 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72  O_MISMATCH:....r
34d0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50  eturn("SCARD_E_P
34e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b  ROTO_MISMATCH");
34f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3500: 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65  NOT_READY:....re
3510: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3520: 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73  T_READY");...cas
3530: 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  e SCARD_E_SYSTEM
3540: 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72  _CANCELLED:....r
3550: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3560: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22  YSTEM_CANCELLED"
3570: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3580: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35a0: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
35b0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
35c0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41  ARD_E_READER_UNA
35d0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74  VAILABLE:....ret
35e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
35f0: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22  DER_UNAVAILABLE"
3600: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3610: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
3620: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3630: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54  CARD_W_UNSUPPORT
3640: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
3650: 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50  e SCARD_W_UNRESP
3660: 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09  ONSIVE_CARD:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3680: 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52  UNRESPONSIVE_CAR
3690: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
36a0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
36b0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
36c0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
36d0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
36e0: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
36f0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3700: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
3710: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3720: 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44  D_W_REMOVED_CARD
3730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3740: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52  RD_W_REMOVED_CAR
3750: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3760: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
3770: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  L:....return("SC
3780: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3790: 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ALL");...case SC
37a0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53  ARD_E_READER_UNS
37b0: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
37c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
37d0: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  DER_UNSUPPORTED"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37f0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3800: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3810: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45  CARD_E_DUPLICATE
3820: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
3830: 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  e SCARD_E_CARD_U
3840: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
3850: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3860: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  ARD_UNSUPPORTED"
3870: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3880: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09  E_NO_SERVICE:...
3890: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38a0: 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09  _NO_SERVICE");..
38b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45  .case SCARD_E_SE
38c0: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09  RVICE_STOPPED:..
38d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38e0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
38f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3900: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
3910: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75  FEATURE:....retu
3920: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55  rn("SCARD_E_UNSU
3930: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22  PPORTED_FEATURE"
3940: 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f  );.#ifdef SCARD_
3950: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a  W_INSERTED_CARD.
3960: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49  ..case SCARD_W_I
3970: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09  NSERTED_CARD:...
3980: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
3990: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29  _INSERTED_CARD")
39a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
39b0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
39c0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63  RS_AVAILABLE...c
39d0: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  ase SCARD_E_NO_R
39e0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
39f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a00: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3a10: 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e  AVAILABLE");.#en
3a20: 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  dif..}...return(
3a30: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
3a40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3a50: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3a60: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
3a70: 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29  (uint16_t objid)
3a80: 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69   {..switch (obji
3a90: 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30  d) {...case 0x20
3aa0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3ab0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3ac0: 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09  GENERALINFO");..
3ad0: 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09  .case 0x2100:...
3ae0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3af0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b00: 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  SONALINFO");...c
3b10: 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72  ase 0x3000:....r
3b20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3b30: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3b40: 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20  NTROL");...case 
3b50: 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x4000:....retur
3b60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b70: 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63  JID_LOGIN");...c
3b80: 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72  ase 0x5000:....r
3b90: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ba0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
3bb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30  ");...case 0x600
3bc0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3bd0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
3be0: 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63  IOMETRICS");...c
3bf0: 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72  ase 0x7000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
3c20: 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65  IGCERT");...case
3c30: 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75   0x0200:....retu
3c40: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3c50: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22  BJID_CAC_PERSON"
3c60: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32  );...case 0x0202
3c70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3c80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3c90: 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  C_BENEFITS");...
3ca0: 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09  case 0x0203:....
3cb0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cc0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
3cd0: 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  ERBENEFITS");...
3ce0: 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09  case 0x0201:....
3cf0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d00: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d10: 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65  SONNEL");...case
3d20: 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75   0x02FE:....retu
3d30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3d40: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
3d50: 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e  ");..}....return
3d60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
3d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3d80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
3d90: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
3da0: 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74  STR(uint8_t appt
3db0: 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  ype) {..switch (
3dc0: 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73  apptype) {...cas
3dd0: 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72  e 0x00:....retur
3de0: 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73  n("NONE");...cas
3df0: 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72  e 0x01:....retur
3e00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e10: 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63  P_GENERIC");...c
3e20: 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74  ase 0x02:....ret
3e30: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e40: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3e50: 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72  e 0x03:....retur
3e60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e70: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3e90: 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09  ;...case 0x04:..
3ea0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3eb0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3ec0: 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09  ..case 0x05:....
3ed0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ee0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3ef0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3f00: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
3f10: 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  06:....return("C
3f20: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f30: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
3f40: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3f50: 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e   0x07:....return
3f60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3f70: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
3f80: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3f90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3fa0: 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  KI");..}...retur
3fb0: 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a  n("INVALID");.}.
3fc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3fd0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3fe0: 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f  _FUNC_ATTRIBUTE_
3ff0: 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42  TO_STR(CK_ATTRIB
4000: 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b  UTE_TYPE attr) {
4010: 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29 20  ..switch (attr) 
4020: 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  {...case CKA_CLA
4030: 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SS:....return("C
4040: 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61  KA_CLASS");...ca
4050: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
4060: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b  .return("CKA_TOK
4070: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
4080: 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74  _PRIVATE:....ret
4090: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45  urn("CKA_PRIVATE
40a0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c  ");...case CKA_L
40b0: 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABEL:....return(
40c0: 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09  "CKA_LABEL");...
40d0: 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41  case CKA_APPLICA
40e0: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  TION:....return(
40f0: 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e  "CKA_APPLICATION
4100: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4110: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
4120: 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09  "CKA_VALUE");...
4130: 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f  case CKA_OBJECT_
4140: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
4150: 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a  KA_OBJECT_ID");.
4160: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
4170: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
4180: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54  return("CKA_CERT
4190: 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a  IFICATE_TYPE");.
41a0: 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
41b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
41c0: 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  A_ISSUER");...ca
41d0: 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  se CKA_SERIAL_NU
41e0: 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  MBER:....return(
41f0: 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42  "CKA_SERIAL_NUMB
4200: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4210: 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72  _AC_ISSUER:....r
4220: 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53  eturn("CKA_AC_IS
4230: 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  SUER");...case C
4240: 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74  KA_OWNER:....ret
4250: 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29  urn("CKA_OWNER")
4260: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54  ;...case CKA_ATT
4270: 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75  R_TYPES:....retu
4280: 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50  rn("CKA_ATTR_TYP
4290: 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ES");...case CKA
42a0: 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74  _TRUSTED:....ret
42b0: 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44  urn("CKA_TRUSTED
42c0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b  ");...case CKA_K
42d0: 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  EY_TYPE:....retu
42e0: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45  rn("CKA_KEY_TYPE
42f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4300: 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72  UBJECT:....retur
4310: 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29  n("CKA_SUBJECT")
4320: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ;...case CKA_ID:
4330: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4340: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ID");...case CKA
4350: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72  _SENSITIVE:....r
4360: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49  eturn("CKA_SENSI
4370: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
4380: 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72  KA_ENCRYPT:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59  eturn("CKA_ENCRY
43a0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
43b0: 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _DECRYPT:....ret
43c0: 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54  urn("CKA_DECRYPT
43d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57  ");...case CKA_W
43e0: 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  RAP:....return("
43f0: 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61  CKA_WRAP");...ca
4400: 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09  se CKA_UNWRAP:..
4410: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e  ..return("CKA_UN
4420: 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43  WRAP");...case C
4430: 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75  KA_SIGN:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a  rn("CKA_SIGN");.
4450: 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f  ..case CKA_SIGN_
4460: 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75  RECOVER:....retu
4470: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43  rn("CKA_SIGN_REC
4480: 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  OVER");...case C
4490: 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65  KA_VERIFY:....re
44a0: 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59  turn("CKA_VERIFY
44b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
44c0: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09  ERIFY_RECOVER:..
44d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
44e0: 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a  RIFY_RECOVER");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56  ..case CKA_DERIV
4500: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4510: 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61  A_DERIVE");...ca
4520: 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54  se CKA_START_DAT
4530: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4540: 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a  A_START_DATE");.
4550: 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44  ..case CKA_END_D
4560: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4570: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a  CKA_END_DATE");.
4580: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
4590: 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  US:....return("C
45a0: 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09  KA_MODULUS");...
45b0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
45c0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
45d0: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49  ("CKA_MODULUS_BI
45e0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
45f0: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4600: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4610: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4630: 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a  RIVATE_EXPONENT:
4640: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4650: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54  PRIVATE_EXPONENT
4660: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4670: 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72  RIME_1:....retur
4680: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29  n("CKA_PRIME_1")
4690: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
46a0: 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_2:....return(
46b0: 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a  "CKA_PRIME_2");.
46c0: 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e  ..case CKA_EXPON
46d0: 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e  ENT_1:....return
46e0: 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  ("CKA_EXPONENT_1
46f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4700: 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65  XPONENT_2:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4720: 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_2");...case C
4730: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a  KA_COEFFICIENT:.
4740: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4750: 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09  OEFFICIENT");...
4760: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a  case CKA_PRIME:.
4770: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4780: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
4790: 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09  KA_SUBPRIME:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50  return("CKA_SUBP
47b0: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
47c0: 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75  KA_BASE:....retu
47d0: 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a  rn("CKA_BASE");.
47e0: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
47f0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4800: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  ("CKA_PRIME_BITS
4810: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4820: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09  UB_PRIME_BITS:..
4830: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4840: 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a  B_PRIME_BITS");.
4850: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
4860: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4870: 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  ("CKA_VALUE_BITS
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4890: 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74  ALUE_LEN:....ret
48a0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c  urn("CKA_VALUE_L
48b0: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
48c0: 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09  _EXTRACTABLE:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54  .return("CKA_EXT
48e0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
48f0: 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09  se CKA_LOCAL:...
4900: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43  .return("CKA_LOC
4910: 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AL");...case CKA
4920: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4930: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4940: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4950: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43  ABLE");...case C
4960: 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54  KA_ALWAYS_SENSIT
4970: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
4980: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49  CKA_ALWAYS_SENSI
4990: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
49a0: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
49b0: 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28  NISM:....return(
49c0: 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43  "CKA_KEY_GEN_MEC
49d0: 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65  HANISM");...case
49e0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
49f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4a00: 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09  MODIFIABLE");...
4a10: 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50  case CKA_ECDSA_P
4a20: 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e  ARAMS:....return
4a30: 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41  ("CKA_ECDSA_PARA
4a40: 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  MS");...case CKA
4a50: 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65  _EC_POINT:....re
4a60: 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49  turn("CKA_EC_POI
4a70: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4a80: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a  _SECONDARY_AUTH:
4a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4aa0: 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29  SECONDARY_AUTH")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54  ;...case CKA_AUT
4ac0: 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09  H_PIN_FLAGS:....
4ad0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48  return("CKA_AUTH
4ae0: 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09  _PIN_FLAGS");...
4af0: 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54  case CKA_HW_FEAT
4b00: 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  URE_TYPE:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54  urn("CKA_HW_FEAT
4b20: 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  URE_TYPE");...ca
4b30: 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  se CKA_RESET_ON_
4b40: 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  INIT:....return(
4b50: 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e  "CKA_RESET_ON_IN
4b60: 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  IT");...case CKA
4b70: 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72  _HAS_RESET:....r
4b80: 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52  eturn("CKA_HAS_R
4b90: 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43  ESET");...case C
4ba0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45  KA_VENDOR_DEFINE
4bb0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4bc0: 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44  A_VENDOR_DEFINED
4bd0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
4be0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23  "UNKNOWN");.}..#
4bf0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
4c00: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
4c10: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
4c20: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4c30: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
4c40: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
4c50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
4c60: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
4c70: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
4c80: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
4c90: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
4ca0: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
4cb0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
4cc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cd0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
4ce0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
4cf0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
4d00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4d10: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
4d20: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4d30: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
4d40: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
4d50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4d60: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
4d70: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4d80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
4d90: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4da0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4db0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4dc0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
4dd0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4de0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4df0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
4e10: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e20: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e30: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e40: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
4e90: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4ea0: 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a  ISABLED".#endif.
4eb0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4ec0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  csc_identity {..
4ed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70  unsigned char ap
4ee0: 70 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36  plet[7];..uint16
4ef0: 5f 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f  _t file;...size_
4f00: 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
4f10: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  n;..unsigned cha
4f20: 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
4f30: 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a  ..ssize_t keysiz
4f40: 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  e;.};..struct ca
4f50: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a  ckey_identity {.
4f60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4f70: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
4f80: 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43  sc_identity;...C
4f90: 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74  K_ATTRIBUTE *att
4fa0: 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f  ributes;..CK_ULO
4fb0: 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f  NG attributes_co
4fc0: 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  unt;.};..struct 
4fd0: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b  cackey_session {
4fe0: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09  ..int active;...
4ff0: 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
5000: 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74  D;...CK_STATE st
5010: 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66  ate;..CK_FLAGS f
5020: 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  lags;..CK_ULONG 
5030: 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09  ulDeviceError;..
5040: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
5050: 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f  lication;..CK_NO
5060: 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73  TIFY Notify;...s
5070: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5080: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
5090: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
50a0: 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  g identities_cou
50b0: 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68  nt;...int search
50c0: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54  _active;..CK_ATT
50d0: 52 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63  RIBUTE_PTR searc
50e0: 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f  h_query;..CK_ULO
50f0: 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f  NG search_query_
5100: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64  count;..unsigned
5110: 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72   long search_cur
5120: 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e  r_id;...int sign
5130: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
5140: 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e  HANISM_TYPE sign
5150: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f  _mechanism;..CK_
5160: 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75  BYTE_PTR sign_bu
5170: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
5180: 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09  g sign_buflen;..
5190: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
51a0: 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72  gn_bufused;..str
51b0: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
51c0: 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69  ity *sign_identi
51d0: 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70  ty;...int decryp
51e0: 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45  t_active;..CK_ME
51f0: 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63  CHANISM_TYPE dec
5200: 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a  rypt_mechanism;.
5210: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63  .CK_VOID_PTR dec
5220: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a  rypt_mech_parm;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70  .CK_ULONG decryp
5240: 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a  t_mech_parmlen;.
5250: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
5260: 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74  dentity *decrypt
5270: 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73  _identity;.};..s
5280: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5290: 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  t {..int active;
52a0: 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a  ..int internal;.
52b0: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
52c0: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
52d0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
52e0: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
52f0: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
5300: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
5310: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
5320: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a  n_need_hw_lock;.
5330: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
5340: 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b  ;...CK_FLAGS tok
5350: 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69  en_flags;...unsi
5360: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
5370: 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  ;...DWORD protoc
5380: 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69  ol;...unsigned i
5390: 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f  nt cached_certs_
53a0: 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63  count;..struct c
53b0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
53c0: 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74  ity *cached_cert
53d0: 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65  s;.};..typedef e
53e0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
53f0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20  V_APP_GENERIC = 
5400: 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x01,..CACKEY_TL
5410: 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20  V_APP_SKI     = 
5420: 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x02,..CACKEY_TL
5430: 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20  V_APP_PKI     = 
5440: 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  0x04.} cackey_tl
5450: 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65  v_apptype;..type
5460: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
5470: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e  EY_TLV_OBJID_GEN
5480: 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d  ERALINFO       =
5490: 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x2000,..CACKEY
54a0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45  _TLV_OBJID_PROPE
54b0: 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30  RSONALINFO   = 0
54c0: 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2100,..CACKEY_T
54d0: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43  LV_OBJID_ACCESSC
54e0: 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33  ONTROL     = 0x3
54f0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5500: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20  _OBJID_LOGIN    
5510: 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30           = 0x400
5520: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5530: 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20  BJID_CARDINFO   
5540: 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c         = 0x5000,
5550: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5560: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20  ID_BIOMETRICS   
5570: 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09       = 0x6000,..
5580: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5590: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20  _DIGITALSIGCERT 
55a0: 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41     = 0x7000,..CA
55b0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
55c0: 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20  AC_PERSON       
55d0: 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b   = 0x0200,..CACK
55e0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
55f0: 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d  _BENEFITS      =
5600: 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59   0x0202,..CACKEY
5610: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
5620: 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30  THERBENEFITS = 0
5630: 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54  x0203,..CACKEY_T
5640: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
5650: 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30  SONNEL     = 0x0
5660: 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  201,..CACKEY_TLV
5670: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
5680: 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46  RT       = 0x02F
5690: 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f  E.} cackey_tlv_o
56a0: 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65  bjectid;..typede
56b0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
56c0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
56d0: 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41  SENT    = 1,..CA
56e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c              = 0,
5700: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5710: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20  GENERIC         
5720: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -1,..CACKEY_PC
5730: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20  SC_E_BADPIN     
5740: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b       = -2,..CACK
5750: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
5760: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a            = -3,.
5770: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  .CACKEY_PCSC_E_N
5780: 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d  EEDLOGIN       =
5790: 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -4,..CACKEY_PCS
57a0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20  C_E_TOKENABSENT 
57b0: 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45      = -6,..CACKE
57c0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20  Y_PCSC_E_RETRY  
57d0: 20 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20           = -7.} 
57e0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72  cackey_ret;..str
57f0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
5800: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e  ardurl {..unsign
5810: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72  ed char        r
5820: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74  id[5];..cackey_t
5830: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70  lv_apptype   app
5840: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  type;..cackey_tl
5850: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65  v_objectid  obje
5860: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  ctid;..cackey_tl
5870: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69  v_objectid  appi
5880: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  d;..unsigned cha
5890: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a  r        pinid;.
58a0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
58b0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74  y_tlv_entity;.st
58c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
58d0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f  entity {..uint8_
58e0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  t tag;..size_t l
58f0: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ength;...union {
5900: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a  ...void *value;.
5910: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5920: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c  tlv_cardurl *val
5930: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69  ue_cardurl;...ui
5940: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65  nt8_t value_byte
5950: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63  ;..};...struct c
5960: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
5970: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20   *_next;.};../* 
5980: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61  CACKEY Global Ha
5990: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
59a0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67  void *cackey_big
59b0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  lock = NULL;.sta
59c0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
59d0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79  y_session cackey
59e0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a  _sessions[128];.
59f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5a00: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79  ckey_slot cackey
5a10: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61  _slots[128];.sta
5a20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69  tic int cackey_i
5a30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
5a40: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5a50: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
5a60: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   0;.CK_C_INITIAL
5a70: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f  IZE_ARGS cackey_
5a80: 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61  args;../** Extra
5a90: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f   certificates to
5aa0: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65   include in toke
5ab0: 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63  n **/.struct cac
5ac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
5ad0: 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20  y extra_certs[] 
5ae0: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61  = {.#include "ca
5af0: 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72  ckey_builtin_cer
5b00: 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53  ts.h".};../* PCS
5b10: 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73  C Global Handles
5b20: 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41   */.static LPSCA
5b30: 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79  RDCONTEXT cackey
5b40: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
5b50: 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73  ULL;..static uns
5b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65  igned long cacke
5b70: 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69  y_getversion(voi
5b80: 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73  d) {..static uns
5b90: 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61  igned long retva
5ba0: 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e  l = 255;..unsign
5bb0: 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20  ed long major = 
5bc0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  0;..unsigned lon
5bd0: 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68  g minor = 0;..ch
5be0: 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20  ar *major_str = 
5bf0: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e  NULL;..char *min
5c00: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a  or_str = NULL;..
5c10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5c20: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
5c30: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d  ...if (retval !=
5c40: 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   255) {...CACKEY
5c50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
5c60: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28  eturning 0x%lx (
5c70: 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61  cached).", retva
5c80: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
5c90: 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  tval);..}...retv
5ca0: 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  al = 0;..#ifdef 
5cb0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
5cc0: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74          major_st
5cd0: 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53  r = PACKAGE_VERS
5ce0: 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  ION;..if (major_
5cf0: 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20  str) {..        
5d00: 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28  major = strtoul(
5d10: 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f  major_str, &mino
5d20: 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69  r_str, 10);....i
5d30: 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a  f (minor_str) {.
5d40: 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f  ...minor = strto
5d50: 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31  ul(minor_str + 1
5d60: 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d  , NULL, 10);...}
5d70: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28  ..}...retval = (
5d80: 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28  major << 16) | (
5d90: 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e  minor << 8);.#en
5da0: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
5db0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
5dc0: 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74  ning 0x%lx", ret
5dd0: 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
5de0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43  etval);.}../* PC
5df0: 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63  /SC Related Func
5e00: 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53  tions */./*. * S
5e10: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76  YNPOSIS. *     v
5e20: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
5e30: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
5e40: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5e50: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5e60: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5e70: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
5e80: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
5e90: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
5ea0: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66  on disconnects f
5eb0: 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20  rom all cards.. 
5ec0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
5ed0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
5ee0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
5ef0: 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  id) {..uint32_t 
5f00: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
5f10: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
5f20: 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64  ed.");...for (id
5f30: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
5f40: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
5f50: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
5f60: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
5f70: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
5f80: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5f90: 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f  internal) {..../
5fa0: 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20  * Skip internal 
5fb0: 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74  slots */....cont
5fc0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
5fd0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
5fe0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
5ff0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43  nected) {....CAC
6000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6010: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ("SCardDisconnec
6020: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20  t(%lu) called", 
6030: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6040: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  idx);.....SCardD
6050: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79  isconnect(cackey
6060: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
6070: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
6080: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09  VE_CARD);...}...
6090: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
60a0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a  s[idx].label) {.
60b0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
60c0: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
60d0: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
60e0: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
60f0: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
6100: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6110: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
6120: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
6130: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
6140: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
6150: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
6160: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
6170: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
6180: 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  = 0;....if (cack
6190: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
61a0: 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45  tive) {....CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
61c0: 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73  Marking active s
61d0: 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67  lot %lu as being
61e0: 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e   reset", (unsign
61f0: 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09  ed long) idx);..
6200: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  .}....cackey_slo
6210: 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73  ts[idx].slot_res
6220: 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43  et = 1;..}...CAC
6230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6240: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a  ("Returning");..
6250: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
6260: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6270: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6280: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6290: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
62a0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
62b0: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
62c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
62d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
62e0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
62f0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6300: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6310: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6320: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6330: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e  is function conn
6340: 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53  ects to the PC/S
6350: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6360: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ager and updates
6370: 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62   the. *     glob
6380: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a  al handle.. *. *
6390: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
63a0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
63b0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
63c0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f  .LONG scard_est_
63d0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66  context_ret;.#if
63e0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
63f0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f  VALIDCONTEXT..LO
6400: 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  NG scard_isvalid
6410: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
6420: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6430: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
6440: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6450: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
6460: 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63   {...cackey_pcsc
6470: 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63  _handle = malloc
6480: 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
6490: 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09  pcsc_handle));..
64a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
64b0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
64c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
64d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
64e0: 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  to malloc() fail
64f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
6500: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
6510: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
6520: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
6530: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6540: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
6550: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
6560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6570: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6580: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
6590: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
65a0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
65b0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
65c0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
65d0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
65e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
65f0: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
6600: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6610: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6620: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
6630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6640: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
6650: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
6660: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
6670: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
6680: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
6690: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
66a0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
66b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
66c0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
66d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
66e0: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
66f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6700: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
6710: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
6720: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
6730: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6740: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6750: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6760: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a  ENERIC);...}..}.
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
6790: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
67a0: 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61  RINTF("SCardIsVa
67b0: 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  lidContext() cal
67c0: 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73  led");..scard_is
67d0: 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72  valid_ret = SCar
67e0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
67f0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
6800: 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64  dle);..if (scard
6810: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20  _isvalid_ret != 
6820: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6830: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6840: 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65  G_PRINTF("Handle
6850: 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61   has become inva
6860: 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69  lid (SCardIsVali
6870: 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c  dContext = %s/%l
6880: 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65  i), trying to re
6890: 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20  -establish...", 
68a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
68b0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
68c0: 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  R(scard_isvalid_
68d0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
68e0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b  rd_isvalid_ret);
68f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6900: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
6910: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
6920: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
6930: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6940: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
6950: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
6960: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
6970: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
6980: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6990: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
69a0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
69b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
69c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
69d0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
69e0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
69f0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
6a00: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
6a10: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6a20: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
6a30: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
6a40: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
6a50: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6a60: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
6a70: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6a80: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
6a90: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6aa0: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6ab0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
6ac0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
6ad0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
6ae0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
6af0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6b00: 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  C);...}....CACKE
6b10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6b20: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20  Handle has been 
6b30: 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29  re-established")
6b40: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ;..}.#endif...CA
6b50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6b60: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63  F("Sucessfully c
6b70: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53  onnected to PC/S
6b80: 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  C, returning in 
6b90: 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74  success");...ret
6ba0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6bb0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
6bc0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
6bd0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6be0: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
6bf0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
6c00: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
6c10: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
6c20: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
6c30: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
6c40: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
6c50: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
6c60: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
6c70: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
6c80: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6c90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73  his function dis
6ca0: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68  connects from th
6cb0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
6cc0: 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75  on manager and u
6cd0: 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68  pdates. *     th
6ce0: 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e  e global handle.
6cf0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
6d00: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
6d10: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
6d20: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73  (void) {..LONG s
6d30: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6d40: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
6d50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6d60: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
6d70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6d80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
6d90: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6da0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61  _S_OK);..}...sca
6db0: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
6dc0: 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73  et = SCardReleas
6dd0: 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79  eContext(*cackey
6de0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a  _pcsc_handle);..
6df0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6e00: 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65  _handle) {...fre
6e10: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
6e20: 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65  ndle);.....cacke
6e30: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6e40: 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  NULL;..}...if (s
6e50: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6e60: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6e70: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74  SUCCESS) {...ret
6e80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6e90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
6ea0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6eb0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6ec0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6ed0: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
6ee0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
6ef0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6f00: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
6f10: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6f20: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6f30: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6f40: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6f50: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6f60: 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
6f70: 6c 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62  lot has having b
6f80: 65 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61  een reset, to la
6f90: 74 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75  ter be cleaned u
6fa0: 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75  p.. *     Cleanu
6fb0: 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  p only happens w
6fc0: 68 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c  hen a PKCS#11 cl
6fd0: 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e  ient calls C_Fin
6fe0: 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a  dObjectsInit.. *
6ff0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
7000: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
7010: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
7020: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7030: 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d  ) {..if (slot ==
7040: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
7050: 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  n;..}...CACKEY_D
7060: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
7070: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
7080: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7090: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61  nnected) {...SCa
70a0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
70b0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
70c0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
70d0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74  ..}...slot->slot
70e0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f  _reset = 1;..slo
70f0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7100: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f  nected = 0;..slo
7110: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
7120: 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
7130: 52 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  RED;...CACKEY_DE
7140: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
7150: 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75  rning.");...retu
7160: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
7170: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e  POSIS. *     LON
7180: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  G cackey_reconne
7190: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
71a0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
71b0: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f  , DWORD default_
71c0: 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52  protocol, LPDWOR
71d0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
71e0: 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  col);. *. * ARGU
71f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
7200: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
7210: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
7220: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
7230: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f  to. *. *     DWO
7240: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7250: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50  col. *         P
7260: 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d  rotocol to attem
7270: 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 20  pt first. *. *  
7280: 20 20 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63     LPDWORD selec
7290: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20  ted_protocol. * 
72a0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 72          [OUT] Pr
72b0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 0a  otocol selected.
72c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
72d0: 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65  UE. *     The re
72e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
72f0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7300: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
7310: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
7320: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
7330: 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e  round SCardRecon
7340: 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20  nect(). *. *    
7350: 20 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e   The SCardReconn
7360: 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63  ect() function c
7370: 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  all will be call
7380: 65 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68  ed first with th
7390: 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65  e. *     dwPrefe
73a0: 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66  rredProtocols of
73b0: 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63   "default_protoc
73c0: 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61  ol".  If that ca
73d0: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20  ll returns. *   
73e0: 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f    SCARD_E_PROTO_
73f0: 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61  MISMATCH try aga
7400: 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63  in with a protoc
7410: 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66  ol of T=0, and f
7420: 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68  ailing. *     th
7430: 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73  at T=1.. *. */.s
7440: 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65  tatic LONG cacke
7450: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
7460: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7470: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44  lot *slot, DWORD
7480: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7490: 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63  l, LPDWORD selec
74a0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ted_protocol) {.
74b0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
74c0: 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f 63 6f  _ret;...scard_co
74d0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
74e0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
74f0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
7500: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66  HARE_SHARED, def
7510: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53  ault_protocol, S
7520: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
7530: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7540: 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64  ol);...if (scard
7550: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7560: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7570: 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TCH) {...CACKEY_
7580: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7590: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
75a0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
75b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
75c0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
75d0: 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63   T=0")...scard_c
75e0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
75f0: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
7600: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7610: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
7620: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c  ARD_PROTOCOL_T0,
7630: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7640: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
7650: 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63  ocol);....if (sc
7660: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7670: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7680: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43  SMATCH) {....CAC
7690: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
76a0: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
76b0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
76c0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
76d0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
76e0: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63  just T=1")....sc
76f0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7700: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7710: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7720: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7730: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7740: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T1, SCARD_RESE
7750: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64  T_CARD, selected
7760: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a  _protocol);...}.
7770: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72  .}...return(scar
7780: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a  d_conn_ret);.}..
7790: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
77a0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
77b0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
77c0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
77d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
77e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
77f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
7800: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
7810: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
7820: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
7830: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
7840: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7850: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
7860: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
7870: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
7880: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
7890: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
78a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
78b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
78c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
78d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
78e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
78f0: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
7900: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
7910: 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  t;..DWORD protoc
7920: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ol;..LONG scard_
7930: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
7940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7950: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7960: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
7970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7980: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
7990: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
79a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
79b0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
79c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
79d0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
79e0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
79f0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
7a00: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
7a10: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
7a20: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
7a30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a40: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
7a50: 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
7a60: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
7a70: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
7a80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7a90: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7aa0: 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20  ../* Connect to 
7ab0: 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65  reader, if neede
7ac0: 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d  d */..if (!slot-
7ad0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7ae0: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
7af0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
7b00: 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20  CardConnect(%s) 
7b10: 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70  called", slot->p
7b20: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73  csc_reader);...s
7b30: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7b40: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7b50: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7b60: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7b70: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7b80: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7b90: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
7ba0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
7bb0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7bc0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7bd0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7be0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7bf0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7c00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7c10: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7c20: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7c30: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7c40: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7c50: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a  with just T=0").
7c60: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7c70: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7c80: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7c90: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7ca0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7cb0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7cc0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7cd0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7ce0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7cf0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7d00: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7d10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7d20: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
7d30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7d40: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7d50: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7d60: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7d70: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
7d80: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
7d90: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7da0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7db0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7dc0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7dd0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7de0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7df0: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
7e00: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7e10: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
7e20: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7e30: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  == SCARD_W_UNPOW
7e40: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09  ERED_CARD) {....
7e50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7e60: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
7e70: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7e80: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
7e90: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  ARD, trying to r
7ea0: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a  e-connect...");.
7eb0: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7ec0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
7ed0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
7ee0: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
7ef0: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
7f00: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43  SHARE_DIRECT, SC
7f10: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
7f20: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
7f30: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
7f40: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
7f50: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
7f60: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7f70: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7f80: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
7f90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7fb0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7fc0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7fd0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7fe0: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64   T=0").....scard
7ff0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8000: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8010: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8020: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8030: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
8040: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
8050: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
8060: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
8070: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  col);......if (s
8080: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09  ISMATCH) {......
80b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
80c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
80d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
80e0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
80f0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
8100: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09   just T=1").....
8110: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
8120: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
8130: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
8140: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8150: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8160: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
8170: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
8180: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8190: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09  &protocol);.....
81a0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64  }....}.....scard
81b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  _conn_ret = cack
81c0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
81d0: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c  d(slot, protocol
81e0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
81f0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
8200: 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44  onn_ret != SCARD
8210: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
8220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8230: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
8240: 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c   to card failed,
8250: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
8260: 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e  ilure (SCardConn
8270: 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22  ect() = %s/%li)"
8280: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
8290: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
82a0: 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  STR(scard_conn_r
82b0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
82c0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09  d_conn_ret);....
82d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
82e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
82f0: 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73  ..}....slot->pcs
8300: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
8310: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72   = 1;...slot->tr
8320: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8330: 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 0;...slot->tra
8340: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8350: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f  _lock = 0;...slo
8360: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
8370: 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74  otocol;..}...ret
8380: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8390: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
83a0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
83b0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
83c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
83d0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
83e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
83f0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8400: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
8410: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
8420: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
8430: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
8440: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
8450: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8460: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
8470: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
8480: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8490: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
84a0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
84b0: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61  *     The transa
84c0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
84d0: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67  terminated using
84e0: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61   "cackey_end_tra
84f0: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f  nsaction". *. */
8500: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
8510: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
8520: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
8530: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8540: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
8550: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ret cackey_conn_
8560: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  ret;..LONG scard
8570: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
8580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8590: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
85a0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
85b0: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
85c0: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
85d0: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65   (cackey_conn_re
85e0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
85f0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
8600: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8610: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
8620: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
8630: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8640: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8650: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8660: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8670: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b  ansaction_depth+
8680: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  +;...if (slot->t
8690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
86a0: 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74   > 1 && !slot->t
86b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
86c0: 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43  hw_lock) {...CAC
86d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86e0: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74  ("Already in a t
86f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66  ransaction, perf
8700: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e  orming no action
8710: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69   (new depth = %i
8720: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
8730: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
8740: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8750: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
8760: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8770: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
8780: 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e   0;...scard_tran
8790: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67  s_ret = SCardBeg
87a0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  inTransaction(sl
87b0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a  ot->pcsc_card);.
87c0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
87d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
87e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
87f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8800: 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69  ("Unable to begi
8810: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
8820: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8830: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8840: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8850: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
8860: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8870: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67  "Sucessfully beg
8880: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  an transaction o
8890: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
88a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
88b0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
88c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
88d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
88e0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
88f0: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
8900: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
8910: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8920: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
8930: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8940: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8950: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8960: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8970: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8980: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8990: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
89a0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
89b0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
89c0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
89d0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
89e0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
89f0: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
8a00: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
8a10: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
8a20: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
8a30: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8a40: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8a50: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8a60: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8a70: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
8a80: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8a90: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8aa0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8ab0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
8ac0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8ad0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
8ae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8af0: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
8b00: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
8b10: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
8b20: 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69   on card");....i
8b30: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
8b40: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8b50: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8b60: 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61  G_PRINTF("Decrea
8b70: 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  sing transaction
8b80: 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e   depth and askin
8b90: 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65  g for a hardware
8ba0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78   lock on the nex
8bb0: 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  t begin transact
8bc0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
8bd0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
8be0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8bf0: 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74  th);.....slot->t
8c00: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8c10: 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74  --;.....if (slot
8c20: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8c30: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73  pth > 0) {.....s
8c40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8c50: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
8c60: 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  1;....}...}....r
8c70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8c80: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8c90: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8ca0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8cb0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
8cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
8cd0: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
8ce0: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
8cf0: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
8d00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8d10: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8d20: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8d30: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
8d40: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8d50: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
8d60: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
8d70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
8d80: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
8d90: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
8da0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
8db0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
8dc0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
8dd0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
8de0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
8df0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8e00: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8e10: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
8e20: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
8e30: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
8e40: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
8e50: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
8e60: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
8e70: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
8e80: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
8e90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8ea0: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
8eb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
8ec0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8ed0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8ee0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8ef0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
8f00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
8f10: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
8f20: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
8f30: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8f40: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8f50: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8f60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8f70: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
8f80: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
8f90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
8fa0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
8fb0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
8fc0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8fd0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
8fe0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
8ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9000: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9010: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9020: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
9030: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
9040: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9050: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
9060: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
9070: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
9080: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9090: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
90a0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
90b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
90c0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
90d0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
90e0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
90f0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
9100: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9110: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
9120: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
9130: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
9140: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
9150: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
9160: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
9170: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
9180: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9190: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
91a0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
91b0: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
91c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
91d0: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
91e0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
91f0: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
9200: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9210: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
9220: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
9230: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
9240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9250: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
9260: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
9270: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
9280: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9290: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
92a0: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
92b0: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
92c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
92d0: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
92e0: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
92f0: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
9300: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9310: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
9320: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
9330: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
9340: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
9350: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
9360: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
9370: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
9380: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
9390: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
93a0: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
93b0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
93c0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
93d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
93e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
93f0: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
9400: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
9410: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9420: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
9430: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
9440: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
9450: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
9460: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
9470: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
9480: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
9490: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
94a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
94b0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
94c0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
94d0: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
94e0: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
94f0: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9500: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9510: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
9520: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
9530: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9540: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
9550: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
9560: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
9570: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
9580: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
9590: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
95a0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
95b0: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
95c0: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
95d0: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
95e0: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
95f0: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
9600: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
9610: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
9620: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
9630: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9640: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
9650: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9660: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
9670: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
9680: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
9690: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
96a0: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
96b0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
96c0: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
96d0: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
96e0: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
96f0: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
9700: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
9710: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
9720: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
9730: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
9740: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
9750: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
9760: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9770: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
9780: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
9790: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
97a0: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
97b0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
97c0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
97d0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
97e0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
97f0: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20  OK           On 
9800: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9820: 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72  ERIC      On err
9830: 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  or. *     CACKEY
9840: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
9850: 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64  ENT  If the send
9860: 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75  ing failed becau
9870: 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a  se the token is.
9880: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e    absent. *. * N
98b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
98c0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63   function will c
98d0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43  onnect to the PC
98e0: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
98f0: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20  anager via. *   
9900: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f    cackey_pcsc_co
9910: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65  nnect() if neede
9920: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20  d.. *. *     It 
9930: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
9940: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20  the card in the 
9950: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20  reader attached 
9960: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20  to the slot. *  
9970: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49     specified.  I
9980: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74  t will reconnect
9990: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20   to the card if 
99a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
99b0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e  *     goes away.
99c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
99d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
99e0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
99f0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
9a00: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
9a10: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
9a20: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
9a30: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
9a40: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
9a50: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
9a60: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e  d int lc, unsign
9a70: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
9a80: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20  nsigned int le, 
9a90: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9aa0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
9ab0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
9ac0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
9ad0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
9ae0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
9af0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
9b00: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
9b10: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53  pdata_len;..LPCS
9b20: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20  CARD_IO_REQUEST 
9b30: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f  pioSendPci;..DWO
9b40: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57  RD protocol;..DW
9b50: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65  ORD xmit_len, re
9b60: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  cv_len;..LONG sc
9b70: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63  ard_xmit_ret, sc
9b80: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
9b90: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31  .BYTE xmit_buf[1
9ba0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31  024], recv_buf[1
9bb0: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f  024];..int pcsc_
9bc0: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73  connect_ret, pcs
9bd0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09  c_getresp_ret;..
9be0: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
9bf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9c00: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
9c10: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
9c20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9c30: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
9c40: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72  ecified.");....r
9c50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9c60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9c70: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
9c80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
9c90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
9ca0: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
9cb0: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
9cc0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
9cd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9ce0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
9cf0: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
9d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
9d10: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
9d20: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9d30: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
9d40: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63  * Determine whic
9d50: 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65  h protocol to se
9d60: 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69  nd using */..swi
9d70: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
9d80: 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43  col) {...case SC
9d90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
9da0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9db0: 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f  _PRINTF("Protoco
9dc0: 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72  l to send datagr
9dd0: 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09  am is T=0");....
9de0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9df0: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
9e00: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43  break;...case SC
9e10: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a  ARD_PROTOCOL_T1:
9e20: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9e30: 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f  _PRINTF("Protoco
9e40: 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72  l to send datagr
9e50: 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09  am is T=1");....
9e60: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9e70: 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09  ARD_PCI_T1;.....
9e80: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
9e90: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
9ea0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
9eb0: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
9ec0: 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a  , aborting.");..
9ed0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9ee0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9ef0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d  ;..}.../* Transm
9f00: 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20  it */..xmit_len 
9f10: 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  = 0;..xmit_buf[x
9f20: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61  mit_len++] = cla
9f30: 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ss;..xmit_buf[xm
9f40: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74  it_len++] = inst
9f50: 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62  ruction;..xmit_b
9f60: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9f70: 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78   p1;..xmit_buf[x
9f80: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b  mit_len++] = p2;
9f90: 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09  ..if (data) {...
9fa0: 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a  if (lc > 255) {.
9fb0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9fc0: 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21  PRINTF("CAUTION!
9fd0: 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72    Using an Lc gr
9fe0: 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69  eater than 255 i
9ff0: 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20  s untested.  Lc 
a000: 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09  = %u", lc);.....
a010: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a020: 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20  n++] = 0x82; /* 
a030: 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a  XXX UNTESTED */.
a040: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a050: 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20  _len++] = (lc & 
a060: 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
a070: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a080: 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66  en++] = lc & 0xf
a090: 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  f;...} else {...
a0a0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a0b0: 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a  en++] = lc;...}.
a0c0: 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
a0d0: 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29  idx < lc; idx++)
a0e0: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a0f0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74  mit_len++] = dat
a100: 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a  a[idx];...}..}..
a110: 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29  .if (le != 0x00)
a120: 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35   {...if (le > 25
a130: 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  6) {....CACKEY_D
a140: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55  EBUG_PRINTF("CAU
a150: 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20  TION!  Using an 
a160: 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  Le greater than 
a170: 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e  256 is untested.
a180: 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b    Le = %u", le);
a190: 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  .....xmit_buf[xm
a1a0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32  it_len++] = 0x82
a1b0: 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45  ; /* XXX UNTESTE
a1c0: 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66  D */....xmit_buf
a1d0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28  [xmit_len++] = (
a1e0: 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20  le & 0xff00) >> 
a1f0: 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  8;....xmit_buf[x
a200: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20  mit_len++] = le 
a210: 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65  & 0xff;...} else
a220: 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20   if (le == 256) 
a230: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
a240: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30  it_len++] = 0x00
a250: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
a260: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a270: 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09  n++] = le;...}..
a280: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  }.../* Begin Sma
a290: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
a2a0: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
a2b0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
a2c0: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61  slot);...if (cla
a2d0: 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53  ss == GSCIS_CLAS
a2e0: 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73  S_ISO7816 && ins
a2f0: 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49  truction == GSCI
a300: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26  S_INSTR_VERIFY &
a310: 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a  & p1 == 0x00) {.
a320: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a330: 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41  RINTF("Sending A
a340: 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e  PDU: <<censored>
a350: 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  >");..} else {..
a360: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a370: 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20  INTBUF("Sending 
a380: 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66  APDU:", xmit_buf
a390: 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a  , xmit_len);..}.
a3a0: 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a  ..recv_len = siz
a3b0: 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09  eof(recv_buf);..
a3c0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
a3d0: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73   SCardTransmit(s
a3e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
a3f0: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74  pioSendPci, xmit
a400: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
a410: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20  NULL, recv_buf, 
a420: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66  &recv_len);...if
a430: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
a440: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f   == SCARD_E_NOT_
a450: 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09  TRANSACTED) {...
a460: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a470: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
a480: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
a490: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
a4a0: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c  ) = %s/%lx), wil
a4b0: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75  l ask calling fu
a4c0: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20  nction to retry 
a4d0: 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63  (not resetting c
a4e0: 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  ard)...", CACKEY
a4f0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
a500: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
a510: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
a520: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
a530: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
a540: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63  ./* Begin Smartc
a550: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
a560: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
a570: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
a580: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a590: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
a5a0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  );..}...if (scar
a5b0: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
a5c0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
a5d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a5e0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
a5f0: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
a600: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
a610: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c  it() = %s/%lx)",
a620: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
a630: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
a640: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
a650: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
a660: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
a670: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
a680: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72  EBUG_PRINTF("Mar
a690: 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76  king slot as hav
a6a0: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29  ing been reset")
a6b0: 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ;...cackey_mark_
a6c0: 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
a6d0: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78  ;....if (scard_x
a6e0: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  mit_ret == SCARD
a6f0: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
a700: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a710: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
a720: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
a730: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
a740: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
a750: 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
a760: 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
a770: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
a780: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
a790: 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
a7a0: 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72  .....if (scard_r
a7b0: 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  econn_ret == SCA
a7c0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
a7d0: 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72  ..../* Update pr
a7e0: 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c  otocol */.....sl
a7f0: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70  ot->protocol = p
a800: 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69  rotocol;.....swi
a810: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
a820: 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61 73 65  col) {......case
a830: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
a840: 54 30 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e  T0:.......pioSen
a850: 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49  dPci = SCARD_PCI
a860: 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  _T0;........brea
a870: 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41  k;......case SCA
a880: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a  RD_PROTOCOL_T1:.
a890: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69  ......pioSendPci
a8a0: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b   = SCARD_PCI_T1;
a8b0: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
a8c0: 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
a8d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a8e0: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
a8f0: 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20  protocol found, 
a900: 62 75 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20  but too late to 
a910: 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75  do anything abou
a920: 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69  t it now -- tryi
a930: 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09  ng anyway.");...
a940: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
a950: 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74  }....../* Re-est
a960: 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69  ablish transacti
a970: 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72  on, if it was pr
a980: 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20  esent */.....if 
a990: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
a9a0: 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
a9b0: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
a9c0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
a9d0: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
a9e0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
a9f0: 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  ock = 1;......ca
aa00: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
aa10: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
aa20: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
aa30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
aa40: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
aa50: 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29  retransmitting")
aa60: 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20  ;......recv_len 
aa70: 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75  = sizeof(recv_bu
aa80: 66 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d  f);.....scard_xm
aa90: 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72  it_ret = SCardTr
aaa0: 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73  ansmit(slot->pcs
aab0: 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50  c_card, pioSendP
aac0: 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  ci, xmit_buf, xm
aad0: 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65  it_len, NULL, re
aae0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
aaf0: 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61  n);......if (sca
ab00: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
ab10: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
ab20: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
ab30: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72  BUG_PRINTF("Retr
ab40: 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72  ansmit failed, r
ab50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ab60: 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e  ure after discon
ab70: 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64  necting the card
ab80: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20   (SCardTransmit 
ab90: 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b  = %s/%li)", CACK
aba0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
abb0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
abc0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
abd0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
abe0: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61  _ret);.......SCa
abf0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
ac00: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
ac10: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
ac20: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ......slot->pcsc
ac30: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
ac40: 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e  = 0;......./* En
ac50: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
ac60: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09  saction */......
ac70: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
ac80: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
ac90: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
aca0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
acb0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
acc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
acd0: 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09  ABSENT);.....}..
ace0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
acf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ad00: 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e  TF("Disconnectin
ad10: 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53  g card");......S
ad20: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
ad30: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
ad40: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
ad50: 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  );.....slot->pcs
ad60: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
ad70: 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e   = 0;....../* En
ad80: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
ad90: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73  saction */.....s
ada0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
adb0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09  _depth = 1;.....
adc0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
add0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
ade0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
adf0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
ae00: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ae10: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
ae20: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
ae30: 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  SENT);....}...} 
ae40: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
ae50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
ae60: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72  isconnecting car
ae70: 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  d");.....SCardDi
ae80: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
ae90: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
aea0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
aeb0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
aec0: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
aed0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
aee0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
aef0: 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  */....slot->tran
af00: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
af10: 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  1;....cackey_end
af20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
af30: 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  t);.....CACKEY_D
af40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
af50: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
af60: 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43  e");....return(C
af70: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
af80: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
af90: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
afa0: 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74 75 72  _PRINTBUF("Retur
afb0: 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63  ned Value:", rec
afc0: 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29  v_buf, recv_len)
afd0: 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  ;...if (recv_len
afe0: 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e   < 2) {.../* Min
aff0: 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65  imal response le
b000: 6e 67 74 68 20 69 73 20 32 20 62 79 74 65 73 2c  ngth is 2 bytes,
b010: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b020: 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45  ilure */...CACKE
b030: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b040: 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61  Response too sma
b050: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ll, returning in
b060: 20 66 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c   failure (recv_l
b070: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  en = %lu)", (uns
b080: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76  igned long) recv
b090: 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64  _len);..../* End
b0a0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b0b0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
b0c0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b0d0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74  on(slot);....ret
b0e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b0f0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
b100: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65  ./* Determine re
b110: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61  sult code */..ma
b120: 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  jor_rc = recv_bu
b130: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b  f[recv_len - 2];
b140: 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63  ..minor_rc = rec
b150: 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d  v_buf[recv_len -
b160: 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f   1];..if (respco
b170: 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64  de) {...*respcod
b180: 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c  e = (major_rc <<
b190: 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a   8) | minor_rc;.
b1a0: 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d  .}.../* Adjust m
b1b0: 65 73 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f  essage buffer */
b1c0: 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b  ..recv_len -= 2;
b1d0: 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20  .../* Add bytes 
b1e0: 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  to return value 
b1f0: 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61  */..tmp_respdata
b200: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72  _len = 0;..if (r
b210: 65 73 70 64 61 74 61 20 26 26 20 72 65 73 70 64  espdata && respd
b220: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70  ata_len) {...tmp
b230: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
b240: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a  *respdata_len;..
b250: 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
b260: 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  = *respdata_len;
b270: 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  ....if (recv_len
b280: 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
b290: 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
b2a0: 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b  copy = recv_len;
b2b0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
b2c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70  EBUG_PRINTF("Cop
b2d0: 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74  ying %lu bytes t
b2e0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 28 72 65  o the buffer (re
b2f0: 63 76 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20  cv'd %lu bytes, 
b300: 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74  but only %lu byt
b310: 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62  es left in our b
b320: 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e  uffer)", (unsign
b330: 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74  ed long) bytes_t
b340: 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65  o_copy, (unsigne
b350: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
b360: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b370: 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  ) *respdata_len)
b380: 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70  ;....memcpy(resp
b390: 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20  data, recv_buf, 
b3a0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
b3b0: 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79  ..respdata += by
b3c0: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09  tes_to_copy;....
b3d0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  *respdata_len = 
b3e0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09  bytes_to_copy;..
b3f0: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
b400: 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  n -= bytes_to_co
b410: 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  py;..} else {...
b420: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20  if (recv_len != 
b430: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
b440: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72  EBUG_PRINTF("Thr
b450: 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62  owing away %lu b
b460: 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f  ytes, nowhere to
b470: 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e   put them!", (un
b480: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63  signed long) rec
b490: 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  v_len);...}..}..
b4a0: 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d  .if (major_rc ==
b4b0: 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65   0x61) {.../* We
b4c0: 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f   need to READ */
b4d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b4e0: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
b4f0: 65 61 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a  ead required");.
b500: 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20  ...if (minor_rc 
b510: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69  == 0x00) {....mi
b520: 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f  nor_rc = CACKEY_
b530: 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09  APDU_MTU;...}...
b540: 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  .pcsc_getresp_re
b550: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
b560: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
b570: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
b580: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
b590: 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20  RESPONSE, 0x00, 
b5a0: 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d  0x00, 0, NULL, m
b5b0: 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64  inor_rc, respcod
b5c0: 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d  e, respdata, &tm
b5d0: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b  p_respdata_len);
b5e0: 0a 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ....if (pcsc_get
b5f0: 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b  resp_ret != CACK
b600: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
b610: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b620: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
b630: 65 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74  ead failed!  Ret
b640: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b650: 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  e");...../* End 
b660: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
b670: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
b680: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b690: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66  on(slot);.....if
b6a0: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
b6b0: 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
b6c0: 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09  C_E_RETRY) {....
b6d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b6e0: 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09  CSC_E_RETRY);...
b6f0: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
b700: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
b710: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RIC);...}....if 
b720: 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b  (respdata_len) {
b730: 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65  ....*respdata_le
b740: 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74  n += tmp_respdat
b750: 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  a_len;...}..../*
b760: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
b770: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
b780: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
b790: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
b7a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b7b0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
b7c0: 69 6e 20 73 75 63 63 65 73 73 20 28 62 75 66 66  in success (buff
b7d0: 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65  er read complete
b7e0: 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41  )");...return(CA
b7f0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
b800: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61  ..}.../* End Sma
b810: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b820: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
b830: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
b840: 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  ot);...if (major
b850: 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09  _rc == 0x90) {..
b860: 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09  ./* Success */..
b870: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b880: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
b890: 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f  in success (majo
b8a0: 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a  r_rc = 0x90)");.
b8b0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b8c0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
b8d0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b8e0: 50 52 49 4e 54 46 28 22 41 50 44 55 20 52 65 74  PRINTF("APDU Ret
b8f0: 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20  urned an error, 
b900: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b910: 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  lure");...return
b920: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
b930: 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20  ENERIC);.}../*. 
b940: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
b950: 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79    ssize_t cackey
b960: 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75 63 74  _get_data(struct
b970: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
b980: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
b990: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
b9a0: 74 20 63 6f 75 6e 74 2c 20 2e 2e 2e 2e 0a 20 2a  t count, ..... *
b9b0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
b9c0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
b9d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
b9e0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
b9f0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
ba00: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
ba10: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
ba20: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  r. *         [OU
ba30: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20  T] Buffer. *. * 
ba40: 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74      size_t count
ba50: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
ba60: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
ba70: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20  ttempt to read. 
ba80: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
ba90: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20  initial_offset. 
baa0: 2a 20 20 20 20 20 20 20 20 20 53 70 65 63 69 66  *         Specif
bab0: 79 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  y the offset to 
bac0: 62 65 67 69 6e 20 74 68 65 20 72 65 61 64 20 66  begin the read f
bad0: 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54  rom. *. *. * RET
bae0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
baf0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
bb00: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
bb10: 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
bb20: 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20  lly read, or -1 
bb30: 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20  on error.. *. * 
bb40: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
bb50: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
bb60: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67  ssize_t cackey_g
bb70: 65 74 5f 64 61 74 61 28 73 74 72 75 63 74 20 63  et_data(struct c
bb80: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
bb90: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
bba0: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
bbb0: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
bbc0: 63 68 61 72 20 6f 69 64 5b 33 5d 29 20 7b 0a 09  char oid[3]) {..
bbd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
bbe0: 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74  uffer_p;..size_t
bbf0: 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 0a 09 73   init_count;...s
bc00: 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30  ize_t offset = 0
bc10: 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61  , max_offset, ma
bc20: 78 5f 63 6f 75 6e 74 2c 20 73 69 7a 65 3b 0a 09  x_count, size;..
bc30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d  unsigned char cm
bc40: 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30 78 30  d[] = {0x5C, 0x0
bc50: 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  3, 0x00, 0x00, 0
bc60: 78 30 30 7d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  x00};..uint16_t 
bc70: 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73  respcode;..int s
bc80: 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64  end_ret;..int id
bc90: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
bca0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
bcb0: 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 63 6f 75 6e  .");...init_coun
bcc0: 74 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 6d 61 78  t = count;...max
bcd0: 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b  _offset = count;
bce0: 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41  ..max_count = CA
bcf0: 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a  CKEY_APDU_MTU;..
bd00: 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d  .cmd[2] = oid[0]
bd10: 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b  ;..cmd[3] = oid[
bd20: 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69  1];..cmd[4] = oi
bd30: 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74  d[2];.../* 256 t
bd40: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c  o indicate the l
bd50: 61 72 67 65 73 74 20 6d 65 73 73 61 67 65 20 73  argest message s
bd60: 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72  ize -- not clear
bd70: 20 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f   if this will wo
bd80: 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73  rk with all mess
bd90: 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  ages */..send_re
bda0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
bdb0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
bdc0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
bdd0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49  NISTSP800_73_3_I
bde0: 4e 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30  NSTR_GET_DATA, 0
bdf0: 78 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f  x3F, 0xFF, sizeo
be00: 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36  f(cmd), cmd, 256
be10: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66  , &respcode, buf
be20: 66 65 72 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09  fer, &count);...
be30: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
be40: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
be50: 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TRY) {...CACKEY_
be60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
be70: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
be80: 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64  d, retrying read
be90: 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 72 65   buffer");....re
bea0: 74 75 72 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f  turn(cackey_get_
beb0: 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
bec0: 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 6f  r, init_count, o
bed0: 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  id));..}...if (s
bee0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
bef0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
bf00: 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d  .if (respcode ==
bf10: 20 30 78 36 41 38 36 29 20 7b 0a 2f 2a 20 58 58   0x6A86) {./* XX
bf20: 58 20 54 4f 44 4f 20 50 49 56 20 2a 2f 0a 09 09  X TODO PIV */...
bf30: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
bf40: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
bf50: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69  _send_apdu() fai
bf60: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
bf70: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
bf80: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
bf90: 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74  .offset += count
bfa0: 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  ;..#ifdef CACKEY
bfb0: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
bfc0: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
bfd0: 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20  MAX..if (offset 
bfe0: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
bff0: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
c000: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
c010: 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  set exceeds maxi
c020: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
c030: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
c040: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66   (max = %li, off
c050: 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  set = %lu)", (lo
c060: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
c070: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
c080: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
c090: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
c0a0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
c0b0: 0a 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3c 20  ...if (offset < 
c0c0: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
c0d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55  BUG_PRINTF("APDU
c0e0: 20 47 45 54 20 44 41 54 41 20 72 65 74 75 72 6e   GET DATA return
c0f0: 65 64 20 25 6c 75 20 62 79 74 65 73 2c 20 77 68  ed %lu bytes, wh
c100: 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74  ich is too short
c110: 20 66 6f 72 20 61 20 42 45 52 2d 54 4c 56 20 72   for a BER-TLV r
c120: 65 73 70 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67  esponse", (unsig
c130: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
c140: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c150: 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 20  ;..}...buffer_p 
c160: 3d 20 62 75 66 66 65 72 3b 0a 09 69 66 20 28 2a  = buffer;..if (*
c170: 62 75 66 66 65 72 5f 70 20 21 3d 20 30 78 35 33  buffer_p != 0x53
c180: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c190: 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20  UG_PRINTF("APDU 
c1a0: 47 45 54 20 44 41 54 41 20 64 69 64 20 6e 6f 74  GET DATA did not
c1b0: 20 72 65 74 75 72 6e 20 61 20 42 45 52 2d 54 4c   return a BER-TL
c1c0: 56 20 77 69 74 68 20 74 61 67 20 35 33 2e 20 20  V with tag 53.  
c1d0: 54 61 67 20 3d 20 25 30 32 78 22 2c 20 28 75 6e  Tag = %02x", (un
c1e0: 73 69 67 6e 65 64 20 69 6e 74 29 20 2a 62 75 66  signed int) *buf
c1f0: 66 65 72 5f 70 29 3b 0a 0a 09 09 72 65 74 75 72  fer_p);....retur
c200: 6e 28 2d 31 29 3b 0a 09 7d 0a 09 62 75 66 66 65  n(-1);..}..buffe
c210: 72 5f 70 2b 2b 3b 0a 0a 09 69 66 20 28 28 2a 62  r_p++;...if ((*b
c220: 75 66 66 65 72 5f 70 20 26 20 30 78 38 30 29 20  uffer_p & 0x80) 
c230: 3d 3d 20 30 78 38 30 29 20 7b 0a 09 09 73 69 7a  == 0x80) {...siz
c240: 65 20 3d 20 30 3b 0a 09 09 69 64 78 20 3d 20 28  e = 0;...idx = (
c250: 2a 62 75 66 66 65 72 5f 70 20 26 20 30 78 37 66  *buffer_p & 0x7f
c260: 29 3b 0a 0a 09 09 69 66 20 28 28 28 62 75 66 66  );....if (((buff
c270: 65 72 5f 70 20 2d 20 62 75 66 66 65 72 29 20 2b  er_p - buffer) +
c280: 20 69 64 78 29 20 3e 3d 20 6f 66 66 73 65 74 29   idx) >= offset)
c290: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
c2a0: 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f  UG_PRINTF("Malfo
c2b0: 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20 2d  rmed BER value -
c2c0: 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  - not enough byt
c2d0: 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  es available to 
c2e0: 72 65 61 64 20 6c 65 6e 67 74 68 22 29 3b 0a 0a  read length");..
c2f0: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c300: 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64 78  .}....for (; idx
c310: 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09   > 0; idx--) {..
c320: 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09  ..buffer_p++;...
c330: 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09  .size <<= 8;....
c340: 73 69 7a 65 20 7c 3d 20 2a 62 75 66 66 65 72 5f  size |= *buffer_
c350: 70 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  p;...}..} else {
c360: 0a 09 09 73 69 7a 65 20 3d 20 2a 62 75 66 66 65  ...size = *buffe
c370: 72 5f 70 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f  r_p;..}..buffer_
c380: 70 2b 2b 3b 0a 0a 09 69 66 20 28 28 28 62 75 66  p++;...if (((buf
c390: 66 65 72 5f 70 20 2d 20 62 75 66 66 65 72 29 20  fer_p - buffer) 
c3a0: 2b 20 73 69 7a 65 29 20 21 3d 20 6f 66 66 73 65  + size) != offse
c3b0: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
c3c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 6e 74 69  BUG_PRINTF("Enti
c3d0: 72 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  re buffer is not
c3e0: 20 63 6f 6e 73 75 6d 65 64 21 22 29 3b 0a 0a 09   consumed!");...
c3f0: 09 69 66 20 28 28 28 62 75 66 66 65 72 5f 70 20  .if (((buffer_p 
c400: 2d 20 62 75 66 66 65 72 29 20 2b 20 73 69 7a 65  - buffer) + size
c410: 29 20 3e 20 6f 66 66 73 65 74 29 20 7b 0a 09 09  ) > offset) {...
c420: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c430: 49 4e 54 46 28 22 45 6e 63 6f 64 65 64 20 73 69  INTF("Encoded si
c440: 7a 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ze is greater th
c450: 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  an the amount of
c460: 20 64 61 74 61 20 72 65 61 64 2c 20 64 72 6f 70   data read, drop
c470: 70 69 6e 67 22 29 3b 0a 0a 09 09 09 72 65 74 75  ping");.....retu
c480: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
c490: 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c  .memmove(buffer,
c4a0: 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29   buffer_p, size)
c4b0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
c4c0: 5f 50 52 49 4e 54 42 55 46 28 22 47 45 54 20 44  _PRINTBUF("GET D
c4d0: 41 54 41 20 72 65 73 75 6c 74 22 2c 20 62 75 66  ATA result", buf
c4e0: 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41  fer, size);...CA
c4f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c500: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
c510: 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c  success, read %l
c520: 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67  u bytes", (unsig
c530: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b  ned long) size);
c540: 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a 65 29 3b  ...return(size);
c550: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
c560: 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f  IS. *     ssize_
c570: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
c580: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
c590: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
c5a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
c5b0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
c5c0: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
c5d0: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
c5e0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
c5f0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
c600: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
c610: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
c620: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
c630: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
c640: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
c650: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c660: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
c670: 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a   [OUT] Buffer. *
c680: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63  . *     size_t c
c690: 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20  ount. *         
c6a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
c6b0: 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  to attempt to re
c6c0: 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  ad. *. *     uns
c6d0: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
c6e0: 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c  v. *         Sel
c6f0: 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72  ect the T-buffer
c700: 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65   (01) or V-buffe
c710: 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66  r (02) to read f
c720: 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20  rom.  . *. *    
c730: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f   size_t initial_
c740: 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20  offset. *       
c750: 20 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66    Specify the of
c760: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68  fset to begin th
c770: 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20  e read from. *. 
c780: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
c790: 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  E. *     This fu
c7a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
c7b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
c7c0: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
c7d0: 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72  , or -1 on error
c7e0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
c7f0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
c800: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
c810: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
c820: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
c830: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
c840: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c850: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
c860: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c870: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
c880: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b  nitial_offset) {
c890: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
c8a0: 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73  *init_buffer;..s
c8b0: 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74  ize_t init_count
c8c0: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69  ;..size_t init_i
c8d0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a  nitial_offset;..
c8e0: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d  .size_t offset =
c8f0: 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20   0, max_offset, 
c900: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69  max_count;..unsi
c910: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d  gned char cmd[2]
c920: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
c930: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
c940: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c950: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c960: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75  ed.");...init_bu
c970: 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09  ffer = buffer;..
c980: 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75  init_count = cou
c990: 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61  nt;..init_initia
c9a0: 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69  l_offset = initi
c9b0: 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78  al_offset;...max
c9c0: 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b  _offset = count;
c9d0: 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41  ..max_count = CA
c9e0: 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a  CKEY_APDU_MTU;..
c9f0: 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31  .if (t_or_v != 1
ca00: 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29   && t_or_v != 2)
ca10: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
ca20: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
ca30: 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74  d T or V paramet
ca40: 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  er specified, re
ca50: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
ca60: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
ca70: 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d  -1);..}...cmd[0]
ca80: 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69   = t_or_v;...whi
ca90: 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f  le (1) {...if (o
caa0: 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66  ffset >= max_off
cab0: 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  set) {....CACKEY
cac0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
cad0: 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c  uffer too small,
cae0: 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20   returning what 
caf0: 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09  we got...");....
cb00: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63  .break;...}....c
cb10: 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65  ount = max_offse
cb20: 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66  t - offset;...if
cb30: 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f   (count > max_co
cb40: 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20  unt) {....count 
cb50: 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d  = max_count;...}
cb60: 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75  ....cmd[1] = cou
cb70: 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20  nt;....send_ret 
cb80: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
cb90: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
cba0: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
cbb0: 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54  FORM, GSCIS_INST
cbc0: 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28  R_READ_BUFFER, (
cbd0: 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20  (initial_offset 
cbe0: 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20  + offset) >> 8) 
cbf0: 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c  & 0xff, (initial
cc00: 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74  _offset + offset
cc10: 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  ) & 0xff, sizeof
cc20: 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30  (cmd), cmd, 0x00
cc30: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66  , &respcode, buf
cc40: 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63  fer + offset, &c
cc50: 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65  ount);....if (se
cc60: 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  nd_ret == CACKEY
cc70: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b  _PCSC_E_RETRY) {
cc80: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
cc90: 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65  _PRINTF("ADPU Se
cca0: 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65  nding failed, re
ccb0: 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66 66  trying read buff
ccc0: 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  er");.....return
ccd0: 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66  (cackey_read_buf
cce0: 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62  fer(slot, init_b
ccf0: 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e  uffer, init_coun
cd00: 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f  t, t_or_v, init_
cd10: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29  initial_offset))
cd20: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e  ;...}....if (sen
cd30: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
cd40: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
cd50: 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
cd60: 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66  0x6A86) {.....if
cd70: 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31   (max_count == 1
cd80: 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
cd90: 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63  ....}......max_c
cda0: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74  ount = max_count
cdb0: 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69   / 2;......conti
cdc0: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  nue;....}.....CA
cdd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cde0: 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  F("cackey_send_a
cdf0: 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65  pdu() failed, re
ce00: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
ce10: 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  re");.....return
ce20: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66  (-1);...}....off
ce30: 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09  set += count;...
ce40: 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78  .if (count < max
ce50: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43  _count) {....CAC
ce60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ce70: 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20  ("Short read -- 
ce80: 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b  count = %i, cmd[
ce90: 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20  1] = %i", (int) 
cea0: 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64  count, (int) cmd
ceb0: 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  [1]);.....break;
cec0: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
ced0: 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
cee0: 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
cef0: 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f  SSIZE_MAX..if (o
cf00: 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53  ffset > _POSIX_S
cf10: 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
cf20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cf30: 46 28 22 4f 66 66 73 65 74 20 65 78 63 65 65 64  F("Offset exceed
cf40: 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
cf50: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
cf60: 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
cf70: 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29  i, offset = %lu)
cf80: 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58  ", (long) _POSIX
cf90: 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73  _SSIZE_MAX, (uns
cfa0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73  igned long) offs
cfb0: 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  et);....return(-
cfc0: 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a  1);..}.#  endif.
cfd0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
cfe0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
cff0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
d000: 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74  ss, read %lu byt
d010: 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  es", (unsigned l
d020: 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09  ong) offset);...
d030: 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a  return(offset);.
d040: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
d050: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
d060: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
d070: 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20  t_applet(struct 
d080: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d090: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
d0a0: 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69   *aid, size_t ai
d0b0: 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52  d_len);. *. * AR
d0c0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
d0d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
d0e0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
d0f0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
d100: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
d110: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
d120: 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20  har *aid. *     
d130: 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61      Buffer conta
d140: 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20  ining Applet ID 
d150: 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20  to select. *. * 
d160: 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c      size_t aid_l
d170: 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  en. *         Nu
d180: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
d190: 20 74 68 65 20 22 61 69 64 22 20 28 41 70 70 6c   the "aid" (Appl
d1a0: 65 74 20 49 44 29 20 70 61 72 61 6d 65 74 65 72  et ID) parameter
d1b0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
d1c0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
d1d0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
d1e0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
d1f0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
d200: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
d210: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
d220: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
d230: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
d240: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
d250: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74  select_applet(st
d260: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
d270: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
d280: 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65   char *aid, size
d290: 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69  _t aid_len) {..i
d2a0: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
d2b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d2c0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
d2d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d2e0: 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e  INTBUF("Selectin
d2f0: 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c  g applet:", aid,
d300: 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e   aid_len);...sen
d310: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
d320: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
d330: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
d340: 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
d350: 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41  SELECT, GSCIS_PA
d360: 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45  RAM_SELECT_APPLE
d370: 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e  T, 0x00, aid_len
d380: 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c  , aid, 0x00, NUL
d390: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
d3a0: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
d3b0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
d3c0: 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45  RETRY) {...CACKE
d3d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d3e0: 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69  ADPU Sending fai
d3f0: 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65  led, retrying se
d400: 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a  lect applet");..
d410: 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f  ..return(cackey_
d420: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
d430: 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e  ot, aid, aid_len
d440: 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e  ));..}...if (sen
d450: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
d460: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
d470: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d480: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70  TF("Failed to op
d490: 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72  en applet, retur
d4a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
d4b0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
d4c0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
d4d0: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
d4e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
d4f0: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65  uccessfully sele
d500: 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72  cted file");...r
d510: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
d520: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
d530: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
d540: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
d550: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
d560: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
d570: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36  ot *slot, uint16
d580: 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52  _t ef);. *. * AR
d590: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
d5a0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
d5b0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
d5c0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
d5d0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
d5e0: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65  *     uint16_t e
d5f0: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65  f. *         Ele
d600: 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73  mental File to s
d610: 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55  elect. *. * RETU
d620: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
d630: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
d640: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
d650: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
d660: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
d670: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
d680: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
d690: 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20  This selects an 
d6a0: 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20  Elementary File 
d6b0: 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63  (EF) under the c
d6c0: 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65  urrently selecte
d6d0: 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74  d. *     Dedicat
d6e0: 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a  ed File (DF). *.
d6f0: 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79   *     Typically
d700: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
d710: 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20  after selecting 
d720: 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c  the correct Appl
d730: 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20  et (using. *    
d740: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
d750: 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61  pplet) for VM ca
d760: 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rds. *. */.stati
d770: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
d780: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
d790: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
d7a0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36  ot *slot, uint16
d7b0: 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e  _t ef) {..unsign
d7c0: 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b  ed char fid_buf[
d7d0: 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  2];..int send_re
d7e0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
d7f0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
d800: 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74  .");.../* Open t
d810: 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69  he elementary fi
d820: 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30  le */..fid_buf[0
d830: 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20  ] = (ef >> 8) & 
d840: 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31  0xff;..fid_buf[1
d850: 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a  ] = ef & 0xff;..
d860: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d870: 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20  INTF("Selecting 
d880: 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75  file: %04lx", (u
d890: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66  nsigned long) ef
d8a0: 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20  );...send_ret = 
d8b0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
d8c0: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
d8d0: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
d8e0: 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20  S_INSTR_SELECT, 
d8f0: 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65  0x02, 0x0C, size
d900: 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64  of(fid_buf), fid
d910: 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c  _buf, 0x00, NULL
d920: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
d930: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
d940: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
d950: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
d960: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
d970: 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20  d to open file, 
d980: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
d990: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
d9a0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
d9b0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
d9c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d9d0: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
d9e0: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29   selected file")
d9f0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
da00: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
da10: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
da20: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
da30: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
da40: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
da50: 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a  tity *root);. *.
da60: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
da70: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
da80: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
da90: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f  ot. *         Ro
daa0: 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69  ot of the TLV li
dab0: 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65  st to start free
dac0: 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ing. *. * RETURN
dad0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f   VALUE. *     No
dae0: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ne. *. * NOTES. 
daf0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
db00: 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c  ion frees the TL
db10: 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20  V linked listed 
db20: 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a  returned from. *
db30: 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61       "cackey_rea
db40: 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74  d_tlv". *. */.st
db50: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
db60: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
db70: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
db80: 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72  ty *root) {..str
db90: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
dba0: 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65  ntity *curr, *ne
dbb0: 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d  xt;...if (root =
dbc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
dbd0: 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75  rn;..}...for (cu
dbe0: 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b  rr = root; curr;
dbf0: 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a   curr = next) {.
dc00: 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f  ..next = curr->_
dc10: 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20  next;....switch 
dc20: 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09  (curr->tag) {...
dc30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
dc40: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61  ACR_TABLE:....ca
dc50: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
dc60: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66  TIFICATE:.....if
dc70: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b   (curr->value) {
dc80: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
dc90: 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09  >value);.....}..
dca0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
dcb0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
dcc0: 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72  URL:.....if (cur
dcd0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
dce0: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
dcf0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
dd00: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  l);.....}.....br
dd10: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65  eak;...}....free
dd20: 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74  (curr);..}...ret
dd30: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  urn;.}../*. * SY
dd40: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
dd50: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
dd60: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
dd70: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
dd80: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
dd90: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
dda0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
ddb0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
ddc0: 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  v_entity *cackey
ddd0: 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74  _read_tlv(struct
dde0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
ddf0: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
de00: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
de10: 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72  *curr_entity, *r
de20: 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73  oot = NULL, *las
de30: 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67  t = NULL;..unsig
de40: 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75  ned char tlen_bu
de50: 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31  f[2], tval_buf[1
de60: 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e  024], *tval;..un
de70: 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e  signed char vlen
de80: 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75  _buf[2], vval_bu
de90: 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a  f[8192], *vval;.
dea0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
deb0: 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65  tmpbuf;..unsigne
dec0: 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e  d long tmpbuflen
ded0: 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c  ;..ssize_t tlen,
dee0: 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20   vlen;..ssize_t 
def0: 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f  read_ret;..size_
df00: 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20  t offset_t = 0, 
df10: 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75  offset_v = 0;..u
df20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
df30: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  ;..size_t length
df40: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ;.#ifdef HAVE_LI
df50: 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65  BZ..int uncompre
df60: 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a  ss_ret;.#endif..
df70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
df80: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
df90: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
dfa0: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
dfb0: 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c  (slot, tlen_buf,
dfc0: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66   sizeof(tlen_buf
dfd0: 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b  ), 1, offset_t);
dfe0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
dff0: 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75  = sizeof(tlen_bu
e000: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
e010: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
e020: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
e030: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e040: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e050: 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28  );..}...tlen = (
e060: 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  tlen_buf[1] << 8
e070: 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | tlen_buf[0];
e080: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
e090: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
e0a0: 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c  (slot, vlen_buf,
e0b0: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66   sizeof(vlen_buf
e0c0: 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b  ), 2, offset_v);
e0d0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
e0e0: 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75  = sizeof(vlen_bu
e0f0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
e100: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
e110: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
e120: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e130: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e140: 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28  );..}...vlen = (
e150: 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  vlen_buf[1] << 8
e160: 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | vlen_buf[0];
e170: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e180: 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67  PRINTF("Tag Leng
e190: 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20  th = %lu, Value 
e1a0: 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28  Length = %lu", (
e1b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74  unsigned long) t
e1c0: 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
e1d0: 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66  ong) vlen);...of
e1e0: 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66  fset_t += 2;..of
e1f0: 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69  fset_v += 2;...i
e200: 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (tlen > sizeof
e210: 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (tval_buf)) {...
e220: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e230: 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20  NTF("Tag length 
e240: 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65  is too large, re
e250: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e260: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e270: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
e280: 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76  vlen > sizeof(vv
e290: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
e2a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e2b0: 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69  ("Value length i
e2c0: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
e2d0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e2e0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
e2f0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
e300: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
e310: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
e320: 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31  val_buf, tlen, 1
e330: 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66  , offset_t);..if
e340: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c   (read_ret != tl
e350: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
e360: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
e370: 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
e380: 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74  re T-buffer, ret
e390: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e3a0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
e3b0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
e3c0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
e3d0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
e3e0: 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32  val_buf, vlen, 2
e3f0: 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66  , offset_v);..if
e400: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c   (read_ret != vl
e410: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
e420: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
e430: 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
e440: 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74  re V-buffer, ret
e450: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e460: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
e470: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20  ULL);..}...tval 
e480: 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61  = tval_buf;..vva
e490: 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77  l = vval_buf;..w
e4a0: 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26  hile (tlen > 0 &
e4b0: 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09  & vlen > 0) {...
e4c0: 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74  tag = *tval;...t
e4d0: 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b  val++;...tlen--;
e4e0: 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d  ....if (*tval ==
e4f0: 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67   0xff) {....leng
e500: 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c  th = (tval[2] <<
e510: 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09   8) | tval[1];..
e520: 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09  ..tval += 3;....
e530: 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65  tlen -= 3;...} e
e540: 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  lse {....length 
e550: 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c  = *tval;....tval
e560: 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09  ++;....tlen--;..
e570: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
e580: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20  UG_PRINTF("Tag: 
e590: 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b  %s (%02x)", CACK
e5a0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
e5b0: 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28  G_TO_STR(tag), (
e5c0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
e5d0: 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  g);...CACKEY_DEB
e5e0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c  UG_PRINTBUF("Val
e5f0: 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  ue:", vval, leng
e600: 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74  th);....curr_ent
e610: 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77  ity = NULL;...sw
e620: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09  itch (tag) {....
e630: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
e640: 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72  ARDURL:.....curr
e650: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
e660: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
e670: 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72  tity));.....curr
e680: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
e690: 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28  ardurl = malloc(
e6a0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
e6b0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
e6c0: 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  rl));......memcp
e6d0: 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  y(curr_entity->v
e6e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
e6f0: 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09  d, vval, 5);....
e700: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
e710: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
e720: 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a  type = vval[5];.
e730: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
e740: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
e750: 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c  objectid = (vval
e760: 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [6] << 8) | vval
e770: 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [7];.....curr_en
e780: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
e790: 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76  url->appid = (vv
e7a0: 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[8] << 8) | vv
e7b0: 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72  al[9];......curr
e7c0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
e7d0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
e7e0: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
e7f0: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
e800: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
e810: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09  _ACR_TABLE:.....
e820: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
e830: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
e840: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  r_entity));.....
e850: 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
e860: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65  length);......me
e870: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
e880: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  l, length);.....
e890: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
e8a0: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
e8b0: 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68  r_entity->length
e8c0: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63   = length;.....c
e8d0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
e8e0: 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
e8f0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65  curr_entity->_ne
e900: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  xt = NULL;......
e910: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
e920: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
e930: 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  CATE:.....curr_e
e940: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
e950: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
e960: 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41  ty));..#ifdef HA
e970: 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62  VE_LIBZ.....tmpb
e980: 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a  uflen = length *
e990: 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d   2;.....tmpbuf =
e9a0: 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
e9b0: 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72  n);......uncompr
e9c0: 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70  ess_ret = uncomp
e9d0: 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d  ress(tmpbuf, &tm
e9e0: 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c  pbuflen, vval, l
e9f0: 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28  ength);.....if (
ea00: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21  uncompress_ret !
ea10: 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43  = Z_OK) {......C
ea20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ea30: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65  TF("Failed to de
ea40: 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70  compress, uncomp
ea50: 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20  ress() returned 
ea60: 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20  %i -- resorting 
ea70: 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c  to direct copy",
ea80: 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29   uncompress_ret)
ea90: 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65  ;.......tmpbufle
eaa0: 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
eab0: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
eac0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  vval, length);..
ead0: 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
eae0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
eaf0: 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f  "Decompressed to
eb00: 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62  :", tmpbuf, tmpb
eb10: 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09  uflen);.#else...
eb20: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eb30: 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a  RINTF("Missing Z
eb40: 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69  LIB Support, thi
eb50: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  s certificate is
eb60: 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e   likely useless.
eb70: 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75  ..");......tmpbu
eb80: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
eb90: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
eba0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
ebb0: 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72  .#endif......cur
ebc0: 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20  r_entity->tag = 
ebd0: 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  tag;.....curr_en
ebe0: 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74  tity->length = t
ebf0: 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75  mpbuflen;.....cu
ec00: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
ec10: 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
ec20: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
ec30: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
ec40: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
ec50: 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a  CIS_TAG_PKCS15:.
ec60: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
ec70: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
ec80: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
ec90: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
eca0: 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09  ->tag = tag;....
ecb0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
ecc0: 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b  lue_byte = vval[
ecd0: 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  0];.....curr_ent
ece0: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
ecf0: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
ed00: 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65  .}....vval += le
ed10: 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20  ngth;...vlen -= 
ed20: 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63  length;....if (c
ed30: 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55  urr_entity != NU
ed40: 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f  LL) {....if (roo
ed50: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t == NULL) {....
ed60: 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74  .root = curr_ent
ed70: 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ity;....}.....if
ed80: 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20   (last != NULL) 
ed90: 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78  {.....last->_nex
eda0: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
edb0: 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d  ....}.....last =
edc0: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
edd0: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f  }..}...return(ro
ede0: 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ot);.}../*. * SY
edf0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
ee00: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
ee10: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ee20: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
ee30: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
ee40: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
ee50: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
ee60: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
ee70: 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
ee80: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
ee90: 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f  ty *start, size_
eea0: 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65  t count, int fre
eeb0: 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65  e_start) {..size
eec0: 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74  _t idx;...if (st
eed0: 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
eee0: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
eef0: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
ef00: 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
ef10: 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64  {...if (start[id
ef20: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20  x].certificate) 
ef30: 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b  {....free(start[
ef40: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
ef50: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
ef60: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09  free_start) {...
ef70: 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a  free(start);..}.
ef80: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
ef90: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
efa0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
efb0: 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  *cackey_copy_cer
efc0: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
efd0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
efe0: 64 65 73 74 2c 20 73 74 72 75 63 74 20 63 61 63  dest, struct cac
eff0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f000: 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74  y *start, size_t
f010: 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f   count) {..size_
f020: 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61  t idx;...if (sta
f030: 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
f040: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
f050: 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e  ...if (dest == N
f060: 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20  ULL) {...dest = 
f070: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64  malloc(sizeof(*d
f080: 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09  est) * count);..
f090: 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
f0a0: 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
f0b0: 64 78 2b 2b 29 20 7b 0a 09 09 6d 65 6d 63 70 79  dx++) {...memcpy
f0c0: 28 64 65 73 74 5b 69 64 78 5d 2e 61 70 70 6c 65  (dest[idx].apple
f0d0: 74 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 61 70  t, start[idx].ap
f0e0: 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73  plet, sizeof(des
f0f0: 74 5b 69 64 78 5d 2e 61 70 70 6c 65 74 29 29 3b  t[idx].applet));
f100: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 66 69 6c  ...dest[idx].fil
f110: 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 66  e = start[idx].f
f120: 69 6c 65 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d  ile;...dest[idx]
f130: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
f140: 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65   = start[idx].ce
f150: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
f160: 09 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69  .dest[idx].keysi
f170: 7a 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  ze = start[idx].
f180: 6b 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74  keysize;....dest
f190: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f1a0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b  e = malloc(dest[
f1b0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
f1c0: 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28  _len);...memcpy(
f1d0: 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
f1e0: 69 63 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78  icate, start[idx
f1f0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 64  ].certificate, d
f200: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
f210: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  cate_len);..}...
f220: 72 65 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a  return(dest);.}.
f230: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
f240: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
f250: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
f260: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
f270: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
f280: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
f290: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
f2a0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
f2b0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f2c0: 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61  tity *cackey_rea
f2d0: 64 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63  d_certs(struct c
f2e0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
f2f0: 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
f300: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
f310: 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  erts, unsigned l
f320: 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73  ong *count) {..s
f330: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
f340: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72  c_identity *curr
f350: 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63  _id;..struct cac
f360: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
f370: 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75  ccc_tlv, *ccc_cu
f380: 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61  rr, *app_tlv, *a
f390: 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e  pp_curr;..unsign
f3a0: 65 64 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b  ed char ccc_aid[
f3b0: 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43  ] = {GSCIS_AID_C
f3c0: 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d  CC}, piv_aid[] =
f3d0: 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33   {NISTSP800_73_3
f3e0: 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69  _PIV_AID};..unsi
f3f0: 67 6e 65 64 20 63 68 61 72 20 2a 70 69 76 5f 6f  gned char *piv_o
f400: 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76 61  id, piv_oid_piva
f410: 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  uth[] = {NISTSP8
f420: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41  00_73_3_OID_PIVA
f430: 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69  UTH}, piv_oid_si
f440: 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53  gnature[] = {NIS
f450: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
f460: 53 49 47 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f  SIGNATURE}, piv_
f470: 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b  oid_keymgt[] = {
f480: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
f490: 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73  ID_KEYMGT};..uns
f4a0: 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f  igned char curr_
f4b0: 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65  aid[7];..unsigne
f4c0: 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 38 31  d char buffer[81
f4d0: 39 32 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  92];..unsigned l
f4e0: 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a  ong outidx = 0;.
f4f0: 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e  .cackey_ret tran
f500: 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73  saction_ret;..ss
f510: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
f520: 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a  .int certs_resiz
f530: 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  able;..int send_
f540: 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b  ret, select_ret;
f550: 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70  ..int piv_key, p
f560: 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78  iv = 0;..int idx
f570: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
f580: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
f590: 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20  ");...if (count 
f5a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
f5b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f5c0: 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c  ("count is NULL,
f5d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
f5e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
f5f0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
f600: 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c  f (certs != NULL
f610: 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74  ) {...if (*count
f620: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   == 0) {....CACK
f630: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f640: 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65  "Requested we re
f650: 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20  turn 0 objects, 
f660: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b  short-circuit");
f670: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
f680: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  s);...}..}...if 
f690: 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73  (!slot->slot_res
f6a0: 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74  et) {...if (slot
f6b0: 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ->cached_certs) 
f6c0: 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d  {....if (certs =
f6d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65  = NULL) {.....ce
f6e0: 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rts = malloc(siz
f6f0: 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c  eof(*certs) * sl
f700: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
f710: 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f  _count);.....*co
f720: 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68  unt = slot->cach
f730: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
f740: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
f750: 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c  .if (*count > sl
f760: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
f770: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a  _count) {......*
f780: 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61  count = slot->ca
f790: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
f7a0: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
f7b0: 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  .cackey_copy_cer
f7c0: 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ts(certs, slot->
f7d0: 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63  cached_certs, *c
f7e0: 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  ount);.....retur
f7f0: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
f800: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63  ...if (slot->cac
f810: 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63  hed_certs) {...c
f820: 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
f830: 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
f840: 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65  rts, slot->cache
f850: 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31  d_certs_count, 1
f860: 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68  );....slot->cach
f870: 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
f880: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
f890: 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
f8a0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
f8b0: 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
f8c0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
f8d0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
f8e0: 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
f8f0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
f900: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
f910: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f920: 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
f930: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
f940: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
f950: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
f960: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
f970: 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
f980: 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
f990: 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
f9a0: 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
f9b0: 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
f9c0: 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
f9d0: 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
f9e0: 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
f9f0: 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
fa00: 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
fa10: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
fa20: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
fa30: 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
fa40: 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
fa50: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
fa60: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
fa70: 0a 09 09 2f 2a 20 54 72 79 20 50 49 56 20 61 70  .../* Try PIV ap
fa80: 70 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73  plication */...s
fa90: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
faa0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
fab0: 6c 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69  lot, piv_aid, si
fac0: 7a 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a  zeof(piv_aid));.
fad0: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
fae0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
faf0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
fb00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
fb10: 20 68 61 76 65 20 61 20 50 49 56 20 63 61 72 64   have a PIV card
fb20: 20 2d 2d 20 6e 6f 74 20 75 73 69 6e 67 20 74 68   -- not using th
fb30: 65 20 43 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70  e CCC, pulling p
fb40: 72 65 2d 73 65 6c 65 63 74 65 64 20 6b 65 79 73  re-selected keys
fb50: 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b  ");.....piv = 1;
fb60: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 0a 09 09 09  ...} else {.....
fb70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fb80: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
fb90: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
fba0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
fbb0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a  ailure");...../*
fbc0: 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74   Terminate Smart
fbd0: 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  Card Transaction
fbe0: 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   */....cackey_en
fbf0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
fc00: 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ot);.....return(
fc10: 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  NULL);...}..}...
fc20: 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72  if (piv) {...for
fc30: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
fc40: 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09   3; idx++) {....
fc50: 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09  switch (idx) {..
fc60: 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09  ...case 0:......
fc70: 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69  piv_oid = piv_oi
fc80: 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09  d_pivauth;......
fc90: 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50  piv_key = NISTSP
fca0: 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56  800_78_3_KEY_PIV
fcb0: 41 55 54 48 3b 0a 09 09 09 09 09 62 72 65 61 6b  AUTH;......break
fcc0: 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09  ;.....case 1:...
fcd0: 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
fce0: 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a  _oid_signature;.
fcf0: 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e  .....piv_key = N
fd00: 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45  ISTSP800_78_3_KE
fd10: 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09  Y_SIGNATURE;....
fd20: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
fd30: 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 2:......piv_oi
fd40: 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  d = piv_oid_keym
fd50: 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79  gt;......piv_key
fd60: 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f   = NISTSP800_78_
fd70: 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09  3_KEY_KEYMGT;...
fd80: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
fd90: 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
fda0: 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c  ckey_get_data(sl
fdb0: 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65  ot, buffer, size
fdc0: 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f  of(buffer), piv_
fdd0: 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  oid);.....if (re
fde0: 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
fdf0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
fe00: 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20  }.....curr_id = 
fe10: 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a  &certs[outidx];.
fe20: 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
fe30: 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a  .curr_id->keysiz
fe40: 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f  e = -1;....curr_
fe50: 69 64 2d 3e 66 69 6c 65 20 3d 20 30 78 46 46 46  id->file = 0xFFF
fe60: 46 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 61  F;....curr_id->a
fe70: 70 70 6c 65 74 5b 30 5d 20 3d 20 70 69 76 5f 6b  pplet[0] = piv_k
fe80: 65 79 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ey;.....curr_id-
fe90: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
fea0: 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09   = read_ret;....
feb0: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
fec0: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
fed0: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
fee0: 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  te_len);....memc
fef0: 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  py(curr_id->cert
ff00: 69 66 69 63 61 74 65 2c 20 62 75 66 66 65 72 20  ificate, buffer 
ff10: 2b 20 34 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  + 4, curr_id->ce
ff20: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 2d 20  rtificate_len - 
ff30: 34 29 3b 20 2f 2a 20 58 58 58 20 54 4f 44 4f 20  4); /* XXX TODO 
ff40: 50 49 56 20 28 2d 34 20 68 65 61 64 65 72 2c 20  PIV (-4 header, 
ff50: 2d 35 20 74 72 61 69 6c 65 72 20 3d 3d 20 77 68  -5 trailer == wh
ff60: 79 20 3f 29 20 2a 2f 0a 09 09 09 63 75 72 72 5f  y ?) */....curr_
ff70: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
ff80: 6c 65 6e 20 2d 3d 20 34 3b 0a 09 09 09 63 75 72  len -= 4;....cur
ff90: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
ffa0: 65 5f 6c 65 6e 20 2d 3d 20 35 3b 0a 09 09 7d 0a  e_len -= 5;...}.
ffb0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52  .} else {.../* R
ffc0: 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
ffd0: 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
ffe0: 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f  's TLV */...ccc_
fff0: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
10000 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
10010 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
10020 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
10030 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
10040 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63  ets */...for (cc
10050 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
10060 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
10070 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
10080 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43  >_next) {....CAC
10090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
100a0 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20  ("Found tag: %s 
100b0 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45  ... ", CACKEY_DE
100c0 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
100d0 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  STR(ccc_curr->ta
100e0 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63  g));.....if (ccc
100f0 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
10100 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
10110 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10120 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
10130 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
10140 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
10150 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a  t CARDURLs)");..
10160 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10170 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f  .}.....if ((ccc_
10180 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10190 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
101a0 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
101b0 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
101c0 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09  _APP_PKI) {.....
101d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
101e0 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
101f0 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
10200 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
10210 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
10220 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
10230 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
10240 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
10250 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
10260 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10270 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
10280 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
10290 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
102a0 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
102b0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
102c0 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
102d0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
102e0 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
102f0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
10300 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
10310 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10320 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43  l->rid));....CAC
10330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10340 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34  ("AppID = %s/%04
10350 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
10360 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
10370 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
10380 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10390 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
103a0 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
103b0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
103c0 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  pid);....CACKEY_
103d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62  DEBUG_PRINTF("Ob
103e0 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c  jectID = %s/%04l
103f0 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
10400 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
10410 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
10420 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
10430 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ctid), (unsigned
10440 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
10450 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10460 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d  objectid);.....m
10470 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
10480 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10490 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
104a0 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
104b0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
104c0 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64  d));....curr_aid
104d0 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
104e0 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
104f0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10500 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
10510 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61   0xff;....curr_a
10520 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
10530 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
10540 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10550 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
10560 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
10570 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
10580 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
10590 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
105a0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
105b0 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
105c0 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69  curr_aid));....i
105d0 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
105e0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
105f0 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
10600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
10610 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61  iled to select a
10620 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  pplet, skipping 
10630 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
10640 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
10650 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
10660 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  ...../* ... and 
10670 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
10680 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
10690 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
106a0 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
106b0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
106c0 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
106d0 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
106e0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
106f0 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
10700 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10710 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74  Failed to select
10720 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20   file, skipping 
10730 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
10740 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
10750 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
10760 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20  ...../* Process 
10770 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20  this file's TLV 
10780 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74  looking for cert
10790 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61  ificates */....a
107a0 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
107b0 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
107c0 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75  .....for (app_cu
107d0 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
107e0 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
107f0 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
10800 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  xt) {.....CACKEY
10810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
10820 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
10830 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
10840 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
10850 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
10860 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74  .if (app_curr->t
10870 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
10880 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
10890 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
108a0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
108b0 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
108c0 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
108d0 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
108e0 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
108f0 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f  ....}......curr_
10900 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
10910 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b  dx];.....outidx+
10920 2b 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  +;......memcpy(c
10930 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
10940 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
10950 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
10960 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  ));.....curr_id-
10970 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72  >file = ccc_curr
10980 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
10990 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 09 63  >objectid;.....c
109a0 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20  urr_id->keysize 
109b0 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45  = -1;......CACKE
109c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
109d0 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
109e0 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  >applet (%p) wit
109f0 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
10a00 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
10a10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
10a20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
10a30 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41  applet));.....CA
10a40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10a50 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72  BUF("VAL:", curr
10a60 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a  _id->applet, siz
10a70 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
10a80 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75 72 72  let));......curr
10a90 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10aa0 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d  _len = app_curr-
10ab0 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75  >length;......cu
10ac0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10ad0 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
10ae0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10af0 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
10b00 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  y(curr_id->certi
10b10 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72  ficate, app_curr
10b20 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64  ->value, curr_id
10b30 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10b40 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 75 74  n);......if (out
10b50 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
10b60 0a 09 09 09 09 09 69 66 20 28 63 65 72 74 73 5f  ......if (certs_
10b70 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09  resizable) {....
10b80 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a  ...*count *= 2;.
10b90 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65  ......certs = re
10ba0 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a  alloc(certs, siz
10bb0 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a  eof(*certs) * (*
10bc0 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 7d 20  count));......} 
10bd0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65  else {.......bre
10be0 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
10bf0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
10c00 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c  _free_tlv(app_tl
10c10 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69  v);.....if (outi
10c20 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a  dx >= *count) {.
10c30 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
10c40 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
10c50 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b  ee_tlv(ccc_tlv);
10c60 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f  ..}...*count = o
10c70 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72  utidx;...if (cer
10c80 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
10c90 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f  ..certs = reallo
10ca0 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28  c(certs, sizeof(
10cb0 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e  *certs) * (*coun
10cc0 74 29 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  t));..}...slot->
10cd0 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 63  cached_certs = c
10ce0 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73  ackey_copy_certs
10cf0 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63  (NULL, certs, *c
10d00 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61  ount);..slot->ca
10d10 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
10d20 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20   = *count;.../* 
10d30 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
10d40 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
10d50 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
10d60 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
10d70 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73  ;...return(certs
10d80 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
10d90 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
10da0 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
10db0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10dc0 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
10dd0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
10de0 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
10df0 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
10e00 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67  ize_t cackey_sig
10e10 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20  ndecrypt(struct 
10e20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
10e30 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
10e40 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
10e50 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
10e60 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  ar *buf, size_t 
10e70 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  buflen, unsigned
10e80 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73   char *outbuf, s
10e90 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c  ize_t outbuflen,
10ea0 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69   int padInput, i
10eb0 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20  nt unpadOutput) 
10ec0 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
10ed0 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
10ee0 74 65 5b 31 30 5d 3b 0a 09 75 6e 73 69 67 6e 65  te[10];..unsigne
10ef0 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20  d char *tmpbuf, 
10f00 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62  *tmpbuf_s, *outb
10f10 75 66 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  uf_s;..unsigned 
10f20 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65  char bytes_to_se
10f30 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09  nd, p1, class;..
10f40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c  unsigned char bl
10f50 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  ocktype;..cackey
10f60 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  _ret send_ret;..
10f70 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
10f80 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76  e;..ssize_t retv
10f90 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66  al = 0, unpadoff
10fa0 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70  set;..size_t tmp
10fb0 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20  buflen, padlen, 
10fc0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69  tmpoutbuflen;..i
10fd0 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  nt free_tmpbuf =
10fe0 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 09 69 6e   0;..int le;..in
10ff0 74 20 70 69 76 3b 0a 0a 09 43 41 43 4b 45 59 5f  t piv;...CACKEY_
11000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
11010 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
11020 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lot == NULL) {..
11030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11040 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c  INTF("Error.  sl
11050 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ot is NULL");...
11060 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
11070 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c  ..if (buf == NUL
11080 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
11090 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
110a0 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22  r.  buf is NULL"
110b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
110c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75  ;..}...if (outbu
110d0 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  f == NULL) {...C
110e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
110f0 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62  TF("Error.  outb
11100 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
11110 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
11120 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d  ..if (identity =
11130 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
11140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11150 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
11160 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
11170 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
11180 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
11190 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20  csc_identity == 
111a0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
111b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
111c0 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
111d0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
111e0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
111f0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  urn(-1);..}.../*
11200 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74   Determine ident
11210 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a  ity Key size */.
11220 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
11230 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
11240 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69  ysize < 0) {...i
11250 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11260 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
11270 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a  = x509_to_keysiz
11280 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  e(identity->pcsc
11290 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
112a0 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79  ficate, identity
112b0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
112c0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
112d0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d  );..}.../* Pad m
112e0 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69  essage to key si
112f0 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e  ze */..if (padIn
11300 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65  put) {...if (ide
11310 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
11320 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20  tity->keysize > 
11330 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c  0) {....if (bufl
11340 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e  en != identity->
11350 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
11360 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66  eysize) {.....if
11370 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e   (buflen > (iden
11380 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11390 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33  ity->keysize + 3
113a0 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  )) {......CACKEY
113b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
113c0 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69  rror.  Message i
113d0 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73  s too large to s
113e0 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a  ign/decrypt");..
113f0 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
11400 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62  .....}......tmpb
11410 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  uflen = identity
11420 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
11430 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d  >keysize;.....tm
11440 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
11450 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72  pbuflen);.....fr
11460 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a  ee_tmpbuf = 1;..
11470 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70  ....padlen = tmp
11480 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20  buflen - buflen 
11490 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41  - 3;....../* RSA
114a0 20 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43   PKCS#1 EMSA-PKC
114b0 53 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20  S1-v1_5 Padding 
114c0 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d  */.....tmpbuf[0]
114d0 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70   = 0x00;.....tmp
114e0 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09  buf[1] = 0x01;..
114f0 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75  ...memset(&tmpbu
11500 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c  f[2], 0xFF, padl
11510 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b  en);.....tmpbuf[
11520 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30  padlen + 2]= 0x0
11530 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74  0;.....memcpy(&t
11540 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33  mpbuf[padlen + 3
11550 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ], buf, buflen);
11560 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11570 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70  UG_PRINTBUF("Unp
11580 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75  added:", buf, bu
11590 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45  flen);.....CACKE
115a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
115b0 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62  ("Padded:", tmpb
115c0 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  uf, tmpbuflen);.
115d0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
115e0 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
115f0 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
11600 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74  flen;.....free_t
11610 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70  mpbuf = 0;.....p
11620 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a  adlen = 0;....}.
11630 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
11640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11650 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74  F("Unable to det
11660 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c  ermine key size,
11670 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73   hoping the mess
11680 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20  age is properly 
11690 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74  padded!");.....t
116a0 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09  mpbuf = buf;....
116b0 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
116c0 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62  en;....free_tmpb
116d0 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65  uf = 0;....padle
116e0 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n = 0;...}..} el
116f0 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20  se {...tmpbuf = 
11700 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  buf;...tmpbuflen
11710 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65   = buflen;...fre
11720 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
11730 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a  padlen = 0;..}..
11740 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61  ./* Begin transa
11750 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
11760 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
11770 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 44  on(slot);.../* D
11780 65 74 65 72 6d 69 6e 65 20 74 79 70 65 20 6f 66  etermine type of
11790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
117a0 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
117b0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69  csc_identity->fi
117c0 6c 65 20 3d 3d 20 30 78 46 46 46 46 29 20 7b 0a  le == 0xFFFF) {.
117d0 09 09 70 69 76 20 3d 20 31 3b 0a 09 7d 20 65 6c  ..piv = 1;..} el
117e0 73 65 20 7b 0a 09 09 70 69 76 20 3d 20 30 3b 0a  se {...piv = 0;.
117f0 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63  .}.../* Select c
11800 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f  orrect applet */
11810 0a 09 69 66 20 28 21 70 69 76 29 20 7b 0a 09 09  ..if (!piv) {...
11820 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11830 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61  NTF("Selecting a
11840 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 25  pplet found at %
11850 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79  p ...", identity
11860 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
11870 3e 61 70 70 6c 65 74 29 3b 0a 09 09 63 61 63 6b  >applet);...cack
11880 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
11890 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d  (slot, identity-
118a0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
118b0 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69  applet, sizeof(i
118c0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
118d0 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 29  entity->applet))
118e0 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 63  ;..../* Select c
118f0 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09  orrect file */..
11900 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66  .cackey_select_f
11910 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  ile(slot, identi
11920 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11930 79 2d 3e 66 69 6c 65 29 3b 0a 09 7d 20 65 6c 73  y->file);..} els
11940 65 20 7b 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74  e {...dyn_auth_t
11950 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37  emplate[0] = 0x7
11960 43 3b 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  C;...dyn_auth_te
11970 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38 32  mplate[1] = 0x82
11980 3b 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ;...dyn_auth_tem
11990 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70  plate[2] = ((tmp
119a0 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78  buflen + 6) & 0x
119b0 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 64 79  ff00) >> 8;...dy
119c0 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
119d0 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20  3] = (tmpbuflen 
119e0 2b 20 36 29 20 26 20 30 78 30 30 66 66 3b 0a 09  + 6) & 0x00ff;..
119f0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
11a00 74 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[4] = 0x82;...
11a10 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
11a20 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 64  e[5] = 0x00;...d
11a30 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
11a40 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 64 79  [6] = 0x81;...dy
11a50 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
11a60 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 64 79 6e  7] = 0x82;...dyn
11a70 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38  _auth_template[8
11a80 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26  ] = (tmpbuflen &
11a90 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
11aa0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
11ab0 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65  te[9] = tmpbufle
11ac0 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 73  n & 0x00ff;....s
11ad0 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
11ae0 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
11af0 20 30 78 31 30 2c 20 4e 49 53 54 53 50 38 30 30   0x10, NISTSP800
11b00 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41  _73_3_INSTR_GENA
11b10 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  UTH, NISTSP800_7
11b20 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38  8_3_ALGO_RSA2048
11b30 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
11b40 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65  _identity->apple
11b50 74 5b 30 5d 2c 20 73 69 7a 65 6f 66 28 64 79 6e  t[0], sizeof(dyn
11b60 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c  _auth_template),
11b70 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
11b80 74 65 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  te, 0x00, NULL, 
11b90 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a  NULL, NULL);..}.
11ba0 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
11bb0 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d  buf;..outbuf_s =
11bc0 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20   outbuf;..while 
11bd0 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
11be0 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
11bf0 32 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  245) {....bytes_
11c00 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09  to_send = 245;..
11c10 09 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 09  ..if (piv) {....
11c20 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a 09  .class = 0x10;..
11c30 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
11c40 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 31  .} else {.....p1
11c50 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 6c 65 20   = 0x80;.....le 
11c60 3d 20 30 78 30 30 3b 0a 09 09 09 7d 0a 09 09 7d  = 0x00;....}...}
11c70 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73   else {....bytes
11c80 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75  _to_send = tmpbu
11c90 66 6c 65 6e 3b 0a 09 09 09 69 66 20 28 70 69 76  flen;....if (piv
11ca0 29 20 7b 0a 09 09 09 09 63 6c 61 73 73 20 3d 20  ) {.....class = 
11cb0 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
11cc0 38 31 36 3b 0a 09 09 09 09 6c 65 20 3d 20 32 35  816;.....le = 25
11cd0 36 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  6;....} else {..
11ce0 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09  ...p1 = 0x00;...
11cf0 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09  ..le = 0x00;....
11d00 7d 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62  }...}....tmpoutb
11d10 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65  uflen = outbufle
11d20 6e 3b 0a 0a 09 09 69 66 20 28 70 69 76 29 20 7b  n;....if (piv) {
11d30 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
11d40 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
11d50 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53  slot, class, NIS
11d60 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54  TSP800_73_3_INST
11d70 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53  R_GENAUTH, NISTS
11d80 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
11d90 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79  SA2048, identity
11da0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
11db0 3e 61 70 70 6c 65 74 5b 30 5d 2c 20 62 79 74 65  >applet[0], byte
11dc0 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75  s_to_send, tmpbu
11dd0 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65  f, le, &respcode
11de0 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75  , outbuf, &tmpou
11df0 74 62 75 66 6c 65 6e 29 3b 0a 09 09 7d 20 65 6c  tbuflen);...} el
11e00 73 65 20 7b 0a 09 09 09 73 65 6e 64 5f 72 65 74  se {....send_ret
11e10 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
11e20 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
11e30 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
11e40 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53  TFORM, GSCIS_INS
11e50 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20  TR_SIGNDECRYPT, 
11e60 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f  p1, 0x00, bytes_
11e70 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c  to_send, tmpbuf,
11e80 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20   le, &respcode, 
11e90 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62  outbuf, &tmpoutb
11ea0 75 66 6c 65 6e 29 3b 0a 09 09 7d 0a 09 09 69 66  uflen);...}...if
11eb0 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
11ec0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
11ed0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
11ee0 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
11ef0 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d  ending Failed --
11f00 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
11f10 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28  ror.");.....if (
11f20 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09  free_tmpbuf) {..
11f30 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
11f40 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70   {......free(tmp
11f50 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09  buf_s);.....}...
11f60 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72  .}...../* End tr
11f70 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
11f80 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
11f90 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
11fa0 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
11fb0 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09  = 0x6982) {.....
11fc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11fd0 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74  NTF("Security st
11fe0 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66  atus not satisif
11ff0 69 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ied.  Returning 
12000 4e 45 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09  NEEDLOGIN");....
12010 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
12020 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
12030 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  ....slot->token_
12040 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
12050 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09  N_REQUIRED;.....
12060 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
12070 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
12080 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73  ;....}.....if (s
12090 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
120a0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
120b0 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43 4b  SENT) {.....CACK
120c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
120d0 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20  "Token absent.  
120e0 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41  Returning TOKENA
120f0 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61  BSENT");......ca
12100 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
12110 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  eset(slot);.....
12120 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
12130 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
12140 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  T);....}.....ret
12150 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
12160 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f  tmpbuf += bytes_
12170 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75  to_send;...tmpbu
12180 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  flen -= bytes_to
12190 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66  _send;....outbuf
121a0 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
121b0 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d  ;...outbuflen -=
121c0 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
121d0 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75  .retval += tmpou
121e0 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66  tbuflen;..}...if
121f0 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b   (free_tmpbuf) {
12200 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
12210 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75   {....free(tmpbu
12220 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f  f_s);...}..}...o
12230 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73  utbuf = outbuf_s
12240 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ;.../* End trans
12250 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
12260 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
12270 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66  n(slot);..#ifdef
12280 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
12290 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
122a0 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
122b0 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53  outbuflen > _POS
122c0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
122d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
122e0 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e  RINTF("Outbuflen
122f0 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
12300 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
12310 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
12320 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66  ax = %li, outbuf
12330 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  len = %lu)", (lo
12340 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
12350 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
12360 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29  long) outbuflen)
12370 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
12380 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
12390 64 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74  dif.../* We must
123a0 20 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22   remove the "7C"
123b0 20 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74   tag to get to t
123c0 68 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a  he signature */.
123d0 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 69 66  .if (piv) {...if
123e0 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30   (outbuf[0] != 0
123f0 78 37 43 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  x7C) {....CACKEY
12400 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12410 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56  esponse from PIV
12420 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55   for GENERATE AU
12430 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73  THENTICATION was
12440 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c   not a 0x7C tag,
12450 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
12460 69 6c 75 72 65 22 29 3b 0a 0a 0a 09 09 09 72 65  ilure");......re
12470 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
12480 09 2f 2a 20 58 58 58 20 54 4f 44 4f 20 50 49 56  ./* XXX TODO PIV
12490 20 2a 2f 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75   */...memmove(ou
124a0 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 38  tbuf, outbuf + 8
124b0 2c 20 72 65 74 76 61 6c 20 2d 20 38 29 3b 0a 09  , retval - 8);..
124c0 09 72 65 74 76 61 6c 20 2d 3d 20 38 3b 0a 09 7d  .retval -= 8;..}
124d0 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c  .../* Unpad repl
124e0 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f  y */..if (unpadO
124f0 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72  utput) {...if (r
12500 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09  etval < 3) {....
12510 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12520 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f  NTF("Reply is to
12530 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20  o small, we are 
12540 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61  not able to unpa
12550 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  d -- passing bac
12560 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
12570 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
12580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12590 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
125a0 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
125b0 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
125c0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
125d0 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
125e0 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  tval);...}....if
125f0 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30   (outbuf[0] != 0
12600 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  x00) {....CACKEY
12610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
12620 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64  nrecognized padd
12630 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61  ing scheme -- pa
12640 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68  ssing back and h
12650 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oping for the be
12660 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45  st!");.....CACKE
12670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12680 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
12690 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
126a0 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
126b0 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09  ng) retval);....
126c0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
126d0 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65  ..}....blocktype
126e0 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09   = outbuf[1];...
126f0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b  unpadoffset = 0;
12700 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63  ....switch (bloc
12710 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  ktype) {....case
12720 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61   0x00:...../* Pa
12730 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20  dding Scheme 1, 
12740 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65  the first non-ze
12750 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73  ro byte is the s
12760 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a  tart of data */.
12770 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
12780 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
12790 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
127a0 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
127b0 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
127c0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
127d0 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62   0x00) {.......b
127e0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
127f0 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
12800 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09  .case 0x01:.....
12810 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
12820 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61  e 2, pad bytes a
12830 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64  re 0xFF followed
12840 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09   by 0x00 */.....
12850 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
12860 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
12870 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
12880 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
12890 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
128a0 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46  adoffset] != 0xF
128b0 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f  F) {.......if (o
128c0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
128d0 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
128e0 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
128f0 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61  ++;.........brea
12900 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  k;.......} else 
12910 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  {........CACKEY_
12920 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
12930 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
12940 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
12950 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
12960 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
12970 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30   0x00 found 0x%0
12980 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
12990 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
129a0 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
129b0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
129c0 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
129d0 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
129e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
129f0 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64  nvalid padding d
12a00 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  ata found, retur
12a10 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c  ning in failure,
12a20 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
12a30 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25  n 0xFF found 0x%
12a40 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  02x", (unsigned 
12a50 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61  int) outbuf[unpa
12a60 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09  doffset]);......
12a70 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
12a80 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
12a90 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
12aa0 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  02:...../* Paddi
12ab0 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64  ng Scheme 3, pad
12ac0 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a   bytes are non-z
12ad0 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62  ero first zero b
12ae0 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65  yte found is the
12af0 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20   seperator byte 
12b00 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
12b10 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
12b20 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
12b30 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
12b40 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
12b50 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
12b60 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   == 0x00) {.....
12b70 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
12b80 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
12b90 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
12ba0 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
12bb0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20   (unpadoffset > 
12bc0 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43  retval) {....CAC
12bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12be0 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72  ("Offset greater
12bf0 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65   than reply size
12c00 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e  , aborting.  (un
12c10 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c  padoffset = %lu,
12c20 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c   retval = %lu)",
12c30 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12c40 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75   unpadoffset, (u
12c50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
12c60 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
12c70 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  n(-1);...}....CA
12c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12c90 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f  BUF("Padded:", o
12ca0 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
12cb0 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70  ...retval -= unp
12cc0 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d  adoffset;...memm
12cd0 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62  ove(outbuf, outb
12ce0 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74  uf + unpadoffset
12cf0 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41  , retval);....CA
12d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12d10 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
12d20 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
12d30 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44  ;..}....CACKEY_D
12d40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
12d50 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
12d60 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
12d70 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
12d80 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
12d90 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
12da0 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
12db0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
12dc0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
12dd0 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
12de0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
12df0 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
12e00 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
12e10 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
12e20 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  t cackey_login(s
12e30 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
12e40 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
12e50 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
12e60 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
12e70 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72  en, int *tries_r
12e80 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75  emaining_p) {..u
12e90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63  nsigned char cac
12ea0 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c  _pin[8] = {0xFF,
12eb0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
12ec0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
12ed0 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e  xFF, 0xFF};..uin
12ee0 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63  t16_t response_c
12ef0 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f  ode;..int tries_
12f00 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20  remaining;..int 
12f10 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b  send_ret;..int k
12f20 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30  ey_reference = 0
12f30 78 30 30 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61  x00;.../* Indica
12f40 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  te that we do no
12f50 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77  t know about how
12f60 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20   many tries are 
12f70 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66  remaining */..if
12f80 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   (tries_remainin
12f90 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f  g_p) {...*tries_
12fa0 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31  remaining_p = -1
12fb0 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65  ;..}.../* Appare
12fc0 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61  ntly, CAC PINs a
12fd0 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62  re *EXACTLY* 8 b
12fe0 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64  ytes long -- pad
12ff0 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f   with 0xFF if to
13000 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
13010 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a  pin_len >= 8) {.
13020 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e  ..memcpy(cac_pin
13030 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c  , pin, 8);..} el
13040 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  se {...memcpy(ca
13050 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f  c_pin, pin, pin_
13060 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73  len);..}.../* Is
13070 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a  sue PIN Verify *
13080 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
13090 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
130a0 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
130b0 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
130c0 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78  INSTR_VERIFY, 0x
130d0 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  00, key_referenc
130e0 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69  e, sizeof(cac_pi
130f0 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30  n), cac_pin, 0x0
13100 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64  0, &response_cod
13110 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  e, NULL, NULL);.
13120 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
13130 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
13140 4b 20 26 26 20 72 65 73 70 6f 6e 73 65 5f 63 6f  K && response_co
13150 64 65 20 3d 3d 20 30 78 36 41 38 38 29 20 7b 0a  de == 0x6A88) {.
13160 09 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20  ..key_reference 
13170 3d 20 30 78 38 30 3b 0a 0a 09 09 73 65 6e 64 5f  = 0x80;....send_
13180 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
13190 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
131a0 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
131b0 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  , GSCIS_INSTR_VE
131c0 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f  RIFY, 0x00, key_
131d0 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f  reference, sizeo
131e0 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f  f(cac_pin), cac_
131f0 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70  pin, 0x00, &resp
13200 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c  onse_code, NULL,
13210 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20   NULL);..}...if 
13220 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
13230 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
13240 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65  ...if ((response
13250 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20  _code & 0x63C0) 
13260 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09  == 0x63C0) {....
13270 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
13280 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  = (response_code
13290 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43   & 0xF);.....CAC
132a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
132b0 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
132c0 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72  on failed, %i tr
132d0 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20  ies remaining", 
132e0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
132f0 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f  ;.....if (tries_
13300 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
13310 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
13320 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65  ing_p = tries_re
13330 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09  maining;....}...
13340 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
13350 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
13360 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f  ..}....if (respo
13370 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39  nse_code == 0x69
13380 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  83) {....CACKEY_
13390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
133a0 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
133b0 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73  ailed, device is
133c0 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72   locked");.....r
133d0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
133e0 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  C_E_LOCKED);...}
133f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13400 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
13410 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
13420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
13430 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   Verification su
13440 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
13450 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
13460 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
13470 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
13480 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
13490 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
134a0 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
134b0 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
134c0 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
134d0 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
134e0 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
134f0 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
13500 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
13510 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63  slot *slot) {..c
13520 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63  ackey_ret pcsc_c
13530 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f  onnect_ret;..DWO
13540 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20  RD reader_len = 
13550 30 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72  0, state = 0, pr
13560 6f 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f  otocol = 0, atr_
13570 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d  len;..BYTE atr[M
13580 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c  AX_ATR_SIZE];..L
13590 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20  ONG status_ret, 
135a0 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
135b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
135c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
135d0 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ");...if (slot->
135e0 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41  internal) {...CA
135f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13600 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
13610 65 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65  en present (inte
13620 72 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a  rnal token)");..
13630 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
13640 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
13650 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  ENT);..}...pcsc_
13660 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
13670 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
13680 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63  d(slot);..if (pc
13690 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
136a0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
136b0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
136c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
136d0 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  ble to connect t
136e0 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
136f0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
13700 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
13710 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
13720 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72  BSENT);..}...atr
13730 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
13740 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20  r);..status_ret 
13750 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
13760 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e  ot->pcsc_card, N
13770 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e  ULL, &reader_len
13780 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f  , &state, &proto
13790 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c  col, atr, &atr_l
137a0 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75  en);...if (statu
137b0 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  s_ret == SCARD_E
137c0 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29  _INVALID_HANDLE)
137d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
137e0 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 53  G_PRINTF("SCardS
137f0 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64  tatus() returned
13800 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
13810 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67  _HANDLE, marking
13820 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
13830 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72  connected and tr
13840 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09  ying again");...
13850 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
13860 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
13870 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
13880 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
13890 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
138a0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
138b0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
138c0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
138d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
138e0 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
138f0 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
13900 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
13910 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65  absent");.....re
13920 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13930 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
13940 0a 09 09 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20  ...}....atr_len 
13950 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09  = sizeof(atr);..
13960 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
13970 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
13980 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
13990 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
139a0 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
139b0 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
139c0 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73  ..}...if (status
139d0 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
139e0 53 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63  SUCCESS) {...cac
139f0 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
13a00 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66  set(slot);....if
13a10 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20   (status_ret == 
13a20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
13a30 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  RD) {....CACKEY_
13a40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13a50 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c  set required, pl
13a60 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a  ease hold...");.
13a70 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e  ....scard_reconn
13a80 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
13a90 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
13aa0 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  t, SCARD_PROTOCO
13ab0 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f  L_T0 | SCARD_PRO
13ac0 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f  TOCOL_T1, &proto
13ad0 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61  col);....if (sca
13ae0 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d  rd_reconn_ret ==
13af0 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
13b00 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74  ) {...../* Updat
13b10 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09  e protocol */...
13b20 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  ..slot->protocol
13b30 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09   = protocol;....
13b40 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73  ../* Re-establis
13b50 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  h transaction, i
13b60 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74  f it was present
13b70 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74   */.....if (slot
13b80 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
13b90 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  pth > 0) {......
13ba0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
13bb0 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09  n_depth--;......
13bc0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
13bd0 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
13be0 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
13bf0 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
13c00 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
13c10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13c20 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
13c30 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65  uccessful, reque
13c40 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61  rying");.....sta
13c50 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
13c60 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
13c70 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
13c80 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
13c90 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
13ca0 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09  , &atr_len);....
13cb0 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
13cc0 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
13cd0 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
13ce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13cf0 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20  Still unable to 
13d00 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
13d10 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
13d20 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
13d30 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
13d40 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
13d50 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
13d60 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
13d70 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
13d80 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
13d90 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
13da0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
13db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13dc0 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  NTF("Unable to r
13dd0 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64  econnect to card
13de0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
13df0 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
13e00 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  Reconnect() = %s
13e10 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
13e20 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
13e30 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e  _STR(scard_recon
13e40 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65  n_ret));......re
13e50 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13e60 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
13e70 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
13e80 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13e90 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
13ea0 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
13eb0 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
13ec0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
13ed0 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
13ee0 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
13ef0 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
13f00 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
13f10 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ));.....return(C
13f20 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
13f30 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
13f40 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26  }...if ((state &
13f50 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d   SCARD_ABSENT) =
13f60 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  = SCARD_ABSENT) 
13f70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13f80 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
13f90 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69   absent, returni
13fa0 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
13fb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
13fc0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
13fd0 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
13fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13ff0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
14000 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a  en present.");..
14010 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
14020 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
14030 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  NT);.}../*. * SY
14040 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
14050 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
14060 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
14070 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
14080 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14090 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
140a0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
140b0 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70  ssize_t cackey_p
140c0 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
140d0 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63  label(struct cac
140e0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
140f0 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
14100 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65  igned char *labe
14110 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20  l_buf, unsigned 
14120 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  long label_buf_l
14130 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
14140 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  long certificate
14150 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62  _len;..void *lab
14160 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a  el_asn1;..void *
14170 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e  certificate;..in
14180 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  t x509_read_ret;
14190 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
141a0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
141b0 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
141c0 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
141d0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
141e0 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
141f0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29  ificate_len < 0)
14200 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
14210 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
14220 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75  ret = x509_to_su
14230 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74  bject(certificat
14240 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
14250 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c  en, (void **) &l
14260 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20  abel_asn1);..if 
14270 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
14280 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
14290 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65  1);..}...x509_re
142a0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
142b0 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
142c0 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
142d0 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
142e0 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
142f0 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a  buf_len, "CN");.
14300 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
14310 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30  et <= 0) {...x50
14320 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
14330 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
14340 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
14350 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
14360 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
14370 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c  bel_buf_len, NUL
14380 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f  L);....if (x509_
14390 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
143a0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
143b0 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
143c0 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
143d0 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
143e0 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35  SIZE_MAX..if (x5
143f0 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50  09_read_ret > _P
14400 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
14410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14420 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65  _PRINTF("x509_re
14430 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d  ad_ret exceeds m
14440 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
14450 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
14460 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
14470 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
14480 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
14490 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
144a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
144b0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a  x509_read_ret);.
144c0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
144d0 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
144e0 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f  f...return(x509_
144f0 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a  read_ret);.}../*
14500 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
14510 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
14520 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
14530 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d  _create(void **m
14540 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
14550 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
14560 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
14570 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
14580 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
14590 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
145a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
145b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
145c0 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
145d0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
145e0 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
145f0 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
14600 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61  hread_mutex = ma
14610 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68  lloc(sizeof(*pth
14620 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09  read_mutex));...
14630 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74  if (!pthread_mut
14640 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ex) {....CACKEY_
14650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
14660 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
14670 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09   memory.");.....
14680 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
14690 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
146a0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
146b0 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d  x_init(pthread_m
146c0 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69  utex, NULL);...i
146d0 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
146e0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
146f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14700 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
14710 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20  init() returned 
14720 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
14730 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
14740 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
14750 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70  .}....*mutex = p
14760 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d  thread_mutex;..}
14770 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
14780 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
14790 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
147a0 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
147b0 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
147c0 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
147d0 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
147e0 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
147f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14800 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
14810 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
14820 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
14830 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
14840 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
14850 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
14860 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
14870 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14880 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
14890 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
148a0 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
148b0 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
148c0 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
148d0 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
148e0 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a  utex_lock(void *
148f0 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
14900 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
14910 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
14920 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
14930 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
14940 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
14950 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
14960 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
14970 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
14980 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
14990 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
149a0 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
149b0 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
149c0 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
149d0 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
149e0 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68  d_mutex_lock(pth
149f0 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
14a00 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
14a10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
14a20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14a30 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
14a40 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
14a50 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
14a60 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
14a70 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
14a80 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
14a90 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  f (cackey_args.L
14aa0 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
14ab0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
14ac0 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
14ad0 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
14ae0 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
14af0 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
14b00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14b10 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
14b20 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29  args.LockMutex()
14b30 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
14b40 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
14b50 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
14b60 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14b70 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
14b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14b90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
14ba0 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
14bb0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
14bc0 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
14bd0 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
14be0 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
14bf0 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20  tex_unlock(void 
14c00 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
14c10 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
14c20 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
14c30 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
14c40 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
14c50 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
14c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
14c70 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
14c80 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
14c90 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
14ca0 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
14cb0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
14cc0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
14cd0 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
14ce0 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
14cf0 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
14d00 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a  pthread_mutex);.
14d10 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
14d20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
14d30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14d40 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
14d50 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75  ex_unlock() retu
14d60 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
14d70 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
14d80 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
14d90 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
14da0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
14db0 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29  rgs.UnlockMutex)
14dc0 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
14dd0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
14de0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75  s.UnlockMutex(mu
14df0 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
14e00 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
14e10 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
14e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14e30 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  ("cackey_args.Un
14e40 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  lockMutex() retu
14e50 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
14e60 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
14e70 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
14e80 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
14e90 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
14ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14eb0 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
14ec0 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
14ed0 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
14ee0 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ic CK_ATTRIBUTE_
14ef0 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  PTR cackey_get_a
14f00 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a  ttributes(CK_OBJ
14f10 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74  ECT_CLASS object
14f20 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61  class, struct ca
14f30 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
14f40 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
14f50 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
14f60 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f  tity_num, CK_ULO
14f70 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
14f80 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42   {..static CK_BB
14f90 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b  OOL ck_true = 1;
14fa0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f  ..static CK_BBOO
14fb0 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a  L ck_false = 0;.
14fc0 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53 54  .static CK_TRUST
14fd0 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43 4b   ck_trusted = CK
14fe0 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41 54  _TRUSTED_DELEGAT
14ff0 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75  OR;..CK_ULONG nu
15000 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76  mattrs = 0, retv
15010 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54  al_count;..CK_AT
15020 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72  TRIBUTE_TYPE cur
15030 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b  r_attr_type;..CK
15040 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f  _ATTRIBUTE curr_
15050 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09  attr, *retval;..
15060 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c  CK_VOID_PTR pVal
15070 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ue;..CK_ULONG ul
15080 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42  ValueLen;..CK_OB
15090 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62  JECT_CLASS ck_ob
150a0 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f  ject_class;..CK_
150b0 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
150c0 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f   ck_certificate_
150d0 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59  type;..CK_KEY_TY
150e0 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  PE ck_key_type;.
150f0 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54  .CK_UTF8CHAR ucT
15100 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48  mpBuf[1024];..SH
15110 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f 63  A1Context sha1_c
15120 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35  tx;..MD5_CTX md5
15130 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73  _ctx;..uint8_t s
15140 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61 73  ha1_hash[SHA1Has
15150 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74  hSize];..uint8_t
15160 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61 73   md5_hash[MD5Has
15170 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65  hSize];..unsigne
15180 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
15190 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65  ate;..ssize_t ce
151a0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
151b0 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  -1, x509_read_re
151c0 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66  t;..int pValue_f
151d0 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ree;...CACKEY_DE
151e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
151f0 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20  ed (objectClass 
15200 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f  = %lu, identity_
15210 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  num = %lu).", (u
15220 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62  nsigned long) ob
15230 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74  jectclass, ident
15240 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c  ity_num);...*pul
15250 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20  Count = 0;...if 
15260 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
15270 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
15280 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
15290 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
152a0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
152b0 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
152c0 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
152d0 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
152e0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41 43  E_TRUST) {...CAC
152f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15300 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
15310 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e  jects (NULL), in
15320 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61  valid object cla
15330 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ss");....return(
15340 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47  NULL);..}.../* G
15350 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28  et Cert */..if (
15360 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
15370 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15380 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
15390 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
153a0 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69  NULL), invalid i
153b0 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22  dentiy provided"
153c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
153d0 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69  L);..}...certifi
153e0 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  cate = identity-
153f0 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63  >certificate;..c
15400 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
15410 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
15420 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66  ficate_len;...if
15430 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
15440 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69  n == -1 || certi
15450 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  ficate == NULL) 
15460 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15470 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
15480 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
15490 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69  LL), this identi
154a0 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ty does not have
154b0 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66   an X.509 certif
154c0 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64  icate associated
154d0 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c   with it and wil
154e0 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09  l not work");...
154f0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
15500 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
15510 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69  at certificate i
15520 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20  s ASN.1 encoded 
15530 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
15540 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74  e */..if (x509_t
15550 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
15560 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
15570 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30  e_len, NULL) < 0
15580 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15590 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
155a0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
155b0 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39  NULL), the X.509
155c0 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73   certificate ass
155d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
155e0 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  s identity is no
155f0 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65  t valid");....re
15600 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
15610 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20  .retval_count = 
15620 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  64;..retval = ma
15630 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e  lloc(retval_coun
15640 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
15650 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72  al));...for (cur
15660 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b  r_attr_type = 0;
15670 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20   curr_attr_type 
15680 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20 63 75  < 0xce5363bf; cu
15690 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20  rr_attr_type++) 
156a0 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  {...if (curr_att
156b0 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29  r_type == 0x800)
156c0 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f   {....curr_attr_
156d0 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30  type = 0xce53630
156e0 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65  0;...}....pValue
156f0 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61  _free = 0;...pVa
15700 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c  lue = NULL;...ul
15710 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
15720 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74  ONG) -1;....swit
15730 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  ch (curr_attr_ty
15740 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b  pe) {....case CK
15750 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43  A_CLASS:.....CAC
15760 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15770 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
15780 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53  ribute CKA_CLASS
15790 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
157a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
157b0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
157c0 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74  ;......ck_object
157d0 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63  _class = objectc
157e0 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75  lass;......pValu
157f0 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63  e = &ck_object_c
15800 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75  lass;.....ulValu
15810 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
15820 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a  _object_class);.
15830 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15840 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
15850 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
15860 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
15870 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42  d long) *((CK_OB
15880 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56  JECT_CLASS *) pV
15890 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
158a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
158b0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
158c0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
158d0 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43  CKA_TOKEN:.....C
158e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
158f0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
15900 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b  ttribute CKA_TOK
15910 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EN (0x%08lx) ...
15920 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15930 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15940 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
15950 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
15960 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
15970 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
15980 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15990 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
159a0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
159b0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
159c0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
159d0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
159e0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
159f0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
15a00 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
15a10 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41  ..case CKA_PRIVA
15a20 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  TE:.....CACKEY_D
15a30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
15a40 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
15a50 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28 30  e CKA_PRIVATE (0
15a60 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15a70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15a80 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15a90 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15aa0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
15ab0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
15ac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15ad0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
15ae0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
15af0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
15b00 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  t a Netscape tru
15b10 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
15b20 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
15b30 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
15b40 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
15b50 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
15b60 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
15b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15b80 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
15b90 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
15ba0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
15bb0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
15bc0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
15bd0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
15be0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
15bf0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15c00 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44  case CKA_TRUSTED
15c10 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
15c20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
15c30 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
15c40 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78 25  CKA_TRUSTED (0x%
15c50 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
15c60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
15c70 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
15c80 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
15c90 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
15ca0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
15cb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15cc0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
15cd0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
15ce0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
15cf0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
15d00 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
15d10 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
15d20 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
15d30 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
15d40 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
15d50 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
15d60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15d70 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
15d80 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
15d90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
15da0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
15db0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
15dc0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15dd0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15de0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15df0 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09  _MODIFIABLE:....
15e00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15e10 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
15e20 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
15e30 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38  ODIFIABLE (0x%08
15e40 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
15e50 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
15e60 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
15e70 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
15e80 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
15e90 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
15ea0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
15eb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ec0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
15ed0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
15ee0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
15ef0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
15f00 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
15f10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
15f20 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
15f30 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15f40 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43  CKA_LABEL:.....C
15f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15f60 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
15f70 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42  ttribute CKA_LAB
15f80 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EL (0x%08lx) ...
15f90 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15fa0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15fb0 65 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a  e);....../* XXX:
15fc0 20 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20   Determine name 
15fd0 2a 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  */.....ulValueLe
15fe0 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68  n = snprintf((ch
15ff0 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20  ar *) ucTmpBuf, 
16000 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29  sizeof(ucTmpBuf)
16010 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75  , "Identity #%lu
16020 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16030 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29  g) identity_num)
16040 3b 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75  ;.....pValue = u
16050 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66  cTmpBuf;......if
16060 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20   (ulValueLen >= 
16070 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29  sizeof(ucTmpBuf)
16080 29 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ) {......ulValue
16090 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56  Len = 0;......pV
160a0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
160b0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
160c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
160d0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
160e0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
160f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16100 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16110 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
16120 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43  CKA_VALUE:.....C
16130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16140 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
16150 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c  ttribute CKA_VAL
16160 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  UE (0x%08lx) ...
16170 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16180 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
16190 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20  e);......switch 
161a0 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a  (objectclass) {.
161b0 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52  .....case CKO_PR
161c0 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09  IVATE_KEY:......
161d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
161e0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
161f0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
16200 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70  cause we are a p
16210 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a  rivate key.");..
16220 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
16230 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43  ..case CKO_NETSC
16240 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09 09  APE_TRUST:......
16250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16260 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
16270 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
16280 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
16290 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
162a0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09 62  ject");........b
162b0 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
162c0 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a  CKO_PUBLIC_KEY:.
162d0 09 09 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
162e0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
162f0 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72 65  {........x509_re
16300 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
16310 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66 69 63  _pubkey(certific
16320 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
16330 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
16340 09 09 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  .......if (x509_
16350 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 20  read_ret < 0) { 
16360 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75 65 20  .........pValue 
16370 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d  = NULL;........}
16380 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09   else {.........
16390 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
163a0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
163b0 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09  ...}.......}....
163c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
163d0 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49  case CKO_CERTIFI
163e0 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c  CATE:.......pVal
163f0 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  ue = certificate
16400 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  ;.......ulValueL
16410 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65  en = certificate
16420 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65  _len;........bre
16430 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ak;.....}......C
16440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16450 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
16460 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
16470 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
16480 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
16490 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
164a0 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a  case CKA_ISSUER:
164b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
164c0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
164d0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
164e0 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38  KA_ISSUER (0x%08
164f0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
16500 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
16510 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
16520 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
16530 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
16540 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
16550 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
16560 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
16570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16580 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
16590 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
165a0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
165b0 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
165c0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
165d0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
165e0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
165f0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
16600 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
16610 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
16620 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65   = x509_to_issue
16630 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  r(certificate, c
16640 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
16650 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
16660 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
16670 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
16680 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
16690 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
166a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
166b0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
166c0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
166d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
166e0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
166f0 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
16700 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
16710 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
16720 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
16730 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
16740 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b  NUMBER:.....CACK
16750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16760 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
16770 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c  ibute CKA_SERIAL
16780 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78  _NUMBER (0x%08lx
16790 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
167a0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
167b0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
167c0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
167d0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
167e0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
167f0 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
16800 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
16810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16820 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
16830 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
16840 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
16850 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e  certificate or N
16860 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
16870 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
16880 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
16890 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
168a0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
168b0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
168c0 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28   x509_to_serial(
168d0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
168e0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
168f0 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
16900 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
16910 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
16920 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
16930 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
16940 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
16950 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
16960 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
16970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16980 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
16990 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
169a0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
169b0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
169c0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
169d0 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  case CKA_SUBJECT
169e0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
169f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
16a00 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
16a10 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25  CKA_SUBJECT (0x%
16a20 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16a30 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16a40 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16a50 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
16a60 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
16a70 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
16a80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16a90 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
16aa0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
16ab0 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
16ac0 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a 09  ertificate");...
16ad0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
16ae0 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
16af0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
16b00 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
16b10 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
16b20 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61  ubject(certifica
16b30 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
16b40 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
16b50 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
16b60 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
16b70 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
16b80 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
16b90 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
16ba0 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
16bb0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
16bc0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16bd0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
16be0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
16bf0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16c00 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16c10 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16c20 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44  ;....case CKA_ID
16c30 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
16c40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
16c50 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
16c60 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29  CKA_ID (0x%08lx)
16c70 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16c80 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16c90 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
16ca0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
16cb0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
16cc0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
16cd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ce0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
16cf0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
16d00 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
16d10 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
16d20 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
16d30 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42  ...}......ucTmpB
16d40 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69  uf[0] = ((identi
16d50 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38  ty_num + 1) >> 8
16d60 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63  ) & 0xff;.....uc
16d70 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64  TmpBuf[1] =  (id
16d80 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20  entity_num + 1) 
16d90 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61  & 0xff;......pVa
16da0 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b  lue = &ucTmpBuf;
16db0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
16dc0 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  = 2;......CACKEY
16dd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
16de0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
16df0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
16e00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16e10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16e20 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
16e30 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
16e40 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
16e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16e60 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
16e70 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ute CKA_CERTIFIC
16e80 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c  ATE_TYPE (0x%08l
16e90 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
16ea0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
16eb0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
16ec0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
16ed0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
16ee0 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
16ef0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
16f00 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
16f10 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
16f20 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
16f30 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
16f40 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
16f50 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73  ..../* We only s
16f60 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69  upport one certi
16f70 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09  ficate type */..
16f80 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74  ...ck_certificat
16f90 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35  e_type = CKC_X_5
16fa0 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  09;......pValue 
16fb0 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74  = &ck_certificat
16fc0 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  e_type;.....ulVa
16fd0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
16fe0 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
16ff0 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ype);......CACKE
17000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17010 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43   ... returning C
17020 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28  KC_X_509 (%lu) (
17030 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
17040 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
17050 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
17060 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
17070 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17080 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17090 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
170a0 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59  .case CKA_KEY_TY
170b0 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PE:.....CACKEY_D
170c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
170d0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
170e0 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28  e CKA_KEY_TYPE (
170f0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
17100 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
17110 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
17120 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17130 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56  lass != CKO_PRIV
17140 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  ATE_KEY && objec
17150 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
17160 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09  BLIC_KEY) {.....
17170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17180 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17190 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
171a0 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
171b0 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09   a key.");......
171c0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
171d0 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75  .../* We only su
171e0 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79  pport one key ty
171f0 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79  pe */.....ck_key
17200 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b  _type = CKK_RSA;
17210 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
17220 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09  ck_key_type;....
17230 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17240 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65  zeof(ck_key_type
17250 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
17260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17270 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f  . returning CKK_
17280 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  RSA (%lu) (%p/%l
17290 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
172a0 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
172b0 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
172c0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
172d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
172e0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
172f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
17300 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43   CKA_SIGN:.....C
17310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17320 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17330 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
17340 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
17350 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17360 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17370 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
17380 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
17390 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
173a0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
173b0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
173c0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
173d0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
173e0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
173f0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
17400 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17410 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17420 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
17430 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
17440 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
17450 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
17460 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
17470 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
17480 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
17490 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
174a0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
174b0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
174c0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
174d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
174e0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
174f0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
17500 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
17510 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
17520 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
17530 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
17540 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
17550 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
17560 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a  KA_SIGN_RECOVER:
17570 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17580 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
17590 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
175a0 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20  KA_SIGN_RECOVER 
175b0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
175c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
175d0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
175e0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
175f0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
17600 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
17610 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17620 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
17630 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17640 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17650 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
17660 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17670 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17680 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74  .../* We current
17690 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  ly only support 
176a0 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e  "Sign with Appen
176b0 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c  dix" */.....pVal
176c0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
176d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
176e0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
176f0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
17700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17710 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
17720 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
17730 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
17740 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
17750 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
17760 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
17770 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
17780 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
17790 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43  DECRYPT:.....CAC
177a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
177b0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
177c0 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59  ribute CKA_DECRY
177d0 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PT (0x%08lx) ...
177e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
177f0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
17800 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
17810 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
17820 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
17830 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
17840 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17850 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
17860 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
17870 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
17880 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
17890 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
178a0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
178b0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
178c0 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65  VATE_KEY || obje
178d0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
178e0 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
178f0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
17900 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
17910 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
17920 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
17930 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
17940 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
17950 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17960 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
17970 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
17980 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17990 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
179a0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
179b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
179c0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
179d0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
179e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
179f0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
17a00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
17a10 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
17a20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17a30 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
17a40 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
17a50 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 25  A_SENSITIVE (0x%
17a60 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17a70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17a80 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
17a90 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17aa0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
17ab0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
17ac0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17ad0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17ae0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17af0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
17b00 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
17b10 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
17b20 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
17b30 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
17b40 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
17b50 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
17b60 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
17b70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
17b80 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
17b90 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
17ba0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
17bb0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
17bc0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
17bd0 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
17be0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17bf0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
17c00 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
17c10 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
17c20 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
17c30 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
17c40 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17c50 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17c60 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17c70 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54  ....case CKA_EXT
17c80 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43 41  RACTABLE:.....CA
17c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17ca0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
17cb0 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54 52  tribute CKA_EXTR
17cc0 41 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c 78  ACTABLE (0x%08lx
17cd0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
17ce0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
17cf0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
17d00 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
17d10 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
17d20 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
17d30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17d40 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
17d50 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
17d60 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
17d70 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
17d80 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
17d90 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
17da0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
17db0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
17dc0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
17dd0 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
17de0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
17df0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
17e00 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
17e10 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
17e20 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
17e30 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
17e40 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
17e50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17e60 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
17e70 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
17e80 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
17e90 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
17ea0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
17eb0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
17ec0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
17ed0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17ee0 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
17ef0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
17f00 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
17f10 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
17f20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25  CKA_MODULUS (0x%
17f30 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17f40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17f50 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
17f60 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17f70 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
17f80 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
17f90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17fa0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17fb0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17fc0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
17fd0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
17fe0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
17ff0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
18000 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
18010 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
18020 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
18030 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28  x509_to_modulus(
18040 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
18050 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
18060 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
18070 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
18080 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
18090 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
180a0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
180b0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
180c0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
180d0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
180e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
180f0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
18100 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
18110 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18120 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18130 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18140 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  case CKA_PUBLIC_
18150 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41  EXPONENT:.....CA
18160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18170 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
18180 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c  tribute CKA_PUBL
18190 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25  IC_EXPONENT (0x%
181a0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
181b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
181c0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
181d0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
181e0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
181f0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
18200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18210 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
18220 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
18230 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
18240 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
18250 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
18260 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
18270 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
18280 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
18290 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
182a0 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74  x509_to_exponent
182b0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
182c0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
182d0 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
182e0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
182f0 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
18300 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
18310 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
18320 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
18330 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
18340 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
18350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18360 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18370 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
18380 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
18390 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
183a0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
183b0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
183c0 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52  DIGITAL_SIGNATUR
183d0 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  E:....case CKA_T
183e0 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41  RUST_NON_REPUDIA
183f0 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  TION:....case CK
18400 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49  A_TRUST_KEY_ENCI
18410 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
18420 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54 41  e CKA_TRUST_DATA
18430 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09  _ENCIPHERMENT:..
18440 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
18450 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a  _KEY_AGREEMENT:.
18460 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
18470 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a  T_KEY_CERT_SIGN:
18480 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
18490 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09  ST_CRL_SIGN:....
184a0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53  case CKA_TRUST_S
184b0 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 63  ERVER_AUTH:....c
184c0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c  ase CKA_TRUST_CL
184d0 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63 61  IENT_AUTH:....ca
184e0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  se CKA_TRUST_COD
184f0 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61  E_SIGNING:....ca
18500 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41  se CKA_TRUST_EMA
18510 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09  IL_PROTECTION:..
18520 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18530 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18540 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18550 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30  _TRUST_... (0x%0
18560 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18570 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18580 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18590 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
185a0 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c  usted;.....ulVal
185b0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
185c0 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09 09  k_trusted);.....
185d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
185e0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
185f0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
18600 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
18610 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54 20  ng) *((CK_TRUST 
18620 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
18630 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18640 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18650 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18660 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53 48  case CKA_CERT_SH
18670 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43  A1_HASH:.....CAC
18680 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18690 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
186a0 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f  ribute CKA_CERT_
186b0 53 48 41 31 5f 48 41 53 48 20 28 30 78 25 30 38  SHA1_HASH (0x%08
186c0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
186d0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
186e0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
186f0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18700 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
18710 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
18720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18730 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
18740 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18750 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
18760 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18770 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18780 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18790 09 53 48 41 31 52 65 73 65 74 28 26 73 68 61 31  .SHA1Reset(&sha1
187a0 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31 49  _ctx);.....SHA1I
187b0 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c 20  nput(&sha1_ctx, 
187c0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
187d0 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
187e0 09 09 09 53 48 41 31 52 65 73 75 6c 74 28 26 73  ...SHA1Result(&s
187f0 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68 61  ha1_ctx, sha1_ha
18800 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  sh);......pValue
18810 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09 09   = sha1_hash;...
18820 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
18830 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68 29  izeof(sha1_hash)
18840 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
18850 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18860 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
18870 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
18880 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
18890 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
188a0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
188b0 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a  _CERT_MD5_HASH:.
188c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
188d0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
188e0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
188f0 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 20  A_CERT_MD5_HASH 
18900 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
18910 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18920 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18930 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
18940 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
18950 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18960 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18970 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
18980 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
18990 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
189a0 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
189b0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
189c0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
189d0 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28 26  }......MD5Init(&
189e0 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44  md5_ctx);.....MD
189f0 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74 78  5Update(&md5_ctx
18a00 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
18a10 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
18a20 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64  .....MD5Final(md
18a30 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74 78  5_hash, &md5_ctx
18a40 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
18a50 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09 75   md5_hash;.....u
18a60 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
18a70 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09  of(md5_hash);...
18a80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18a90 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18aa0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
18ab0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
18ac0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
18ad0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
18ae0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
18af0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
18b00 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18b10 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09   (CK_LONG) -1;..
18b20 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
18b30 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20  .if (((CK_LONG) 
18b40 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28  ulValueLen) != (
18b50 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b  (CK_LONG) -1)) {
18b60 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72  ..../* Push curr
18b70 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73  _attr onto the s
18b80 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f  tack */....curr_
18b90 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72  attr.type = curr
18ba0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63  _attr_type;....c
18bb0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
18bc0 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
18bd0 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  ;.....curr_attr.
18be0 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
18bf0 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
18c00 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79  eLen);....memcpy
18c10 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  (curr_attr.pValu
18c20 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  e, pValue, curr_
18c30 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
18c40 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65  ;.....if (pValue
18c50 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29  _free && pValue)
18c60 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c   {.....free(pVal
18c70 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ue);....}.....if
18c80 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65   (numattrs >= re
18c90 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  tval_count) {...
18ca0 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
18cb0 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61  oc(retval, retva
18cc0 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
18cd0 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d  (*retval));....}
18ce0 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74  .....memcpy(&ret
18cf0 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26  val[numattrs], &
18d00 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f  curr_attr, sizeo
18d10 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09  f(curr_attr));..
18d20 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09  ..numattrs++;...
18d30 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74  }..}...if (numat
18d40 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  trs != 0) {...re
18d50 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d  tval_count = num
18d60 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20  attrs;...retval 
18d70 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
18d80 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
18d90 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
18da0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66  );..} else {...f
18db0 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ree(retval);....
18dc0 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  retval = NULL;..
18dd0 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  }...*pulCount = 
18de0 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b  numattrs;...CACK
18df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18e00 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f  "Returning %lu o
18e10 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e  bjects (%p).", n
18e20 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20 2a  umattrs, (void *
18e30 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
18e40 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
18e50 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
18e60 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
18e70 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
18e80 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
18e90 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20  ities, unsigned 
18ea0 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
18eb0 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  count) {..CK_ATT
18ec0 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
18ed0 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  r;..unsigned lon
18ee0 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69  g id_idx, attr_i
18ef0 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  dx;...if (identi
18f00 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  ties == NULL || 
18f10 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
18f20 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72   == 0) {...retur
18f30 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f  n;..}...for (id_
18f40 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20  idx = 0; id_idx 
18f50 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  < identities_cou
18f60 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a  nt; id_idx++) {.
18f70 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
18f80 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
18f90 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61  tes) {....for (a
18fa0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
18fb0 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69  r_idx < identiti
18fc0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
18fd0 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74  butes_count; att
18fe0 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63  r_idx++) {.....c
18ff0 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e  urr_attr = &iden
19000 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
19010 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69  ttributes[attr_i
19020 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75  dx];......if (cu
19030 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
19040 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
19050 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b  r_attr->pValue);
19060 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
19070 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
19080 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
19090 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64  s) {.....free(id
190a0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
190b0 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09  .attributes);...
190c0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
190d0 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74  ee_certs(identit
190e0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
190f0 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29  _identity, 1, 1)
19100 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28  ;...}..}...free(
19110 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a  identities);.}..
19120 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
19130 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61 64  long cackey_read
19140 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
19150 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
19160 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69  entity *identiti
19170 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  es, unsigned lon
19180 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  g num_dod_certs)
19190 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
191a0 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f 69  g cert_idx, id_i
191b0 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64  dx = 0;...if (id
191c0 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
191d0 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d  ) {...return(num
191e0 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29 3b  _dod_certs * 3);
191f0 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f  ..}...for (cert_
19200 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64  idx = 0; cert_id
19210 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  x < num_dod_cert
19220 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
19230 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
19240 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
19250 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64  ity = NULL;...id
19260 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19270 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
19280 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
19290 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43  tes(CKO_CERTIFIC
192a0 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74  ATE, &extra_cert
192b0 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66  s[cert_idx], 0xf
192c0 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20  000 | cert_idx, 
192d0 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
192e0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
192f0 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b  ount);...id_idx+
19300 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73  +;....identities
19310 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
19320 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
19330 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
19340 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
19350 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
19360 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49  ibutes(CKO_PUBLI
19370 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65  C_KEY, &extra_ce
19380 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
19390 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
193a0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
193b0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
193c0 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
193d0 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  x++;....identiti
193e0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
193f0 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
19400 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
19410 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
19420 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
19430 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54  tributes(CKO_NET
19440 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78  SCAPE_TRUST, &ex
19450 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69  tra_certs[cert_i
19460 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65  dx], 0xf000 | ce
19470 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
19480 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
19490 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  ibutes_count);..
194a0 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09  .id_idx++;..}...
194b0 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a  return(id_idx);.
194c0 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
194d0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
194e0 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64   *cackey_read_id
194f0 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
19500 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
19510 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  t, unsigned long
19520 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09   *ids_found) {..
19530 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
19540 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
19550 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73  c_identities;..s
19560 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
19570 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
19580 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
19590 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64  g num_ids, id_id
195a0 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b  x, curr_id_type;
195b0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
195c0 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64  num_certs, num_d
195d0 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69  od_certs, cert_i
195e0 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65  dx;..int include
195f0 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30  _extra_certs = 0
19600 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19610 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
19620 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f  ");...if (ids_fo
19630 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  und == NULL) {..
19640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19650 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
19660 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22  s_found is NULL"
19670 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
19680 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  L);..}..#ifdef C
19690 41 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f  ACKEY_CARD_SLOT_
196a0 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45  INCLUDE_EXTRA_CE
196b0 52 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74  RTS..include_ext
196c0 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65  ra_certs = 1;.#e
196d0 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e  ndif...if (geten
196e0 76 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45  v("CACKEY_DOD_CE
196f0 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22  RTS_ON_HW_SLOTS"
19700 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  ) != NULL) {...i
19710 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
19720 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20  ts = 1;..}...if 
19730 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
19740 4e 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f  NO_DOD_CERTS_ON_
19750 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55  HW_SLOTS") != NU
19760 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  LL) {...include_
19770 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b  extra_certs = 0;
19780 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  ..}...if (getenv
19790 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52  ("CACKEY_NO_EXTR
197a0 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c  A_CERTS") != NUL
197b0 4c 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63  L) {...num_dod_c
197c0 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  erts = 0;..} els
197d0 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  e {...num_dod_ce
197e0 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74  rts = sizeof(ext
197f0 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65  ra_certs) / size
19800 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30  of(extra_certs[0
19810 5d 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  ]);..}...if (slo
19820 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t->internal) {..
19830 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65  .num_ids = cacke
19840 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
19850 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f  ities(NULL, num_
19860 64 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69  dod_certs);....i
19870 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29  f (num_ids != 0)
19880 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73   {....identities
19890 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64   = malloc(num_id
198a0 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  s * sizeof(*iden
198b0 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61  tities));.....ca
198c0 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
198d0 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74  entities(identit
198e0 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  ies, num_dod_cer
198f0 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ts);...} else {.
19900 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
19910 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64  NULL;...}....*id
19920 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64  s_found = num_id
19930 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65  s;....return(ide
19940 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70  ntities);..}...p
19950 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
19960 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
19970 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26  ts(slot, NULL, &
19980 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20  num_certs);..if 
19990 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
199a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a   != NULL) {.../*
199b0 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20   Convert number 
199c0 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62  of Certs to numb
199d0 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f  er of objects */
199e0 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b  ...num_ids = (CK
199f0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20  O_PRIVATE_KEY - 
19a00 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
19a10 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73  + 1) * num_certs
19a20 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65  ;....if (include
19a30 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a  _extra_certs) {.
19a40 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61  ...num_ids += ca
19a50 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
19a60 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e  entities(NULL, n
19a70 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09  um_dod_certs);..
19a80 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73  .}....identities
19a90 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64   = malloc(num_id
19aa0 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  s * sizeof(*iden
19ab0 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20  tities));..../* 
19ac0 41 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73  Add certificates
19ad0 2c 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61  , public keys, a
19ae0 6e 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20  nd private keys 
19af0 66 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61  from the smartca
19b00 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d  rd */...id_idx =
19b10 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f   0;...for (cert_
19b20 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64  idx = 0; cert_id
19b30 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63  x < num_certs; c
19b40 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ert_idx++) {....
19b50 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70  for (curr_id_typ
19b60 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  e = CKO_CERTIFIC
19b70 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  ATE; curr_id_typ
19b80 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  e <= CKO_PRIVATE
19b90 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79  _KEY; curr_id_ty
19ba0 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e  pe++) {.....iden
19bb0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
19bc0 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
19bd0 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
19be0 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20  s(curr_id_type, 
19bf0 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
19c00 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74  [cert_idx], cert
19c10 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
19c20 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
19c30 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  utes_count);....
19c40 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
19c50 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
19c60 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
19c70 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69  of(*identities[i
19c80 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
19c90 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63  tity));.....memc
19ca0 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  py(identities[id
19cb0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
19cc0 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74  ity, &pcsc_ident
19cd0 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c  ities[cert_idx],
19ce0 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
19cf0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
19d00 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09  _identity));....
19d10 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
19d20 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
19d30 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  ty->certificate 
19d40 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64  = malloc(pcsc_id
19d50 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
19d60 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
19d70 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  en);.....memcpy(
19d80 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19d90 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
19da0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70  ->certificate, p
19db0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
19dc0 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
19dd0 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74  cate, pcsc_ident
19de0 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e  ities[cert_idx].
19df0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
19e00 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b  ;......id_idx++;
19e10 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
19e20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  (include_extra_c
19e30 65 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45  erts) {....CACKE
19e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19e50 49 6e 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76  Including US Gov
19e60 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63  ernment Certific
19e70 61 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65  ates on hardware
19e80 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63   slot");.....cac
19e90 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
19ea0 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69  ntities(identiti
19eb0 65 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d  es + id_idx, num
19ec0 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d  _dod_certs);...}
19ed0 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
19ee0 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74  certs(pcsc_ident
19ef0 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73  ities, num_certs
19f00 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f  , 1);....*ids_fo
19f10 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a  und = num_ids;..
19f20 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74  ..return(identit
19f30 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73  ies);..}....*ids
19f40 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74  _found = 0;..ret
19f50 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b  urn(NULL);.}..CK
19f60 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
19f70 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61  (CK_RV, C_Initia
19f80 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
19f90 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09  R pInitArgs) {..
19fa0 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f  CK_C_INITIALIZE_
19fb0 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73  ARGS CK_PTR args
19fc0 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 2c  ;..uint32_t idx,
19fd0 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09   highest_slot;..
19fe0 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
19ff0 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
1a000 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1a010 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
1a020 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a030 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a040 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a050 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c   Already initial
1a060 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1a070 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1a080 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49  ALREADY_INITIALI
1a090 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
1a0a0 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c  InitArgs != NULL
1a0b0 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e  ) {...args = pIn
1a0c0 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79  itArgs;...memcpy
1a0d0 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61  (&cackey_args, a
1a0e0 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b  rgs, sizeof(cack
1a0f0 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66  ey_args));....if
1a100 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
1a110 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
1a120 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
1a130 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
1a140 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  s->LockMutex == 
1a150 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
1a160 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  lockMutex == NUL
1a170 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73  L) {....if (args
1a180 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d  ->CreateMutex !=
1a190 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
1a1a0 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e  estroyMutex != N
1a1b0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
1a1c0 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  kMutex != NULL |
1a1d0 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
1a1e0 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex != NULL) {..
1a1f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
1a210 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c  ome, but not All
1a220 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69   threading primi
1a230 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22  tives provided."
1a240 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
1a250 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1a260 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65  );....}...}..} e
1a270 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61  lse {...cackey_a
1a280 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20  rgs.CreateMutex 
1a290 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1a2a0 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74  _args.DestroyMut
1a2b0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1a2c0 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
1a2d0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1a2e0 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
1a2f0 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1a300 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
1a310 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
1a320 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1a330 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1a340 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1a350 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1a360 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1a370 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1a380 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
1a390 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  0;..}...for (idx
1a3a0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1a3b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1a3c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1a3d0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
1a3e0 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  x++) {...cackey_
1a3f0 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76  slots[idx].activ
1a400 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  e = 0;...cackey_
1a410 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
1a420 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
1a430 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1a440 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
1a450 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b  epth = 0;...cack
1a460 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
1a470 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
1a480 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61  w_lock = 0;...ca
1a490 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1a4a0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
1a4b0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1a4c0 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  dx].token_flags 
1a4d0 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1a4e0 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d  ots[idx].label =
1a4f0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1a500 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72  slots[idx].inter
1a510 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  nal = 0;..}...if
1a520 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1a530 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22  _NO_EXTRA_CERTS"
1a540 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  ) != NULL) {...C
1a550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a560 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f  TF("Asked not to
1a570 20 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72   include DoD cer
1a580 74 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20  tificates");..} 
1a590 65 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74  else {...highest
1a5a0 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28  _slot = (sizeof(
1a5b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1a5c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1a5d0 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09  ots[0])) - 1;...
1a5e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a5f0 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20  INTF("Including 
1a600 44 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f  DoD certs in slo
1a610 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  t %lu", (unsigne
1a620 64 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f  d long) highest_
1a630 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79  slot);....cackey
1a640 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1a650 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  lot].active = 1;
1a660 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1a670 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e  highest_slot].in
1a680 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61  ternal = 1;...ca
1a690 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1a6a0 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  st_slot].label =
1a6b0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1a6c0 2a 29 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e  *) "US Governmen
1a6d0 74 20 43 65 72 74 69 66 69 63 61 74 65 73 22 3b  t Certificates";
1a6e0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1a6f0 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63  highest_slot].pc
1a700 73 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43  sc_reader = "CAC
1a710 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73  Key";...cackey_s
1a720 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1a730 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t].token_flags =
1a740 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f   0;..}...cackey_
1a750 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
1a760 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62  ...if (!cackey_b
1a770 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09  iglock_init) {..
1a780 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  .mutex_init_ret 
1a790 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63  = cackey_mutex_c
1a7a0 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69  reate(&cackey_bi
1a7b0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d  glock);....if (m
1a7c0 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d  utex_init_ret !=
1a7d0 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
1a7e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a7f0 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74  ror.  Mutex init
1a800 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65  ialization faile
1a810 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
1a820 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b  (CKR_CANT_LOCK);
1a830 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62  ...}....cackey_b
1a840 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b  iglock_init = 1;
1a850 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1a860 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1a870 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1a880 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1a890 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1a8a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1a8b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
1a8c0 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
1a8d0 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a  TR pReserved) {.
1a8e0 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a  .uint32_t idx;..
1a8f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a900 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1a910 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64  ...if (pReserved
1a920 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1a930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a940 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72  F("Error. pReser
1a950 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ved is not NULL.
1a960 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a970 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1a980 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1a990 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a9a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a9b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a9c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a9d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a9e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a9f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1aa00 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1aa10 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1aa20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1aa30 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1aa40 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
1aa50 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
1aa60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1aa70 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
1aa80 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69  C_CloseSession(i
1aa90 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  dx);...}..}...ca
1aaa0 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
1aab0 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66  nnect_all();...f
1aac0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1aad0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1aae0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1aaf0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1ab00 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
1ab10 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1ab20 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  [idx].internal) 
1ab30 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  {....continue;..
1ab40 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
1ab50 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
1ab60 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72  _reader) {....fr
1ab70 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
1ab80 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
1ab90 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61  );...}....if (ca
1aba0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1abb0 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a  cached_certs) {.
1abc0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1abd0 65 72 74 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74  erts(cackey_slot
1abe0 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
1abf0 72 74 73 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  rts, cackey_slot
1ac00 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
1ac10 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a  rts_count, 1);..
1ac20 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1ac30 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1ac40 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d  s = NULL;...}..}
1ac50 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  ...cackey_pcsc_d
1ac60 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63  isconnect();...c
1ac70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1ac80 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  d = 0;...CACKEY_
1ac90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1aca0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1acb0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1acc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1acd0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1ace0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1acf0 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f  GetInfo)(CK_INFO
1ad00 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
1ad10 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1ad20 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
1ad30 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
1ad40 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
1ad50 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 62 72  CK_UTF8CHAR libr
1ad60 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d  aryDescription[]
1ad70 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43   = "CACKey";...C
1ad80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ad90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1ada0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1adb0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1adc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1add0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1ade0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1adf0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1ae00 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1ae10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1ae20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ae30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ae40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1ae50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ae60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1ae70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1ae80 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70  .}...pInfo->cryp
1ae90 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  tokiVersion.majo
1aea0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
1aeb0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
1aec0 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  DE) >> 16) & 0xf
1aed0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74  f;..pInfo->crypt
1aee0 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  okiVersion.minor
1aef0 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
1af00 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
1af10 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  E) >> 8) & 0xff;
1af20 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1af30 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1af40 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1af50 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1af60 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
1af70 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1af80 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
1af90 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
1afa0 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
1afb0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ;...pInfo->flags
1afc0 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65   = 0x00;...memse
1afd0 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  t(pInfo->library
1afe0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
1aff0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1b000 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
1b010 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  on));..memcpy(pI
1b020 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
1b030 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79  ription, library
1b040 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
1b050 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73 63 72  eof(libraryDescr
1b060 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09  iption) - 1);...
1b070 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
1b080 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63  rsion.major = (c
1b090 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1b0a0 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  () >> 16) & 0xff
1b0b0 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ;..pInfo->librar
1b0c0 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  yVersion.minor =
1b0d0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1b0e0 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
1b0f0 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ff;...CACKEY_DEB
1b100 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1b110 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1b120 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1b130 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1b140 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c  ./*. * Process l
1b150 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 2c 20  ist of readers, 
1b160 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70 70 69  and create mappi
1b170 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61 64 65  ng between reade
1b180 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20  r name and slot 
1b190 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ID. */.CK_DEFINE
1b1a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1b1b0 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28   C_GetSlotList)(
1b1c0 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72  CK_BBOOL tokenPr
1b1d0 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49  esent, CK_SLOT_I
1b1e0 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c  D_PTR pSlotList,
1b1f0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1b200 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69  lCount) {..stati
1b210 63 20 69 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c  c int first_call
1b220 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78   = 1;..int mutex
1b230 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63  _retval;..int pc
1b240 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a  sc_connect_ret;.
1b250 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c  .CK_ULONG count,
1b260 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c   slot_count = 0,
1b270 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f   currslot, slot_
1b280 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63 73 63  idx;..char *pcsc
1b290 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f  _readers, *pcsc_
1b2a0 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63  readers_s, *pcsc
1b2b0 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f  _readers_e;..DWO
1b2c0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
1b2d0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
1b2e0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1b2f0 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
1b300 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20  eader_len;..int 
1b310 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 41  slot_reset;...CA
1b320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b330 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1b340 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
1b350 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1b360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b370 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69  rror. pulCount i
1b380 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1b390 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b3a0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1b3b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1b3c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1b3d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b3e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1b3f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1b400 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1b410 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1b420 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
1b430 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1b440 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1b450 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1b460 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1b470 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1b480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b490 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1b4a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1b4b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1b4c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c  ROR);..}.../* Cl
1b4d0 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  ear list of slot
1b4e0 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74  s */..slot_reset
1b4f0 20 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74   = 0;..if (pSlot
1b500 4c 69 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69  List) {...if (fi
1b510 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66  rst_call) {....f
1b520 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a  irst_call = 0;..
1b530 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  ...slot_reset = 
1b540 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20  1;...}..../* If 
1b550 61 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73  any of the slots
1b560 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 65 74   have been reset
1b570 20 74 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20   then purge all 
1b580 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  information and 
1b590 63 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09  check again */..
1b5a0 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
1b5b0 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   0; currslot < (
1b5c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b5d0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1b5e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1b5f0 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
1b600 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1b610 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74  ts[currslot].int
1b620 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e  ernal) {.....con
1b630 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
1b640 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1b650 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1b660 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ve) {.....contin
1b670 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ue;....}.....if 
1b680 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1b690 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73  rrslot].slot_res
1b6a0 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72  et) {.....slot_r
1b6b0 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62  eset = 1;......b
1b6c0 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  reak;....}...}..
1b6d0 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74  ..if (slot_reset
1b6e0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1b6f0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67  BUG_PRINTF("Purg
1b700 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66  ing all slot inf
1b710 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09  ormation.");....
1b720 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
1b730 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
1b740 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
1b750 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c  ally being suppl
1b760 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72  y the slot infor
1b770 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  mation */....cac
1b780 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
1b790 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09  nect_all();.....
1b7a0 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
1b7b0 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  0; currslot < (s
1b7c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1b7d0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1b7e0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1b7f0 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1b800 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1b810 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74  ts[currslot].int
1b820 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f  ernal) {......co
1b830 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09  ntinue;.....}...
1b840 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1b850 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
1b860 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
1b870 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
1b880 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
1b890 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09  sc_reader);.....
1b8a0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1b8b0 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
1b8c0 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  ader = NULL;....
1b8d0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b  .}......if (cack
1b8e0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1b8f0 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09  t].label) {.....
1b900 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
1b910 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1b920 65 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65  el);.......cacke
1b930 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1b940 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
1b950 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
1b960 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1b970 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09  ].active = 0;...
1b980 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
1b990 09 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65  ....}..}.../* De
1b9a0 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20  termine list of 
1b9b0 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63  readers */..pcsc
1b9c0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
1b9d0 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
1b9e0 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  ct();..if (pcsc_
1b9f0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
1ba00 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
1ba10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ba20 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
1ba30 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61  tion to PC/SC fa
1ba40 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e  iled, assuming n
1ba50 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c  o slots");....sl
1ba60 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d  ot_count = 0;..}
1ba70 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72   else {...pcsc_r
1ba80 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a  eaders_len = 0;.
1ba90 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1baa0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1bab0 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1bac0 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1bad0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
1bae0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1baf0 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1bb00 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1bb10 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52   SCARD_F_COMM_ER
1bb20 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ROR) {....CACKEY
1bb30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bb40 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52  rror. SCardListR
1bb50 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65  eaders() returne
1bb60 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45  d SCARD_F_COMM_E
1bb70 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43  RROR, assuming C
1bb80 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
1bb90 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65  SC went away. Re
1bba0 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a  connecting.");..
1bbb0 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  ...cackey_pcsc_d
1bbc0 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09  isconnect();....
1bbd0 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
1bbe0 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45  ect();.....CACKE
1bbf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bc00 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74  Trying SCardList
1bc10 52 65 61 64 65 72 73 28 29 20 61 67 61 69 6e 22  Readers() again"
1bc20 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  );....scard_list
1bc30 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
1bc40 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
1bc50 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
1bc60 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  le, NULL, NULL, 
1bc70 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
1bc80 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  n);...}....if (s
1bc90 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1bca0 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
1bcb0 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f  SUCCESS && pcsc_
1bcc0 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30  readers_len != 0
1bcd0 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64  ) {....pcsc_read
1bce0 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ers = malloc(pcs
1bcf0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
1bd00 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
1bd10 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  s = pcsc_readers
1bd20 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  ;.....scard_list
1bd30 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
1bd40 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
1bd50 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
1bd60 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72  le, NULL, pcsc_r
1bd70 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65  eaders, &pcsc_re
1bd80 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69  aders_len);....i
1bd90 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
1bda0 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
1bdb0 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
1bdc0 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
1bdd0 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  e = pcsc_readers
1bde0 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   + pcsc_readers_
1bdf0 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61  len;....../* Sta
1be00 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20  rt with Slot ID 
1be10 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75  1, to avoid a bu
1be20 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c  g in GDM on RHEL
1be30 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35   */...../* Bug 5
1be40 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62  94911: https://b
1be50 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63  ugzilla.redhat.c
1be60 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f  om/show_bug.cgi?
1be70 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09  id=594911 */....
1be80 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09  .currslot = 1;..
1be90 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
1bea0 30 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63  0;.....while (pc
1beb0 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73  sc_readers < pcs
1bec0 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09  c_readers_e) {..
1bed0 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74  ..../* Find next
1bee0 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20   available slot 
1bef0 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b 20 63  */......for (; c
1bf00 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
1bf10 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1bf20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1bf30 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72  slots[0])); curr
1bf40 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09  slot++) {.......
1bf50 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1bf60 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1bf70 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65  ve) {........bre
1bf80 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ak;.......}.....
1bf90 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f 72 65  .}.......curr_re
1bfa0 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65  ader_len = strle
1bfb0 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  n(pcsc_readers);
1bfc0 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63  .......if ((pcsc
1bfd0 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f  _readers + curr_
1bfe0 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63  reader_len) > pc
1bff0 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
1c000 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c010 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
1c020 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d  rr_reader_len ==
1c030 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61   0) {.......brea
1c040 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
1c050 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20  if (currslot >= 
1c060 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1c070 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1c080 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1c090 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
1c0a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
1c0b0 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72  ound more reader
1c0c0 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65  s than slots are
1c0d0 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a   available!");..
1c0e0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c0f0 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59  ..}.......CACKEY
1c100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
1c110 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22  ound reader: %s"
1c120 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  , pcsc_readers);
1c130 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  ......./* Only u
1c140 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
1c150 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
1c160 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
1c170 20 61 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68   asked supply th
1c180 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
1c190 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70  on */......if (p
1c1a0 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09  SlotList) {.....
1c1b0 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74  ..if (slot_reset
1c1c0 29 20 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65  ) {........cacke
1c1d0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1c1e0 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
1c1f0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1c200 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
1c210 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09  rnal = 0;.......
1c220 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1c230 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1c240 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73  der = strdup(pcs
1c250 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09  c_readers);.....
1c260 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c270 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63  currslot].pcsc_c
1c280 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
1c290 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
1c2a0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c2b0 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  .transaction_dep
1c2c0 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63  th = 0;........c
1c2d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1c2e0 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f  slot].transactio
1c2f0 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
1c300 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
1c310 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1c320 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ].token_flags = 
1c330 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
1c340 45 44 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65  ED;........cacke
1c350 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1c360 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
1c370 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d  ........cackey_m
1c380 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
1c390 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c3a0 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d  rslot]);.......}
1c3b0 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
1c3c0 09 09 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69  ...../* Artifici
1c3d0 61 6c 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68  ally increase th
1c3e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  e number of acti
1c3f0 76 65 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74  ve slots by what
1c400 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74   will become act
1c410 69 76 65 20 2a 2f 0a 09 09 09 09 09 09 73 6c 6f  ive */.......slo
1c420 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
1c430 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b  }......currslot+
1c440 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65  +;.......pcsc_re
1c450 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65  aders += curr_re
1c460 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09  ader_len + 1;...
1c470 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28 63 75  ..}......for (cu
1c480 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
1c490 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1c4a0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1c4b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1c4c0 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1c4d0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
1c4e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c4f0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
1c500 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1c510 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1c520 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c  d active slot %l
1c530 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
1c540 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a  ng) currslot);..
1c550 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ......slot_count
1c560 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ++;......}.....}
1c570 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1c580 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c590 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c  INTF("Second cal
1c5a0 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65  l to SCardListRe
1c5b0 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65  aders failed, re
1c5c0 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41  turn %s/%li", CA
1c5d0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
1c5e0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
1c5f0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1c600 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  s_ret), (long) s
1c610 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1c620 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  _ret);....}.....
1c630 66 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72  free(pcsc_reader
1c640 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  s_s);...} else {
1c650 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c660 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63  _PRINTF("First c
1c670 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
1c680 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
1c690 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
1c6a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
1c6b0 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
1c6c0 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
1c6d0 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
1c6e0 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
1c6f0 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a  rs_ret);...}..}.
1c700 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1c710 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1c720 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1c730 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1c740 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1c750 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c760 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1c770 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1c780 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c790 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1c7a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74  ;..}...if (pSlot
1c7b0 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
1c7c0 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
1c7d0 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43  ot_count;....CAC
1c7e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c7f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c800 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20  OK (%i).  Found 
1c810 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62 75 74  %lu readers, but
1c820 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 73   not storing IDs
1c830 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
1c840 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28  ULL)", CKR_OK, (
1c850 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
1c860 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
1c870 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
1c880 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c  }...count = *pul
1c890 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e  Count;..if (coun
1c8a0 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20  t < slot_count) 
1c8b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c8c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c8d0 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25  User allocated %
1c8e0 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20  lu entries, but 
1c8f0 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72  we have %lu entr
1c900 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c  ies.", count, sl
1c910 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41  ot_count);....CA
1c920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c930 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c940 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
1c950 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  L");....return(C
1c960 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1c970 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65  ALL);...}...mute
1c980 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1c990 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1c9a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1c9b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1c9c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1c9d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c9e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1c9f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1ca00 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1ca10 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  ERROR);..}...slo
1ca20 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20  t_idx = 0;..for 
1ca30 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28  (currslot = 0; (
1ca40 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1ca50 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1ca60 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1ca70 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75  _slots[0]))); cu
1ca80 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66  rrslot++) {...if
1ca90 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
1caa0 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1cab0 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
1cac0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74  ...}....if (slot
1cad0 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b  _idx >= count) {
1cae0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1caf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cb00 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25  User allocated %
1cb10 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20  lu entries, but 
1cb20 77 65 20 6a 75 73 74 20 74 72 69 65 64 20 74 6f  we just tried to
1cb30 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 25 6c   write to the %l
1cb40 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72  u index -- ignor
1cb50 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f  ing", count, slo
1cb60 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74  t_idx);.....cont
1cb70 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c  inue;...}....pSl
1cb80 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d  otList[slot_idx]
1cb90 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73   = currslot;...s
1cba0 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09  lot_idx++;..}...
1cbb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1cbc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1cbd0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1cbe0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1cbf0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1cc00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cc10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1cc20 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1cc30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cc40 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1cc50 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  .}...*pulCount =
1cc60 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43   slot_count;...C
1cc70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cc80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1cc90 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
1cca0 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c  d %lu readers.",
1ccb0 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e   CKR_OK, (unsign
1ccc0 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f  ed long) slot_co
1ccd0 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
1cce0 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50  KR_OK);...tokenP
1ccf0 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72  resent = tokenPr
1cd00 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73  esent; /* Supres
1cd10 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
1cd20 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
1cd30 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1cd40 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
1cd50 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54  lotInfo)(CK_SLOT
1cd60 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53  _ID slotID, CK_S
1cd70 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  LOT_INFO_PTR pIn
1cd80 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
1cd90 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65  _UTF8CHAR slotDe
1cda0 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43  scription[] = "C
1cdb0 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e  ACKey Slot";..in
1cdc0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1cdd0 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f  .int bytes_to_co
1cde0 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  py;...CACKEY_DEB
1cdf0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ce00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1ce10 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1ce20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ce30 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1ce40 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1ce50 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1ce60 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1ce70 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1ce80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1ce90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cea0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1ceb0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1cec0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1ced0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1cee0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1cef0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1cf00 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1cf10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1cf20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1cf30 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1cf40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cf50 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1cf60 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1cf70 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1cf80 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1cf90 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1cfa0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1cfb0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1cfc0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1cfd0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1cfe0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1cff0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1d000 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1d010 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d020 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1d030 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1d040 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1d050 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1d060 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1d070 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1d080 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1d090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d0a0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1d0b0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1d0c0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1d0d0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1d0e0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1d0f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1d100 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1d110 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1d120 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1d130 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ..}...pInfo->fla
1d140 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54  gs = CKF_HW_SLOT
1d150 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1d160 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e  slots[slotID].in
1d170 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66  ternal) {...pInf
1d180 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
1d190 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45  REMOVABLE_DEVICE
1d1a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1d1b0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
1d1c0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1d1d0 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59  otID]) == CACKEY
1d1e0 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
1d1f0 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  SENT) {...pInfo-
1d200 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f  >flags |= CKF_TO
1d210 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a  KEN_PRESENT;..}.
1d220 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
1d230 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f  = strlen(cackey_
1d240 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63  slots[slotID].pc
1d250 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20  sc_reader);..if 
1d260 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d  (sizeof(pInfo->m
1d270 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c  anufacturerID) <
1d280 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
1d290 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  {...bytes_to_cop
1d2a0 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  y = sizeof(pInfo
1d2b0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1d2c0 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49  );..}..memcpy(pI
1d2d0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1d2e0 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  rID, cackey_slot
1d2f0 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
1d300 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f  eader, bytes_to_
1d310 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72  copy);...mutex_r
1d320 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1d330 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1d340 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1d350 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1d360 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d380 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1d390 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1d3a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1d3b0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65  _ERROR);..}...me
1d3c0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mset(pInfo->slot
1d3d0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
1d3e0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1d3f0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29  slotDescription)
1d400 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1d410 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
1d420 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  n, slotDescripti
1d430 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44  on, sizeof(slotD
1d440 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29  escription) - 1)
1d450 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1d460 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1d470 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1d480 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1d490 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  rID));...pInfo->
1d4a0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1d4b0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
1d4c0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1d4d0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1d4e0 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
1d4f0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
1d500 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
1d510 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
1d520 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1d530 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1d540 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
1d550 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
1d560 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
1d570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d580 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1d590 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1d5a0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1d5b0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1d5c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1d5d0 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
1d5e0 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
1d5f0 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
1d600 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1d610 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1d620 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
1d630 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
1d640 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
1d650 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
1d660 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
1d670 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
1d680 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1d690 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
1d6a0 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72  CAC Token";..str
1d6b0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
1d6c0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
1d6d0 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
1d6e0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
1d6f0 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61  rts;..ssize_t la
1d700 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  bel_ret;..int mu
1d710 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1d720 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62   use_default_lab
1d730 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  el;...CACKEY_DEB
1d740 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1d750 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1d760 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1d770 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d780 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1d790 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1d7a0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1d7b0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1d7c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1d7d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1d7e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d7f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1d800 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1d810 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1d820 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1d830 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1d840 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1d850 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1d860 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1d870 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1d880 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1d890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d8a0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1d8b0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1d8c0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1d8d0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1d8e0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1d8f0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1d900 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1d910 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d920 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1d930 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1d940 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1d950 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1d960 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d970 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1d980 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1d990 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1d9a0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1d9b0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1d9c0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1d9d0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1d9e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d9f0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1da00 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1da10 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1da20 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1da30 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1da40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1da50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1da60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1da70 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1da80 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1da90 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
1daa0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1dab0 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
1dac0 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
1dad0 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
1dae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
1daf0 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e   token is presen
1db00 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c  t in slotID = %l
1db10 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  u", slotID);....
1db20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1db30 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1db40 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1db50 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45  KR_TOKEN_NOT_PRE
1db60 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  SENT);..}...mute
1db70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1db80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1db90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1dba0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1dbb0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1dbc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dbd0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1dbe0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1dbf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1dc00 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1dc10 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f  ./* Determine to
1dc20 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63  ken label from c
1dc30 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
1dc40 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61  memset(pInfo->la
1dc50 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  bel, ' ', sizeof
1dc60 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1dc70 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1dc80 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63  bel = 1;...if (c
1dc90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1dca0 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c  ID].label == NUL
1dcb0 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e  L) {...pcsc_iden
1dcc0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
1dcd0 72 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b  read_certs(&cack
1dce0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1dcf0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
1dd00 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ts);...if (pcsc_
1dd10 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
1dd20 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d  LL) {....if (num
1dd30 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09  _certs > 0) {...
1dd40 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61  ..label_ret = ca
1dd50 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
1dd60 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63  ty_to_label(pcsc
1dd70 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e  _identities, pIn
1dd80 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  fo->label, sizeo
1dd90 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
1dda0 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f  ;.....if (label_
1ddb0 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  ret > 0) {......
1ddc0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1ddd0 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63  l = 0;.......cac
1dde0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1ddf0 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63  ].label = malloc
1de00 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c  (sizeof(pInfo->l
1de10 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65  abel));.......me
1de20 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74  mcpy(cackey_slot
1de30 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
1de40 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73   pInfo->label, s
1de50 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
1de60 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  el));.....}....}
1de70 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
1de80 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
1de90 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
1dea0 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  s, 1);...}..} el
1deb0 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  se {...memcpy(pI
1dec0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b  nfo->label, cack
1ded0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1dee0 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  .label, sizeof(p
1def0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
1df00 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1df10 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  bel = 0;..}...if
1df20 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61   (use_default_la
1df30 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  bel) {...memcpy(
1df40 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
1df50 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
1df60 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
1df70 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73   - 1);..}...mems
1df80 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
1df90 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
1dfa0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
1dfb0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
1dfc0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1dfd0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
1dfe0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
1dff0 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
1e000 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  rID) - 1);...mem
1e010 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  set(pInfo->model
1e020 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1e030 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d  nfo->model));..m
1e040 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emcpy(pInfo->mod
1e050 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f  el, model, sizeo
1e060 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a  f(model) - 1);..
1e070 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
1e080 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27  erialNumber, ' '
1e090 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1e0a0 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a  serialNumber));.
1e0b0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1e0c0 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69  utcTime, ' ', si
1e0d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54  zeof(pInfo->utcT
1e0e0 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  ime));...pInfo->
1e0f0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1e100 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
1e110 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1e120 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1e130 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
1e140 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
1e150 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
1e160 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
1e170 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1e180 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1e190 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
1e1a0 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
1e1b0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49  nor = 0x00;...pI
1e1c0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
1e1d0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
1e1e0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
1e1f0 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b  INITIALIZED | CK
1e200 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49  F_TOKEN_INITIALI
1e210 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f  ZED | cackey_slo
1e220 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
1e230 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d  _flags;...pInfo-
1e240 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75  >ulMaxSessionCou
1e250 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  nt = (sizeof(cac
1e260 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1e270 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1e280 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b  ssions[0])) - 1;
1e290 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69  ..pInfo->ulSessi
1e2a0 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41  onCount = CK_UNA
1e2b0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1e2c0 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
1e2d0 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  MaxRwSessionCoun
1e2e0 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75  t = 0;..pInfo->u
1e2f0 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  lRwSessionCount 
1e300 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1e310 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1e320 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65  Info->ulMaxPinLe
1e330 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d  n = 128;..pInfo-
1e340 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30  >ulMinPinLen = 0
1e350 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
1e360 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  lPublicMemory = 
1e370 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1e380 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1e390 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63  fo->ulFreePublic
1e3a0 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
1e3b0 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1e3c0 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  ION;..pInfo->ulT
1e3d0 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72  otalPrivateMemor
1e3e0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
1e3f0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1e400 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72  .pInfo->ulFreePr
1e410 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b  ivateMemory = CK
1e420 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1e430 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b  ORMATION;...CACK
1e440 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e450 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e460 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1e470 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1e480 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1e490 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1e4a0 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
1e4b0 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c  ent)(CK_FLAGS fl
1e4c0 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f  ags, CK_SLOT_ID_
1e4d0 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f  PTR pSlotID, CK_
1e4e0 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76  VOID_PTR pReserv
1e4f0 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ed) {..CACKEY_DE
1e500 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e510 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65  ed.");...if (pRe
1e520 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20  served != NULL) 
1e530 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e540 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e550 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74  pReserved is not
1e560 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1e570 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1e580 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1e590 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e5a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e5b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e5c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e5d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e5e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e5f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e600 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a  D);..}.../* XXX:
1e610 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74   TODO: Implement
1e620 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43   this... */..CAC
1e630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e640 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1e650 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e660 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1e670 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e680 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1e690 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1e6a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1e6b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1e6c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1e6d0 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
1e6e0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1e6f0 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
1e700 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68  M_TYPE_PTR pMech
1e710 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c  anismList, CK_UL
1e720 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
1e730 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1e740 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1e750 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1e760 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1e770 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e780 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e790 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1e7a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e7b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1e7c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1e7d0 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
1e7e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1e7f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e800 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75  ("Error.  pulCou
1e810 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
1e820 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1e830 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1e840 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
1e850 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
1e860 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b  ..*pulCount = 1;
1e870 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e880 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e890 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1e8a0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
1e8b0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
1e8c0 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20  ..if (*pulCount 
1e8d0 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 1) {...CACKEY_
1e8e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e8f0 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f  ror.  Buffer too
1e900 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65   small.");....re
1e910 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f  turn(CKR_BUFFER_
1e920 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a  TOO_SMALL);..}..
1e930 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b  .pMechanismList[
1e940 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  0] = CKM_RSA_PKC
1e950 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  S;..*pulCount = 
1e960 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  1;...CACKEY_DEBU
1e970 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e980 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1e990 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1e9a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1e9b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1e9c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
1e9d0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b  echanismInfo)(CK
1e9e0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1e9f0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
1ea00 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48  PE type, CK_MECH
1ea10 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70  ANISM_INFO_PTR p
1ea20 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
1ea30 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1ea40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1ea60 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1ea70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ea80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ea90 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1eaa0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1eab0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1eac0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1ead0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1eae0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1eaf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1eb00 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1eb10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1eb20 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1eb30 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1eb40 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1eb50 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1eb60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1eb70 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1eb80 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1eb90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1eba0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ebb0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1ebc0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1ebd0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1ebe0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1ebf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ec00 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1ec10 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1ec20 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1ec30 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1ec40 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1ec50 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1ec60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ec70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ec80 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1ec90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1eca0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1ecb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1ecc0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1ecd0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1ece0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ecf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1ed00 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1ed10 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1ed20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1ed30 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1ed40 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1ed50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1ed60 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1ed70 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1ed80 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1ed90 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1eda0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1edb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1edc0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1edd0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1ede0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1edf0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1ee00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1ee10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1ee20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1ee30 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20  ..switch (type) 
1ee40 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
1ee50 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d  _PKCS:....pInfo-
1ee60 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
1ee70 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
1ee80 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
1ee90 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
1eea0 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
1eeb0 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46  KF_ENCRYPT | CKF
1eec0 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53  _DECRYPT | CKF_S
1eed0 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
1eee0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
1eef0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ef00 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ef10 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1ef20 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1ef30 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57  CKR_OK);.}../* W
1ef40 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
1ef50 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
1ef60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1ef70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
1ef80 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  Token)(CK_SLOT_I
1ef90 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46  D slotID, CK_UTF
1efa0 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
1efb0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
1efc0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
1efd0 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41  TR pLabel) {..CA
1efe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eff0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1f000 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1f010 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1f020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f030 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1f040 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1f050 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1f060 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1f070 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1f080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f090 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
1f0a0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1f0b0 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
1f0c0 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
1f0d0 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
1f0e0 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
1f0f0 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
1f100 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
1f110 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
1f120 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1f130 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f140 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  InitPIN)(CK_SESS
1f150 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1f160 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
1f170 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
1f180 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
1f190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f1a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1f1b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1f1c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f1d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f1e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1f1f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f200 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f210 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1f220 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1f230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f240 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1f250 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1f260 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
1f270 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
1f280 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
1f290 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
1f2a0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
1f2b0 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
1f2c0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
1f2d0 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
1f2e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f2f0 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
1f300 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1f310 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
1f320 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
1f330 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
1f340 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
1f350 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
1f360 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
1f370 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1f380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1f390 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1f3a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f3b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1f3c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f3d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f3e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f3f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f400 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f410 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1f420 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1f430 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1f440 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1f450 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1f460 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f470 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1f480 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f490 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1f4a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1f4b0 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73  CK_RV, C_OpenSes
1f4c0 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  sion)(CK_SLOT_ID
1f4d0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47   slotID, CK_FLAG
1f4e0 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44  S flags, CK_VOID
1f4f0 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
1f500 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74  n, CK_NOTIFY not
1f510 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify, CK_SESSION_
1f520 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73  HANDLE_PTR phSes
1f530 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  sion) {..unsigne
1f540 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74  d long idx;..int
1f550 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1f560 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f  int found_sessio
1f570 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  n = 0;...CACKEY_
1f580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1f590 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
1f5a0 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
1f5b0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43  AL_SESSION) != C
1f5c0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
1f5d0 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  N) {...return(CK
1f5e0 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c  R_SESSION_PARALL
1f5f0 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  EL_NOT_SUPPORTED
1f600 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1f610 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f620 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f630 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f640 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f650 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f660 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f670 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f680 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
1f690 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
1f6a0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1f6b0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1f6c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1f6d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f6e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f6f0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1f700 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1f710 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
1f720 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
1f730 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f740 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1f750 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1f760 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1f770 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1f780 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1f790 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1f7a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f7b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f7c0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1f7d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f7e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1f7f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1f800 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f810 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1f820 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f830 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1f840 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1f850 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1f860 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1f870 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1f880 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1f890 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1f8a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1f8b0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1f8c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  NVALID);..}.../*
1f8d0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1f8e0 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c   card is actuall
1f8f0 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a  y in the slot. *
1f900 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b  /../* XXX: Check
1f910 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1f920 69 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43  is is in the PKC
1f930 53 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69  S#11 specificati
1f940 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65  on */..if (cacke
1f950 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
1f960 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1f970 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59  otID]) != CACKEY
1f980 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
1f990 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
1f9a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f9b0 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20  rror.  Card not 
1f9c0 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e  present.  Return
1f9d0 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  ing CKR_DEVICE_R
1f9e0 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63  EMOVED");....cac
1f9f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1fa00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1fa10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1fa20 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b  DEVICE_REMOVED);
1fa30 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1fa40 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   1; idx < (sizeo
1fa50 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1fa60 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1fa70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1fa80 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1fa90 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1faa0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
1fab0 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f  ....found_sessio
1fac0 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65  n = 1;.....*phSe
1fad0 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09  ssion = idx;....
1fae0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1faf0 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31  [idx].active = 1
1fb00 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1fb10 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
1fb20 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61   = slotID;....ca
1fb30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1fb40 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  x].state = CKS_R
1fb50 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e  O_PUBLIC_SESSION
1fb60 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1fb70 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20  ions[idx].flags 
1fb80 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b  = flags;....cack
1fb90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1fba0 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  .ulDeviceError =
1fbb0 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   0;....cackey_se
1fbc0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70  ssions[idx].pApp
1fbd0 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c  lication = pAppl
1fbe0 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b  ication;....cack
1fbf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1fc00 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79  .Notify = notify
1fc10 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1fc20 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
1fc30 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
1fc40 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1fc50 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
1fc60 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09  _count = 0;.....
1fc70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1fc80 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  idx].search_acti
1fc90 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
1fca0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1fcb0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
1fcc0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1fcd0 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79  sions[idx].decry
1fce0 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
1fcf0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1fd00 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
1fd10 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1fd20 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
1fd30 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1fd40 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
1fd50 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
1fd60 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09  ies_count);.....
1fd70 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
1fd80 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1fd90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1fda0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1fdb0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1fdc0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1fdd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fde0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1fdf0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1fe00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fe10 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1fe20 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64  ..}...if (!found
1fe30 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41  _session) {...CA
1fe40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fe50 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1fe60 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28  _SESSION_COUNT (
1fe70 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f  %i)", CKR_SESSIO
1fe80 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74  N_COUNT);....ret
1fe90 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1fea0 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  COUNT);..}...CAC
1feb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fec0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1fed0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1fee0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1fef0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1ff00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1ff10 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  , C_CloseSession
1ff20 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1ff30 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
1ff40 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1ff50 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1ff60 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1ff70 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1ff80 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1ff90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ffa0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ffb0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1ffc0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1ffd0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1ffe0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1fff0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
20000 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
20010 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
20020 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
20030 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
20040 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
20050 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20060 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
20070 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
20080 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
20090 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
200a0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
200b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
200c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
200d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
200e0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
200f0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20110 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20120 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20130 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20140 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20150 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
20160 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20170 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
20180 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
20190 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
201a0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
201b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
201c0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
201d0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
201e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
201f0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20200 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
20210 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20220 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  on].active = 0;.
20230 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
20240 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
20250 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
20260 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
20270 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20280 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
20290 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74  es_count);...mut
202a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
202b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
202c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
202d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
202e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
202f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20300 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
20310 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
20320 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20330 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20340 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20350 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20360 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
20370 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
20380 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
20390 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
203a0 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c  CK_RV, C_CloseAl
203b0 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c  lSessions)(CK_SL
203c0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a  OT_ID slotID) {.
203d0 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09  .uint32_t idx;..
203e0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
203f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
20400 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20410 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20420 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20430 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20440 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20450 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20460 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20470 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20480 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20490 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
204a0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
204b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
204c0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
204d0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
204e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
204f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20500 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
20510 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
20520 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
20530 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
20540 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
20550 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
20560 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
20570 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
20580 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
20590 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
205a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
205b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
205c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
205d0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
205e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
205f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
20600 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
20610 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
20620 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
20630 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20640 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
20650 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
20660 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
20670 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
20680 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
20690 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
206a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
206b0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
206c0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
206d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  ALID);..}...for 
206e0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
206f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
20700 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
20710 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
20720 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
20730 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
20740 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
20750 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ve) {....if (cac
20760 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
20770 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74  ].slotID != slot
20780 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ID) {.....contin
20790 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ue;....}.....cac
207a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
207b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
207c0 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73  ;....C_CloseSess
207d0 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63  ion(idx);....cac
207e0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
207f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20800 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
20810 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20820 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
20830 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
20840 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
20850 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20870 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
20880 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
20890 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
208a0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
208b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
208c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
208d0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
208e0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
208f0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
20900 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20910 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  V, C_GetSessionI
20920 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nfo)(CK_SESSION_
20930 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20940 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f   CK_SESSION_INFO
20950 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
20960 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
20970 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20980 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20990 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
209a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
209b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
209c0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
209d0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
209e0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
209f0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
20a00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20a10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20a30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20a40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20a50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20a60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20a70 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
20a80 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
20a90 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
20aa0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
20ab0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
20ac0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
20ad0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20ae0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20af0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
20b00 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
20b10 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20b20 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20b30 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
20b40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20b50 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
20b60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20b70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
20b80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20ba0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
20bb0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20bc0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20bd0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
20be0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20bf0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
20c00 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
20c10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20c20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
20c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20c40 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
20c50 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
20c60 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
20c70 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
20c80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
20c90 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20  pInfo->slotID = 
20ca0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20cb0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
20cc0 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20  ;..pInfo->state 
20cd0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
20ce0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
20cf0 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  e;..pInfo->flags
20d00 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
20d10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61  ns[hSession].fla
20d20 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65  gs;..pInfo->ulDe
20d30 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b  viceError = cack
20d40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20d50 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72  sion].ulDeviceEr
20d60 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ror;...mutex_ret
20d70 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20d80 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20d90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20da0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20db0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20dc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20dd0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
20de0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
20df0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
20e00 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
20e10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20e20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20e30 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20e40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
20e50 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
20e60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20e70 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_GetOperationS
20e80 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
20e90 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
20ea0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
20eb0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
20ec0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
20ed0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
20ee0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
20ef0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20f00 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
20f10 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
20f20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20f30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20f40 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
20f50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20f60 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
20f70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
20f80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20f90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20fa0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
20fb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
20fc0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
20fd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
20fe0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
20ff0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21000 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
21010 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
21020 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69  RV, C_SetOperati
21030 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
21040 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21050 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
21060 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
21070 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65  , CK_ULONG ulOpe
21080 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20  rationStateLen, 
21090 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
210a0 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c   hEncryptionKey,
210b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
210c0 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f  E hAuthenticatio
210d0 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nKey) {..CACKEY_
210e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
210f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
21100 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
21110 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
21120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21130 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
21140 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
21150 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
21160 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
21170 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
21180 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21190 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
211a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
211b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
211c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
211d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
211e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
211f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
21200 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
21210 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29  (CK_RV, C_Login)
21220 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
21230 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
21240 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
21250 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
21260 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
21270 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
21280 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
21290 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  D;..int mutex_re
212a0 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73  tval;..int tries
212b0 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
212c0 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41   login_ret;...CA
212d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
212e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
212f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21300 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21320 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21330 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21340 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21350 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21360 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
21370 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
21380 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
21390 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
213a0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
213b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
213c0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
213d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
213e0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
213f0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
21400 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21410 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21420 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
21430 28 75 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55  (userType != CKU
21440 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45  _USER) {...CACKE
21450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21460 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20  Error.  We only 
21470 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64  support USER mod
21480 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75  e, asked for %lu
21490 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e   mode.", (unsign
214a0 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70  ed long) userTyp
214b0 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  e)....return(CKR
214c0 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c  _USER_TYPE_INVAL
214d0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
214e0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
214f0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21500 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
21510 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21520 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21540 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21550 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21560 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21570 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
21580 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21590 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
215a0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
215b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
215c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
215d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
215e0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
215f0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
21600 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
21610 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
21620 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
21630 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
21640 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21650 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
21660 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
21670 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
21680 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
21690 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
216a0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
216b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
216c0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
216d0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
216e0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
216f0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
21700 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
21710 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21720 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
21730 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
21740 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
21750 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21770 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
21780 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
21790 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
217a0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
217b0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
217c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
217d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
217e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
217f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21800 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61  ..login_ret = ca
21810 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b  ckey_login(&cack
21820 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21830 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e  , pPin, ulPinLen
21840 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  , &tries_remaini
21850 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f  ng);..if (login_
21860 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
21870 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63  SC_S_OK) {...cac
21880 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21890 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
218a0 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72  ;....if (login_r
218b0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
218c0 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09  C_E_LOCKED) {...
218d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
218e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f  INTF("Error.  To
218f0 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29  ken is locked.")
21900 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
21910 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
21920 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
21930 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a  ER_PIN_LOCKED;..
21940 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
21950 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65  N_LOCKED);...} e
21960 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65  lse if (login_re
21970 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
21980 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09  _E_BADPIN) {....
21990 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
219a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76  NTF("Error.  Inv
219b0 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09  alid PIN.");....
219c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
219d0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
219e0 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
219f0 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09  N_COUNT_LOW;....
21a00 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
21a10 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09  ning == 1) {....
21a20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
21a30 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
21a40 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
21a50 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09  N_FINAL_TRY;....
21a60 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  }.....return(CKR
21a70 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
21a80 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
21a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21aa0 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
21ab0 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
21ac0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
21ad0 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
21ae0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21af0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
21b00 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
21b10 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
21b20 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f  _flags &= ~(CKF_
21b30 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20  USER_PIN_LOCKED 
21b40 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  | CKF_USER_PIN_C
21b50 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c  OUNT_LOW | CKF_L
21b60 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20  OGIN_REQUIRED | 
21b70 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
21b80 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65  AL_TRY);...cacke
21b90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21ba0 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
21bb0 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f  _RO_USER_FUNCTIO
21bc0 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  NS;...mutex_retv
21bd0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21be0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21bf0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
21c00 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
21c10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21c20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21c30 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
21c40 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21c50 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21c60 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
21c70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21c80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
21c90 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
21ca0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
21cb0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
21cc0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
21cd0 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53  C_Logout)(CK_SES
21ce0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
21cf0 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  sion) {..CK_SLOT
21d00 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
21d10 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
21d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21d30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21d40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21d50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21d70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21d80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21d90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21da0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21db0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
21dc0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
21dd0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
21de0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21df0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
21e00 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
21e10 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
21e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21e30 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
21e40 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
21e50 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
21e60 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
21e70 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
21e80 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21e90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
21ea0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21eb0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
21ec0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
21ed0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ee0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
21ef0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
21f00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21f10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21f20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
21f30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21f40 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
21f50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21f60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21f70 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21f80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21f90 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
21fa0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
21fb0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
21fc0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
21fd0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
21fe0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21ff0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
22000 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
22010 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
22020 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
22030 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
22040 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
22050 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22060 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22070 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
22080 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
22090 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
220a0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
220b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
220c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
220d0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
220e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
220f0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
22100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22110 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
22120 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
22130 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
22140 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
22150 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
22160 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22170 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22180 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
22190 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
221a0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
221b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
221c0 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
221d0 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b  _PUBLIC_SESSION;
221e0 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
221f0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
22200 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
22210 45 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78  EQUIRED;...mutex
22220 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
22230 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22240 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22250 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22260 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
22270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22280 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
22290 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
222a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
222b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
222c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
222d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
222e0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
222f0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
22300 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
22310 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22320 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a  _RV, C_CreateObj
22330 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
22340 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
22350 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
22360 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
22370 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
22380 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
22390 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a  PTR phObject) {.
223a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
223b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
223c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
223d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
223e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
223f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
22400 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
22410 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
22420 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
22430 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
22440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22450 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22460 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22470 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
22480 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22490 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
224a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
224b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
224c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
224d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
224e0 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b  C_CopyObject)(CK
224f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22500 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
22510 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
22520 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
22530 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
22540 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
22550 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
22560 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65  LE_PTR phNewObje
22570 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
22580 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22590 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
225a0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
225b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
225c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
225d0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
225e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
225f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22600 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22610 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22620 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22630 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
22640 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
22650 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
22660 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22670 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22680 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22690 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
226a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
226b0 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f  K_RV, C_DestroyO
226c0 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
226d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
226e0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
226f0 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09  DLE hObject) {..
22700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22710 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22720 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22730 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22740 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22750 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22760 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22770 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22780 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22790 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
227a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
227b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
227c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
227d0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
227e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
227f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22800 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22810 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22820 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22830 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22840 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28  _GetObjectSize)(
22850 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22860 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
22870 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
22880 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ject, CK_ULONG_P
22890 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43  TR pulSize) {..C
228a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
228b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
228c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
228d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
228e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
228f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
22900 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
22910 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
22920 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
22930 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
22940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22950 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22960 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22970 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
22980 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22990 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
229a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
229b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
229c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
229d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
229e0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
229f0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
22a00 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
22a10 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
22a20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
22a30 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
22a40 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
22a50 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54  Count) {..CK_ATT
22a60 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
22a70 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  r;..struct cacke
22a80 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
22a90 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20  tity;..unsigned 
22aa0 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64  long identity_id
22ab0 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73  x, attr_idx, ses
22ac0 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f  s_attr_idx, num_
22ad0 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ids;..int mutex_
22ae0 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72  retval;..CK_RV r
22af0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
22b00 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61  .CK_VOID_PTR pVa
22b10 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  lue;..CK_ULONG u
22b20 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43  lValueLen;...CAC
22b30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22b40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
22b50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
22b60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
22b70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22b80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
22b90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
22ba0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22bb0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22bc0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
22bd0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
22be0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
22bf0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
22c00 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
22c10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
22c20 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
22c30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22c40 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
22c50 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
22c60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
22c70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
22c80 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
22c90 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a  hObject == 0) {.
22ca0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22cb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
22cc0 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
22cd0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
22ce0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
22cf0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
22d00 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
22d10 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  lCount == 0) {..
22d20 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
22d30 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
22d40 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
22d50 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
22d60 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
22d70 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
22d80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22d90 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
22da0 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
22db0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
22dc0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
22dd0 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
22de0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
22df0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22e00 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70  F("Error.  pTemp
22e10 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  late is NULL.");
22e20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
22e30 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
22e40 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78  }...identity_idx
22e50 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a   = hObject - 1;.
22e60 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
22e70 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
22e80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22e90 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
22ea0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
22eb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22ec0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
22ed0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22ee0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22ef0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22f00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22f10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22f20 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
22f30 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
22f40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22f50 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
22f60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22f70 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
22f80 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
22f90 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
22fa0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
22fb0 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20  );..}...num_ids 
22fc0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
22fd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
22fe0 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09  tities_count;...
22ff0 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78  if (identity_idx
23000 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09   >= num_ids) {..
23010 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23020 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23030 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
23040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23050 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e  ror.  Object han
23060 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
23070 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20  .  identity_idx 
23080 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d  = %lu, num_ids =
23090 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65   %lu.", (unsigne
230a0 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
230b0 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  _idx, (unsigned 
230c0 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a  long) num_ids);.
230d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42  ...return(CKR_OB
230e0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  JECT_HANDLE_INVA
230f0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74  LID);..}...ident
23100 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
23110 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23120 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e  .identities[iden
23130 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72  tity_idx];...for
23140 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20   (attr_idx = 0; 
23150 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75  attr_idx < ulCou
23160 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20  nt; attr_idx++) 
23170 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  {...curr_attr = 
23180 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f  &pTemplate[attr_
23190 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20  idx];....pValue 
231a0 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
231b0 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
231c0 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44   -1;....CACKEY_D
231d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f  EBUG_PRINTF("Loo
231e0 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75  king for attribu
231f0 74 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e  te 0x%08lx (iden
23200 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20  tity:%lu) ...", 
23210 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
23220 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
23230 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
23240 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a   identity_idx);.
23250 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
23260 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
23270 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74  attr_idx < ident
23280 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f  ity->attributes_
23290 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72  count; sess_attr
232a0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20  _idx++) {....if 
232b0 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69  (identity->attri
232c0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
232d0 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72  idx].type == cur
232e0 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a  r_attr->type) {.
232f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23300 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f  _PRINTF(" ... fo
23310 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d  und it, pValue =
23320 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20   %p, ulValueLen 
23330 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79  = %lu", identity
23340 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
23350 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c  s_attr_idx].pVal
23360 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  ue, identity->at
23370 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
23380 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
23390 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56  en);..........pV
233a0 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  alue = identity-
233b0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
233c0 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
233d0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
233e0 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  n = identity->at
233f0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
23400 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
23410 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  en;....}...}....
23420 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
23430 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29  Value && pValue)
23440 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61   {....if (curr_a
23450 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
23460 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  >= ulValueLen) {
23470 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
23480 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70  _attr->pValue, p
23490 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65  Value, ulValueLe
234a0 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  n);....} else {.
234b0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
234c0 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
234d0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
234e0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
234f0 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  L;....}...}....c
23500 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
23510 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
23520 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  n;..}...mutex_re
23530 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
23540 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
23560 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
23570 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
23580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23590 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
235a0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
235b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
235c0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
235d0 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41  (retval == CKR_A
235e0 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e  TTRIBUTE_TYPE_IN
235f0 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45  VALID) {...CACKE
23600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23610 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54  Returning CKR_AT
23620 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
23630 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74  ALID (%i)", (int
23640 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
23650 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
23660 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
23670 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45  SMALL) {...CACKE
23680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23690 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
236a0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28  FFER_TOO_SMALL (
236b0 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
236c0 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
236d0 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f  (retval == CKR_O
236e0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
236f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23700 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
23710 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
23720 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
23730 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23740 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
23750 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
23760 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
23770 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
23780 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23790 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75  RV, C_SetAttribu
237a0 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
237b0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
237c0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
237d0 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
237e0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
237f0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
23800 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
23810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23820 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23830 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
23840 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
23850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23860 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
23870 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
23880 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
23890 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
238a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
238b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
238c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
238d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
238e0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
238f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23900 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
23910 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
23920 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23930 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
23940 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
23950 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
23960 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
23970 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
23980 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
23990 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
239a0 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
239b0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
239c0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b  ;..CK_ULONG idx;
239d0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
239e0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
239f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23a00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23a10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23a20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23a30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23a40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23a50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23a60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23a70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23a80 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
23a90 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
23aa0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
23ab0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
23ac0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23ad0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
23ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23af0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
23b00 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
23b10 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
23b20 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
23b30 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
23b40 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
23b50 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
23b60 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
23b70 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
23b80 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23b90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23ba0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23bb0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
23bc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23bd0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23be0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
23bf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23c00 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
23c10 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23c20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23c30 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
23c40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23c50 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
23c60 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
23c70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
23c80 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
23c90 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
23ca0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23cb0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
23cc0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
23cd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23ce0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23cf0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23d00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23d10 20 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20   Search already 
23d20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
23d30 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
23d40 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
23d50 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
23d60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23d70 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
23d80 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
23d90 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
23da0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
23db0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
23dc0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
23dd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23de0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
23df0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
23e00 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
23e10 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
23e20 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
23e30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
23e40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
23e50 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
23e60 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
23e70 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
23e80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23e90 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
23ea0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
23eb0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
23ec0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
23ed0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
23ee0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23ef0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23f00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23f10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23f20 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23f30 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
23f40 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41  ot_reset) {...CA
23f50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23f60 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20  F("The slot has 
23f70 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65  been reset since
23f80 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20   we last looked 
23f90 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d  for identities -
23fa0 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a  - rescanning");.
23fb0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
23fc0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23fd0 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  .identities != N
23fe0 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  ULL) {....cackey
23ff0 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
24000 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
24010 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
24020 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
24030 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24040 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
24050 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  t);.....cackey_s
24060 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24070 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ].identities = N
24080 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ULL;....cackey_s
24090 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
240a0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
240b0 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69  nt = 0;...}....i
240c0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
240d0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d  slotID].label !=
240e0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65   NULL) {....free
240f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
24100 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09  otID].label);...
24110 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
24120 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  otID].label = NU
24130 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  LL;...}....cacke
24140 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
24150 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
24160 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b  slotID]);...cack
24170 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
24180 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
24190 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
241a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
241b0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
241c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
241d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
241e0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
241f0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69   = cackey_read_i
24200 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65  dentities(&cacke
24210 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
24220 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
24230 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
24240 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  tities_count);..
24250 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74  }...if (pTemplat
24260 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  e != NULL) {...i
24270 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
24280 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73   {....cackey_ses
24290 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
242a0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
242b0 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09  nt = ulCount;...
242c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
242d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
242e0 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63  h_query = malloc
242f0 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  (ulCount * sizeo
24300 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a  f(*pTemplate));.
24310 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
24320 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24330 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
24340 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c  y, pTemplate, ul
24350 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
24360 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09  pTemplate));....
24370 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
24380 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78  x < ulCount; idx
24390 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54  ++) {.....if (pT
243a0 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56  emplate[idx].ulV
243b0 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  alueLen == 0) {.
243c0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
243d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
243e0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
243f0 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
24400 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
24410 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
24420 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24430 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
24440 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
24450 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65  malloc(pTemplate
24460 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
24470 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b  );......if (cack
24480 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24490 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
244a0 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20  ry[idx].pValue) 
244b0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  {......memcpy(ca
244c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
244d0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
244e0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
244f0 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
24500 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61  .pValue, pTempla
24510 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
24520 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  en);.....}....}.
24530 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61  ..} else {....ca
24540 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24550 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
24560 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
24570 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24580 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
24590 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
245a0 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
245b0 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d  ..if (ulCount !=
245c0 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f   0) {....cackey_
245d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
245e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
245f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24600 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24610 65 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63  earch query spec
24620 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62  ified as NULL, b
24630 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65  ut number of que
24640 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65  ry terms not spe
24650 63 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a  cified as 0.");.
24660 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
24670 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
24680 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
24690 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
246a0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
246b0 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  nt = 0;...cackey
246c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
246d0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
246e0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61   = NULL;..}...ca
246f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24700 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
24710 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b  ctive = 1;..cack
24720 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24730 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
24740 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65  r_id = 0;...mute
24750 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
24760 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24770 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24780 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24790 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
247a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
247b0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
247c0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
247d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
247e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
247f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24800 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24810 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
24820 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
24830 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74  CKR_OK);.}..stat
24840 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b  ic int cackey_pk
24850 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74  cs11_compare_att
24860 72 69 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49  ributes(CK_ATTRI
24870 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52  BUTE *a, CK_ATTR
24880 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73  IBUTE *b) {..uns
24890 69 67 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c  igned char *smal
248a0 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b  lbuf, *largebuf;
248b0 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75  ..size_t smallbu
248c0 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f  f_len, largebuf_
248d0 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79  len;...if (a->ty
248e0 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b  pe != b->type) {
248f0 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
24900 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24910 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20  PRINTF("    ... 
24920 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74  found matching t
24930 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43  ype ...");...CAC
24940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
24950 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20  UF("    ... our 
24960 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c  value:", a->pVal
24970 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, a->ulValueLe
24980 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61  n);...if (b->pVa
24990 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lue == NULL) {..
249a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
249b0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
249c0 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20   found wildcard 
249d0 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75  match");....retu
249e0 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  rn(1);..}...if (
249f0 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  a->pValue == NUL
24a00 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  L) {...return(0)
24a10 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75  ;..}.. .if (b->u
24a20 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e  lValueLen == a->
24a30 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65  ulValueLen && me
24a40 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20  mcmp(a->pValue, 
24a50 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c  b->pValue, b->ul
24a60 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20  ValueLen) == 0) 
24a70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24a80 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
24a90 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20  ... found exact 
24aa0 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75  match");....retu
24ab0 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  rn(1);..}...swit
24ac0 63 68 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09  ch (a->type) {..
24ad0 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55  .case CKA_MODULU
24ae0 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56  S:....if (a->ulV
24af0 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c  alueLen == b->ul
24b00 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09  ValueLen) {.....
24b10 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
24b20 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (a->ulValueLe
24b30 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n > b->ulValueLe
24b40 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  n) {.....smallbu
24b50 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = b->pValue;..
24b60 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20  ...smallbuf_len 
24b70 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = b->ulValueLen;
24b80 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d  ......largebuf =
24b90 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   a->pValue;.....
24ba0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61  largebuf_len = a
24bb0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ->ulValueLen;...
24bc0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d  .} else {.....sm
24bd0 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c  allbuf = a->pVal
24be0 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  ue;.....smallbuf
24bf0 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75  _len = a->ulValu
24c00 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65  eLen;......large
24c10 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b  buf = b->pValue;
24c20 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65  .....largebuf_le
24c30 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = b->ulValueLe
24c40 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20  n;....}.....for 
24c50 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  (; largebuf_len 
24c60 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b  != smallbuf_len;
24c70 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67   largebuf++,larg
24c80 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09  ebuf_len--) {...
24c90 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30  ..if (largebuf[0
24ca0 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62  ] != 0) {......b
24cb0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
24cc0 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 65 62 75  .....if (largebu
24cd0 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75  f_len != smallbu
24ce0 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  f_len) {.....bre
24cf0 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
24d00 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66  (memcmp(largebuf
24d10 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c  , smallbuf, smal
24d20 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20  lbuf_len) == 0) 
24d30 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
24d40 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
24d50 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72    ... found appr
24d60 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b  oximate match");
24d70 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b  ......return(1);
24d80 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
24d90 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ..}...return(0);
24da0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24db0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24dc0 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f  FindObjects)(CK_
24dd0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24de0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
24df0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
24e00 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
24e10 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
24e20 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
24e30 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20  pulObjectCount) 
24e40 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
24e50 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  _identity *curr_
24e60 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  id;..CK_ATTRIBUT
24e70 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43  E *curr_attr;..C
24e80 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f  K_ULONG curr_id_
24e90 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64  idx, curr_out_id
24ea0 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f  _idx, curr_attr_
24eb0 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69  idx, sess_attr_i
24ec0 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61  dx;..CK_ULONG ma
24ed0 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65  tched_count, pre
24ee0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b  v_matched_count;
24ef0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
24f00 61 6c 3b 0a 23 69 66 64 65 66 20 43 41 43 4b 45  al;.#ifdef CACKE
24f10 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53  Y_DEBUG_SEARCH_S
24f20 50 45 45 44 54 45 53 54 0a 09 73 74 72 75 63 74  PEEDTEST..struct
24f30 20 74 69 6d 65 76 61 6c 20 73 74 61 72 74 2c 20   timeval start, 
24f40 65 6e 64 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73  end;..uint64_t s
24f50 74 61 72 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e  tart_int, end_in
24f60 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  t;.#endif...CACK
24f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24f80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24f90 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24fa0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24fb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24fc0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24fd0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24fe0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24ff0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25000 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
25010 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20  lObjectCount == 
25020 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
25030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25040 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74  rror.  pulObject
25050 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29  Count is NULL.")
25060 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25070 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
25080 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63  .}...if (phObjec
25090 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d  t == NULL && ulM
250a0 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  axObjectCount ==
250b0 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
250c0 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72   circuit, if zer
250d0 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73  o objects were s
250e0 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20  pecified return 
250f0 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64  zero items immed
25100 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c  iately */...*pul
25110 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b  ObjectCount = 0;
25120 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25130 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25140 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
25150 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
25160 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
25170 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
25180 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d  ..if (phObject =
25190 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
251a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
251b0 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63  "Error.  phObjec
251c0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
251d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
251e0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
251f0 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74  .if (ulMaxObject
25200 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
25210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78  NTF("Error.  Max
25230 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f  imum number of o
25240 62 6a 65 63 74 73 20 73 70 65 63 69 66 69 65 64  bjects specified
25250 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09   as zero.");....
25260 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
25270 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
25280 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
25290 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
252a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
252b0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
252c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
252d0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
252e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
252f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
25300 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
25310 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
25320 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
25330 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
25340 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
25350 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
25360 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25370 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25380 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
25390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
253a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
253b0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
253c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
253d0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
253e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
253f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25400 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
25410 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25420 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25430 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
25440 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25450 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
25460 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
25470 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
25480 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25490 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
254a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
254b0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
254c0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
254d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
254e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
254f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25500 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
25510 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e  arch not active.
25520 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
25530 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
25540 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
25550 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
25560 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53  Y_DEBUG_SEARCH_S
25570 50 45 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d  PEEDTEST..gettim
25580 65 6f 66 64 61 79 28 26 73 74 61 72 74 2c 20 4e  eofday(&start, N
25590 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63  ULL);.#endif...c
255a0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d  urr_out_id_idx =
255b0 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69   0;..for (curr_i
255c0 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73  d_idx = cackey_s
255d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
255e0 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
255f0 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20  ; curr_id_idx < 
25600 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25610 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
25620 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c  ties_count && ul
25630 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20  MaxObjectCount; 
25640 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b  curr_id_idx++) {
25650 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61  ...curr_id = &ca
25660 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25670 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
25680 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b  es[curr_id_idx];
25690 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
256a0 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73  _PRINTF("Process
256b0 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75  ing identity:%lu
256c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
256d0 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  g) curr_id_idx);
256e0 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
256f0 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63  t = 0;....for (c
25700 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  urr_attr_idx = 0
25710 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20  ; curr_attr_idx 
25720 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
25730 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
25740 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20  ch_query_count; 
25750 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29  curr_attr_idx++)
25760 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68   {....prev_match
25770 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68  ed_count = match
25780 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75  ed_count;.....cu
25790 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65  rr_attr = &cacke
257a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
257b0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
257c0 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d  y[curr_attr_idx]
257d0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
257e0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65  UG_PRINTF("  Che
257f0 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62  cking for attrib
25800 75 74 65 20 25 73 20 28 30 78 25 30 38 6c 78 29  ute %s (0x%08lx)
25810 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e   in identity:%i.
25820 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
25830 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45  G_FUNC_ATTRIBUTE
25840 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f 61 74 74  _TO_STR(curr_att
25850 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73 69 67  r->type), (unsig
25860 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
25870 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29  ttr->type, (int)
25880 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
25890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
258a0 52 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c  RINTBUF("    Val
258b0 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22  ue looking for:"
258c0 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  , curr_attr->pVa
258d0 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  lue, curr_attr->
258e0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
258f0 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
25900 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
25910 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64  tr_idx < curr_id
25920 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
25930 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
25940 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63  x++) {.....if (c
25950 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d  ackey_pkcs11_com
25960 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28  pare_attributes(
25970 26 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62  &curr_id->attrib
25980 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
25990 64 78 5d 2c 20 63 75 72 72 5f 61 74 74 72 29 29  dx], curr_attr))
259a0 20 7b 0a 09 09 09 09 09 6d 61 74 63 68 65 64 5f   {......matched_
259b0 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62  count++;.......b
259c0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  reak;.....}....}
259d0 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61  ...../* If the a
259e0 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e  ttribute could n
259f0 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64  ot be matched, d
25a00 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74  o not try to mat
25a10 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74  ch additional at
25a20 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69  tributes */....i
25a30 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  f (prev_matched_
25a40 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64  count == matched
25a50 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72  _count) {.....br
25a60 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
25a70 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75  .if (matched_cou
25a80 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73  nt == cackey_ses
25a90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25aa0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
25ab0 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
25ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
25ad0 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69  ... All %i attri
25ae0 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f  butes checked fo
25af0 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20  r found, adding 
25b00 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72  identity:%i to r
25b10 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28  eturned list", (
25b20 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
25b30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25b40 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
25b50 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  t, (int) curr_id
25b60 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a  _idx);.....phObj
25b70 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f  ect[curr_out_id_
25b80 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69  idx] = curr_id_i
25b90 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61  dx + 1;.....ulMa
25ba0 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a  xObjectCount--;.
25bb0 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f  ....curr_out_id_
25bc0 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20  idx++;...} else 
25bd0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
25be0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
25bf0 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79  Not all %i (only
25c00 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69   found %i) attri
25c10 62 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f  butes checked fo
25c20 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64  r found, not add
25c30 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22  ing identity:%i"
25c40 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
25c50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25c60 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
25c70 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63  ount, (int) matc
25c80 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  hed_count, (int)
25c90 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
25ca0 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65  .}..}..cackey_se
25cb0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25cc0 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20  .search_curr_id 
25cd0 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09  = curr_id_idx;..
25ce0 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  *pulObjectCount 
25cf0 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  = curr_out_id_id
25d00 78 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  x;..#ifdef CACKE
25d10 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53  Y_DEBUG_SEARCH_S
25d20 50 45 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d  PEEDTEST..gettim
25d30 65 6f 66 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c  eofday(&end, NUL
25d40 4c 29 3b 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d  L);..start_int =
25d50 20 28 73 74 61 72 74 2e 74 76 5f 73 65 63 20 2a   (start.tv_sec *
25d60 20 31 30 30 30 30 30 30 29 20 2b 20 73 74 61 72   1000000) + star
25d70 74 2e 74 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f  t.tv_usec;..end_
25d80 69 6e 74 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65  int = (end.tv_se
25d90 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 65  c * 1000000) + e
25da0 6e 64 2e 74 76 5f 75 73 65 63 3b 0a 09 66 70 72  nd.tv_usec;..fpr
25db0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 65  intf(stderr, "Se
25dc0 61 72 63 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69  arch took %lu mi
25dd0 63 72 6f 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28  croseconds\n", (
25de0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
25df0 65 6e 64 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f  end_int - start_
25e00 69 6e 74 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  int));.#endif...
25e10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
25e20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
25e30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25e40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
25e50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
25e60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25e70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
25e80 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
25e90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25ea0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
25eb0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
25ec0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
25ed0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c  ing CKR_OK (%i),
25ee0 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25   num objects = %
25ef0 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75  lu", CKR_OK, *pu
25f00 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a  lObjectCount);..
25f10 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
25f20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
25f30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25f40 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
25f50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
25f60 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
25f70 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09  .CK_ULONG idx;..
25f80 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
25f90 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
25fa0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
25fb0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
25fc0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
25fd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25fe0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25ff0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
26000 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26010 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
26020 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
26030 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
26040 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
26050 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
26060 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
26070 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
26080 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
26090 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
260a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
260b0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
260c0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
260d0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
260e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
260f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
26100 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
26110 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26120 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
26130 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
26140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26150 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
26160 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
26170 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26180 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26190 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
261a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
261b0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
261c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
261d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
261e0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
261f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26200 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
26210 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
26220 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
26230 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
26240 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
26250 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26260 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
26270 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
26280 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26290 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
262a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
262b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
262c0 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76  Search not activ
262d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
262e0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
262f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26300 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
26310 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26320 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
26330 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d   0;...for (idx =
26340 20 30 3b 20 69 64 78 20 3c 20 63 61 63 6b 65 79   0; idx < cackey
26350 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26360 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26370 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b  _count; idx++) {
26380 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
26390 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
263a0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
263b0 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  x].pValue) {....
263c0 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
263d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
263e0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
263f0 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d  .pValue);...}..}
26400 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
26410 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26420 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29 20 7b  .search_query) {
26430 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
26440 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26450 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29 3b  ].search_query);
26460 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26470 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26480 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26490 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
264a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
264b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
264c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
264d0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
264e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
264f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26500 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
26510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26520 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
26530 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
26540 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
26550 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26560 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26570 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29 28 43  C_EncryptInit)(C
26580 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
26590 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
265a0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
265b0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
265c0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
265d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
265e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
265f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26600 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26610 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26620 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26630 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26640 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26650 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26660 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26680 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26690 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
266a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
266b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
266c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
266d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
266e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
266f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26700 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26710 20 43 5f 45 6e 63 72 79 70 74 29 28 43 4b 5f 53   C_Encrypt)(CK_S
26720 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26730 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
26740 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
26750 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
26760 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
26770 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c  yptedData, CK_UL
26780 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
26790 70 74 65 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09  ptedDataLen) {..
267a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
267b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
267c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
267d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
267e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
267f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26800 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26810 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26820 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26830 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
26840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26850 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
26860 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26870 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
26880 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26890 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
268a0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
268b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
268c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
268d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
268e0 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  _EncryptUpdate)(
268f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26900 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
26910 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
26920 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
26930 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
26940 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
26950 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
26960 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
26970 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
26980 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
26990 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
269a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
269b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
269c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
269d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
269e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
269f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
26a00 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
26a10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26a20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26a30 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26a40 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
26a50 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
26a60 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26a70 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
26a80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26a90 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
26aa0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
26ab0 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61  V, C_EncryptFina
26ac0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
26ad0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
26ae0 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74  K_BYTE_PTR pLast
26af0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
26b00 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c  K_ULONG_PTR pulL
26b10 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74  astEncryptedPart
26b20 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
26b30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26b40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
26b50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26b60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
26b70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26b80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
26b90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
26ba0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
26bb0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
26bc0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26bd0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26be0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
26bf0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
26c00 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
26c10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26c20 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
26c30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
26c40 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
26c50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
26c60 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
26c70 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
26c80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26c90 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
26ca0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
26cb0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
26cc0 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74  hKey) {..int mut
26cd0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65  ex_retval;...hKe
26ce0 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  y--;...CACKEY_DE
26cf0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26d00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
26d10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
26d20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26d30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26d40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
26d50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26d60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
26d70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
26d80 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
26d90 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ism == NULL) {..
26da0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26db0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
26dc0 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e  chanism is NULL.
26dd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26de0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
26df0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
26e00 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
26e10 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   != CKM_RSA_PKCS
26e20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26e30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26e40 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  . pMechanism->me
26e50 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63  chanism not spec
26e60 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41  ified as CKM_RSA
26e70 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75  _PKCS");....retu
26e80 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d  rn(CKR_MECHANISM
26e90 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b  _PARAM_INVALID);
26ea0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
26eb0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
26ec0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
26ed0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
26ee0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
26ef0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
26f00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26f10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26f20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
26f30 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
26f40 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
26f50 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
26f60 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
26f70 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
26f80 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
26f90 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
26fa0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
26fb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26fc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26fd0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
26fe0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26ff0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27000 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
27010 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27020 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
27030 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
27040 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27050 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
27060 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27070 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
27080 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
27090 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
270a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
270b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
270c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
270d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
270e0 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
270f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27100 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27110 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
27120 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27130 72 2e 20 20 44 65 63 72 79 70 74 20 61 6c 72 65  r.  Decrypt alre
27140 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ady in progress.
27150 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
27160 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
27170 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  TIVE);..}...if (
27180 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73  hKey >= cackey_s
27190 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
271a0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
271b0 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  nt) {...cackey_m
271c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
271d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
271e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
271f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79  NTF("Error.  Key
27200 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
27210 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20  ange (requested 
27220 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c  key %lu, only %l
27230 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61  u identities ava
27240 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69  ilable).", (unsi
27250 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c  gned long) hKey,
27260 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
27270 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
27280 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
27290 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
272a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f  .return(CKR_KEY_
272b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
272c0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
272d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
272e0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
272f0 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73   1;...cackey_ses
27300 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27310 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
27320 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
27330 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b  mechanism;..cack
27340 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27350 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
27360 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63 68 61  ch_parm = pMecha
27370 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72  nism->pParameter
27380 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
27390 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
273a0 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65  rypt_mech_parmle
273b0 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  n = pMechanism->
273c0 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a  ulParameterLen;.
273d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
273e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
273f0 70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63  pt_identity = &c
27400 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27410 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
27420 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74  ies[hKey];...mut
27430 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
27440 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27450 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27460 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
27470 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
27480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27490 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
274a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
274b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
274c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
274d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
274e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
274f0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
27500 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
27510 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
27520 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
27530 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
27540 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27550 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27560 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
27570 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  ptedData, CK_ULO
27580 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61  NG ulEncryptedDa
27590 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
275a0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
275b0 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65  NG_PTR pulDataLe
275c0 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64  n) {..CK_ULONG d
275d0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64  atalen_update, d
275e0 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43  atalen_final;..C
275f0 4b 5f 52 56 20 64 65 63 72 79 70 74 5f 72 65 74  K_RV decrypt_ret
27600 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
27610 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
27620 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
27630 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
27640 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
27650 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27660 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27670 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
27680 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27690 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
276a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
276b0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61  .}...if (pulData
276c0 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
276d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
276e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
276f0 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  DataLen is NULL.
27700 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27710 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
27720 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75  ;..}...datalen_u
27730 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61  pdate = *pulData
27740 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  Len;...decrypt_r
27750 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70  et = C_DecryptUp
27760 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
27770 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 75  EncryptedData, u
27780 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
27790 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c  n, pData, &datal
277a0 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20  en_update);..if 
277b0 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20  (decrypt_ret != 
277c0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
277d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
277e0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
277f0 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
27800 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
27810 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
27820 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f  d long) decrypt_
27830 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 64 65 63  ret);....if (dec
27840 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
27850 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
27860 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e  ) {..../* Termin
27870 61 74 65 20 64 65 63 72 79 70 74 69 6f 6e 20 6f  ate decryption o
27880 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09  peration */.....
27890 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
278a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
278b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
278c0 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
278d0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
278e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
278f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
27900 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
27910 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
27920 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27930 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
27940 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27950 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
27960 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
27970 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
27980 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
27990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
279a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
279b0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
279c0 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
279d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
279e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
279f0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
27a00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27a10 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
27a20 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  _active) {.....c
27a30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27a40 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27a50 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
27a60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27a70 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f  ror.  Decrypt no
27a80 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
27a90 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
27aa0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
27ab0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a  TIALIZED);....}.
27ac0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
27ad0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
27ae0 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
27af0 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  ;.....mutex_retv
27b00 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27b10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27b20 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
27b30 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
27b40 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
27b50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27b60 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
27b70 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
27b80 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27b90 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
27ba0 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64  ...}....return(d
27bb0 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a  ecrypt_ret);..}.
27bc0 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09  ..if (pData) {..
27bd0 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65  .pData += datale
27be0 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61  n_update;..}..da
27bf0 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70  talen_final = *p
27c00 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61  ulDataLen - data
27c10 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65  len_update;...de
27c20 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65  crypt_ret = C_De
27c30 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73  cryptFinal(hSess
27c40 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74  ion, pData, &dat
27c50 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66  alen_final);..if
27c60 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
27c70 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
27c80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27c90 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
27ca0 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  tFinal() returne
27cb0 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
27cc0 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
27cd0 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f  d long) decrypt_
27ce0 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
27cf0 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d  decrypt_ret);..}
27d00 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d  ...*pulDataLen =
27d10 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20   datalen_update 
27d20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b  + datalen_final;
27d30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27d40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
27d50 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
27d60 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
27d70 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
27d80 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27d90 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
27da0 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
27db0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27dc0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
27dd0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
27de0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
27df0 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
27e00 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
27e10 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
27e20 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61  lPartLen) {..sta
27e30 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b  tic CK_BYTE buf[
27e40 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74  16384];..ssize_t
27e50 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f   buflen;..CK_SLO
27e60 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b  T_ID slotID;..CK
27e70 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52  _RV retval = CKR
27e80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
27e90 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
27ea0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
27eb0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
27ec0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
27ed0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
27ee0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27ef0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27f00 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
27f10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27f20 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
27f30 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
27f40 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
27f50 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
27f60 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
27f70 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
27f80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27f90 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
27fa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27fb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
27fc0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
27fd0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
27fe0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
27ff0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28000 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74  }...if (pEncrypt
28010 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26  edPart == NULL &
28020 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  & ulEncryptedPar
28030 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  tLen == 0) {.../
28040 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20  * Short circuit 
28050 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20  if we are asked 
28060 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74 68 69  to decrypt nothi
28070 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45  ng... */...CACKE
28080 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28090 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
280a0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
280b0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
280c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
280d0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  K);..}...if (pEn
280e0 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
280f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
28100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28110 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65 64 50  ror. pEncryptedP
28120 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74  art is NULL, but
28130 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
28140 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b  Len is not 0.");
28150 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
28160 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
28170 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72 79 70  }...if (ulEncryp
28180 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  tedPartLen == 0)
28190 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
281a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
281b0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
281c0 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50  Len is 0, but pP
281d0 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  art is not NULL.
281e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
281f0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
28200 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61  ;..}...if (pulPa
28210 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  rtLen == NULL) {
28220 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28230 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
28240 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  ulPartLen is NUL
28250 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
28260 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
28270 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
28280 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28290 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
282a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
282b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
282c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
282d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
282e0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
282f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28300 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28310 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
28320 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28330 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
28340 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28350 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28360 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
28370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28380 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
28390 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
283a0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
283b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
283c0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
283d0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
283e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
283f0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
28400 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
28410 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28420 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
28430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28440 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
28450 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
28460 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
28470 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
28480 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
28490 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
284a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
284b0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
284c0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
284d0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
284e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
284f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
28500 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
28510 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28520 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
28530 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
28540 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
28550 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
28560 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
28570 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28580 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
28590 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
285a0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
285b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
285c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
285d0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
285e0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
285f0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
28600 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
28610 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
28620 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28630 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
28640 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28650 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28660 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
28670 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28680 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61  n].decrypt_mecha
28690 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43  nism) {...case C
286a0 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
286b0 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64  /* Ask card to d
286c0 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66  ecrypt */....buf
286d0 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
286e0 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
286f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
28700 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28710 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
28720 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63  t_identity, pEnc
28730 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e  ryptedPart, ulEn
28740 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
28750 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
28760 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20  , 0, 1);.....if 
28770 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09  (buflen < 0) {..
28780 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e  .../* Decryption
28790 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09   failed. */.....
287a0 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41  if (buflen == CA
287b0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44  CKEY_PCSC_E_NEED
287c0 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65  LOGIN) {......re
287d0 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f  tval = CKR_USER_
287e0 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09  NOT_LOGGED_IN;..
287f0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75  ...} else if (bu
28800 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
28810 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
28820 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  T) {......retval
28830 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45   = CKR_DEVICE_RE
28840 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73  MOVED;.....} els
28850 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  e {......retval 
28860 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
28870 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  ROR;.....}....} 
28880 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67  else if (((unsig
28890 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e  ned long) buflen
288a0 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20  ) > *pulPartLen 
288b0 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09  && pPart) {.....
288c0 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64 61 74  /* Decrypted dat
288d0 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09  a too large */..
288e0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
288f0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
28900 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
28910 09 09 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09  ..if (pPart) {..
28920 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74  ....memcpy(pPart
28930 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
28940 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50  ....}......*pulP
28950 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  artLen = buflen;
28960 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
28970 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
28980 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  break;..}...mute
28990 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
289a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
289b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
289c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
289d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
289e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
289f0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
28a00 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28a10 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28a20 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28a30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28a40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28a50 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
28a60 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
28a70 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
28a80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28a90 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61  V, C_DecryptFina
28aa0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
28ab0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
28ac0 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74  K_BYTE_PTR pLast
28ad0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
28ae0 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  TR pulLastPartLe
28af0 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
28b00 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72  retval;..int ter
28b10 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d  minate_decrypt =
28b20 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   1;...CACKEY_DEB
28b30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28b40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28b50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28b60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28b70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28b80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28b90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28ba0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
28bb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28bc0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
28bd0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
28be0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
28bf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
28c00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28c10 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
28c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28c30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
28c40 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
28c50 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
28c60 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28c70 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28c80 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74  .}...if (pulLast
28c90 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  PartLen == NULL)
28ca0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28cb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28cc0 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20   pulLastPartLen 
28cd0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
28ce0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
28cf0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
28d00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28d10 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
28d20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28d30 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
28d40 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
28d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28d60 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
28d70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28d80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28d90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28da0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28db0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
28dc0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28dd0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28de0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28df0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28e00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28e10 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
28e20 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
28e30 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28e40 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28e50 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
28e60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28e70 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
28e80 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
28e90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28ea0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28eb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28ec0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
28ed0 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
28ee0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
28ef0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
28f00 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28f10 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72  .}...*pulLastPar
28f20 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28  tLen = 0;...if (
28f30 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c  pLastPart == NUL
28f40 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65  L) {...terminate
28f50 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d  _decrypt = 0;..}
28f60 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65  ...if (terminate
28f70 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61  _decrypt) {...ca
28f80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28f90 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
28fa0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
28fb0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
28fc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28fd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28fe0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
28ff0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
29000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
29020 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
29030 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29040 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29050 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29060 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29070 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
29080 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
29090 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
290a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
290b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
290c0 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  estInit)(CK_SESS
290d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
290e0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
290f0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
29100 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
29110 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29120 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29130 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29140 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29150 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29160 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29170 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29180 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29190 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
291a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
291b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
291c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
291d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
291e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
291f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29200 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
29210 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29220 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29230 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29240 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b  RV, C_Digest)(CK
29250 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
29260 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
29270 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
29280 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
29290 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
292a0 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
292b0 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
292c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
292d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
292e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
292f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
29300 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29310 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29320 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
29330 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29340 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
29350 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
29360 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29370 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
29380 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29390 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
293a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
293b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
293c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
293d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
293e0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
293f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
29400 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64 61 74  V, C_DigestUpdat
29410 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
29420 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
29430 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
29440 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
29450 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
29460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29470 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29480 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29490 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
294a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
294b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
294c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
294d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
294e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
294f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29500 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29510 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
29520 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29530 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29540 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29550 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
29560 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29570 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29580 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29590 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
295a0 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
295b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
295c0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
295d0 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
295e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
295f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29600 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
29610 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
29620 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29630 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
29640 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
29650 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
29660 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
29670 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
29680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
29690 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
296a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
296b0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
296c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
296d0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
296e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
296f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
29700 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29710 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
29720 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  stFinal)(CK_SESS
29730 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
29740 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
29750 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
29760 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
29770 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
29780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29790 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
297a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
297b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
297c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
297d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
297e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
297f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29800 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29810 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29820 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29830 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29840 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
29850 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
29860 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29870 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
29880 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29890 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
298a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
298b0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69  CK_RV, C_SignIni
298c0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
298d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
298e0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
298f0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
29900 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
29910 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
29920 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
29930 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
29940 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
29950 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
29960 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
29970 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29980 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29990 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
299a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
299b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
299c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
299d0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
299e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
299f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29a00 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
29a10 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
29a20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
29a30 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
29a40 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
29a50 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
29a60 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
29a70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29a80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
29a90 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
29aa0 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
29ab0 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
29ac0 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
29ad0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
29ae0 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
29af0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
29b00 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
29b10 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
29b20 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
29b30 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
29b40 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
29b50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29b60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
29b70 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
29b80 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29b90 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
29ba0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29bb0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
29bc0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
29bd0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29be0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
29bf0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
29c00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29c10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
29c20 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
29c30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29c40 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
29c50 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
29c60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29c70 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
29c80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29c90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29ca0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
29cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29cc0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
29cd0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
29ce0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
29cf0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
29d00 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
29d10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29d20 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
29d30 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
29d40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29d50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29d60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29d70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
29d80 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72  gn already in pr
29d90 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09  ogress.");......
29da0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
29db0 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
29dc0 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63  ...if (hKey >= c
29dd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29de0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
29df0 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63  ies_count) {...c
29e00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29e10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29e20 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
29e30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29e40 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f  r.  Key handle o
29e50 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71  ut of range (req
29e60 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20  uested key %lu, 
29e70 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74  only %lu identit
29e80 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22  ies available)."
29e90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
29ea0 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65  ) hKey, (unsigne
29eb0 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73  d long) cackey_s
29ec0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29ed0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
29ee0 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
29ef0 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e  KR_KEY_HANDLE_IN
29f00 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
29f10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29f20 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
29f30 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79  ve = 1;...cackey
29f40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29f50 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69  on].sign_mechani
29f60 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d  sm = pMechanism-
29f70 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61  >mechanism;...ca
29f80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29f90 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
29fa0 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b  len = 128;..cack
29fb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29fc0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
29fd0 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  ed = 0;..cackey_
29fe0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29ff0 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61  n].sign_buf = ma
2a000 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63  lloc(sizeof(*cac
2a010 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a020 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
2a030 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   * cackey_sessio
2a040 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2a050 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43  n_buflen);...CAC
2a060 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a070 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 73 69  ("Session %lu si
2a080 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 20 25  gn_identity is %
2a090 70 20 28 69 64 65 6e 74 69 74 79 20 23 25 6c 75  p (identity #%lu
2a0a0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2a0b0 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 28 76  ng) hSession, (v
2a0c0 6f 69 64 20 2a 29 20 26 63 61 63 6b 65 79 5f 73  oid *) &cackey_s
2a0d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a0e0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
2a0f0 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  y], (unsigned lo
2a100 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b  ng) hKey);..cack
2a110 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a120 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
2a130 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ity = &cackey_se
2a140 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a150 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
2a160 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  ];...mutex_retva
2a170 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2a180 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a190 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2a1a0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2a1b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a1c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a1d0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2a1e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a1f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2a200 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2a210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a220 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2a230 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2a240 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2a250 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2a260 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2a270 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f  _Sign)(CK_SESSIO
2a280 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2a290 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a2a0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2a2b0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
2a2c0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
2a2d0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2a2e0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
2a2f0 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
2a300 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
2a310 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e  sed;..CK_RV sign
2a320 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
2a330 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
2a340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a350 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2a360 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2a370 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2a380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a390 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2a3a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2a3b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2a3c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2a3d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2a3e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2a3f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2a400 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2a410 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2a420 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2a430 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a440 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a450 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2a460 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2a470 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2a480 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2a490 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 5f  ID);..}...start_
2a4a0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 63  sign_bufused = c
2a4b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a4c0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2a4d0 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 65  fused;...sign_re
2a4e0 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65  t = C_SignUpdate
2a4f0 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61  (hSession, pData
2a500 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69  , ulDataLen);..i
2a510 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
2a520 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
2a530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a540 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 64 61  Error.  SignUpda
2a550 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  te() returned fa
2a560 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2a570 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2a580 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a  ng) sign_ret);..
2a590 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
2a5a0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2a5b0 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d 75 74  _SMALL) {....mut
2a5c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2a5d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2a5e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2a5f0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2a600 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
2a610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a620 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2a630 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2a640 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a650 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a660 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
2a670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a680 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2a690 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2a6a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2a6b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2a6c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a6d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a6e0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2a6f0 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2a700 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2a710 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  DLE_INVALID);...
2a720 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
2a730 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a740 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
2a750 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
2a760 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2a770 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2a780 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a790 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a7a0 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
2a7b0 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
2a7c0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2a7d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a7e0 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
2a7f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a800 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
2a810 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f   = 0;.....mutex_
2a820 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2a830 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2a840 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
2a850 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2a860 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
2a870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a880 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2a890 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2a8a0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a8b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2a8c0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
2a8d0 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
2a8e0 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f  ...sign_ret = C_
2a8f0 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69  SignFinal(hSessi
2a900 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20  on, pSignature, 
2a910 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
2a920 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
2a930 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69  != CKR_OK) {...i
2a940 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43  f (sign_ret == C
2a950 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2a960 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ALL) {....CACKEY
2a970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
2a980 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72  ignFinal() retur
2a990 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ned CKR_BUFFER_T
2a9a0 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25  OO_SMALL (rv = %
2a9b0 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53  lu), undoing C_S
2a9c0 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28 75  ignUpdate()", (u
2a9d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2a9e0 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 63  gn_ret);.....cac
2a9f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2aa00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2aa10 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e  sed = start_sign
2aa20 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72 65  _bufused;.....re
2aa30 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
2aa40 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
2aa50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2aa60 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20  r.  SignFinal() 
2aa70 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
2aa80 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
2aa90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
2aaa0 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ign_ret);....ret
2aab0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
2aac0 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61 74 75  }...if (pSignatu
2aad0 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  re == NULL) {...
2aae0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2aaf0 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72 65 20  NTF("pSignature 
2ab00 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
2ab10 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67  L, undoing C_Sig
2ab20 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a 09 09  nUpdate()");....
2ab30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ab40 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2ab50 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73  ufused = start_s
2ab60 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09  ign_bufused;....
2ab70 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
2ab80 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2ab90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2aba0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2abb0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2abc0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2abd0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2abe0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2abf0 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  gnUpdate)(CK_SES
2ac00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ac10 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2ac20 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2ac30 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
2ac40 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2ac50 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2ac60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2ac70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2ac80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2ac90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2aca0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2acb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2acc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2acd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2ace0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2acf0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
2ad00 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
2ad10 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2ad20 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
2ad30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2ad40 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
2ad50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ad60 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2ad70 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
2ad80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2ad90 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2ada0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2adb0 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20  ...if (pPart == 
2adc0 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65  NULL && ulPartLe
2add0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
2ade0 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
2adf0 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
2ae00 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20  sign nothing... 
2ae10 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
2ae20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2ae30 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
2ae40 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
2ae50 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
2ae60 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
2ae70 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20  ...if (pPart == 
2ae80 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2ae90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2aea0 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e  rror. pPart is N
2aeb0 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c  ULL, but ulPartL
2aec0 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a  en is not 0.");.
2aed0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2aee0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2aef0 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e  ...if (ulPartLen
2af00 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2af10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2af20 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e  Error. ulPartLen
2af30 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
2af40 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
2af50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2af60 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2af70 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2af80 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2af90 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2afa0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2afb0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2afc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2afd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2afe0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2aff0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b000 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2b010 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2b020 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b030 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2b040 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2b050 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b060 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2b070 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b080 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2b090 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2b0a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2b0b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2b0c0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
2b0d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b0e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2b0f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2b100 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b110 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2b120 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b130 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2b140 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ign not active."
2b150 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2b160 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2b170 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2b180 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
2b190 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b1a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61  sion].sign_mecha
2b1b0 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43  nism) {...case C
2b1c0 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
2b1d0 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69  /* Accumulate di
2b1e0 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20  rectly */....if 
2b1f0 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ((cackey_session
2b200 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b210 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72  _bufused + ulPar
2b220 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73  tLen) > cackey_s
2b230 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b240 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b  ].sign_buflen) {
2b250 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2b260 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b270 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b  ign_buflen *= 2;
2b280 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ......cackey_ses
2b290 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b2a0 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c  sign_buf = reall
2b2b0 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  oc(cackey_sessio
2b2c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2b2d0 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63  n_buf, sizeof(*c
2b2e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b2f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b300 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73  f) * cackey_sess
2b310 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b320 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09  ign_buflen);....
2b330 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  }.....memcpy(cac
2b340 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b350 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
2b360 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  + cackey_session
2b370 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b380 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c  _bufused, pPart,
2b390 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09   ulPartLen);....
2b3a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2b3b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2b3c0 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72  bufused += ulPar
2b3d0 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  tLen;.....break;
2b3e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2b3f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2b400 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b410 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2b420 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2b430 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b440 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b450 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2b460 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2b470 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2b480 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2b490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b4a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2b4b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2b4c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2b4d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2b4e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2b4f0 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f  C_SignFinal)(CK_
2b500 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b510 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2b520 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2b530 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2b540 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
2b550 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
2b560 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09   sigbuf[1024];..
2b570 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65  ssize_t sigbufle
2b580 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  n;..CK_SLOT_ID s
2b590 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65  lotID;..CK_RV re
2b5a0 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
2b5b0 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74  AL_ERROR;..int t
2b5c0 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
2b5d0 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
2b5e0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
2b5f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2b600 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2b610 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2b620 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2b630 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b640 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2b650 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2b660 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2b670 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2b680 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67  ..}...if (pulSig
2b690 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c  natureLen == NUL
2b6a0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2b6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b6c0 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  r. pulSignatureL
2b6d0 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
2b6e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2b6f0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2b700 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
2b710 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
2b720 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2b730 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
2b740 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2b750 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
2b760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b770 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2b780 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
2b790 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2b7a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2b7b0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2b7c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2b7d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2b7e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b7f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2b800 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2b810 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b820 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2b830 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2b840 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2b850 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2b860 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2b870 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b880 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2b890 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2b8a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2b8b0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2b8c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b8d0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2b8e0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2b8f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2b900 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2b910 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2b920 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b930 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2b940 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2b950 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2b960 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2b970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b980 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
2b990 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
2b9a0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2b9b0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2b9c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2b9d0 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
2b9e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b9f0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
2ba00 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
2ba10 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
2ba20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2ba30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2ba40 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
2ba50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ba60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
2ba70 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
2ba80 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
2ba90 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
2baa0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
2bab0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2bac0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2bad0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
2bae0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
2baf0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2bb00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bb10 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2bb20 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2bb30 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
2bb40 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
2bb50 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
2bb60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2bb70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2bb80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2bb90 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2bba0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
2bbb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bbc0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
2bbd0 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20  anism) {...case 
2bbe0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
2bbf0 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20  ./* Ask card to 
2bc00 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45  sign */....CACKE
2bc10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bc20 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20 66  Asking to sign f
2bc30 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20  rom identity %p 
2bc40 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c  in session %lu",
2bc50 20 28 76 6f 69 64 20 2a 29 20 63 61 63 6b 65 79   (void *) cackey
2bc60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2bc70 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
2bc80 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
2bc90 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09  g) hSession);...
2bca0 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63  .sigbuflen = cac
2bcb0 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
2bcc0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
2bcd0 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
2bce0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2bcf0 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20  .sign_identity, 
2bd00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bd10 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2bd20 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uf, cackey_sessi
2bd30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2bd40 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62  gn_bufused, sigb
2bd50 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75  uf, sizeof(sigbu
2bd60 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09 09 69  f), 1, 0);.....i
2bd70 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30  f (sigbuflen < 0
2bd80 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69  ) {...../* Signi
2bd90 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  ng failed. */...
2bda0 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
2bdb0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2bdc0 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
2bdd0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2bde0 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
2bdf0 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
2be00 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
2be10 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
2be20 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
2be30 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44  ..retval = CKR_D
2be40 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09  EVICE_REMOVED;..
2be50 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
2be60 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45  .retval = CKR_GE
2be70 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
2be80 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  .}....} else if 
2be90 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
2bea0 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a  ) sigbuflen) > *
2beb0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2bec0 26 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b  && pSignature) {
2bed0 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64  ...../* Signed d
2bee0 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  ata too large */
2bef0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2bf00 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c  G_PRINTF("retval
2bf10 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
2bf20 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66  O_SMALL;  sigbuf
2bf30 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69  len = %lu, pulSi
2bf40 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75  gnatureLen = %lu
2bf50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2bf60 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75  g) sigbuflen, (u
2bf70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70  nsigned long) *p
2bf80 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b  ulSignatureLen);
2bf90 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2bfa0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2bfb0 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e  ALL;......termin
2bfc0 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09  ate_sign = 0;...
2bfd0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65  .} else {.....te
2bfe0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
2bff0 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e  ;......if (pSign
2c000 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65  ature) {......me
2c010 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c  mcpy(pSignature,
2c020 20 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c   sigbuf, sigbufl
2c030 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69  en);.......termi
2c040 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
2c050 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69  ...}......*pulSi
2c060 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67  gnatureLen = sig
2c070 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
2c080 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
2c090 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
2c0a0 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65  ...if (terminate
2c0b0 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63  _sign) {...if (c
2c0c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c0d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2c0e0 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  f) {....free(cac
2c0f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c100 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
2c110 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
2c120 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c130 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
2c140 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
2c150 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2c160 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2c170 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2c180 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2c190 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2c1a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c1b0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2c1c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2c1d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2c1e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2c1f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c200 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
2c210 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
2c220 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
2c230 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2c240 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2c250 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
2c260 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2c270 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2c280 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2c290 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2c2a0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2c2b0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2c2c0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2c2d0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2c2e0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2c2f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c300 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c310 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2c320 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2c330 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2c340 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2c350 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2c360 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2c370 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2c380 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2c390 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2c3a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c3b0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2c3c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c3d0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2c3e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2c3f0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
2c400 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
2c410 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2c420 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2c430 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
2c440 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
2c450 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
2c460 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
2c470 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
2c480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c490 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c4a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c4b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c4c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c4d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c4e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c4f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c500 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c510 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2c520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c530 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c540 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c550 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2c560 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c570 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2c580 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c590 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c5a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c5b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c5c0 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f  _VerifyInit)(CK_
2c5d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2c5e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2c5f0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2c600 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2c610 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2c620 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c630 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c640 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c650 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c670 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c680 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c690 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c6a0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c6b0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2c6c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c6d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c6e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c6f0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2c700 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c710 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2c720 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c730 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c740 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c750 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c760 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53  _Verify)(CK_SESS
2c770 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2c780 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2c790 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2c7a0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2c7b0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2c7c0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
2c7d0 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
2c7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c7f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c800 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c810 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c830 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c840 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c850 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c860 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c870 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2c880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c890 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c8a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c8b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2c8c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c8d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2c8e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c8f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c900 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c910 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c920 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  _VerifyUpdate)(C
2c930 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2c940 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2c950 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2c960 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2c970 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2c980 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2c990 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2c9a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2c9b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c9c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c9d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2c9e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c9f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ca00 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2ca10 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ca20 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ca30 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ca40 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ca50 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ca60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ca70 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ca80 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ca90 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2caa0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2cab0 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61  RV, C_VerifyFina
2cac0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
2cad0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2cae0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2caf0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
2cb00 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
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 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
2cc70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2cc80 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2cc90 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2cca0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2ccb0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
2ccc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2ccd0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2cce0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2ccf0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2cd00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2cd10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2cd20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2cd30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2cd40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2cd50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2cd60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2cd70 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2cd80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2cd90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2cda0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2cdb0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2cdc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2cdd0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2cde0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2cdf0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2ce00 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  yRecover)(CK_SES
2ce10 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ce20 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2ce30 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2ce40 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
2ce50 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  reLen, CK_BYTE_P
2ce60 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2ce70 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65  NG_PTR pulDataLe
2ce80 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2ce90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2cea0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2ceb0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2cec0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ced0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2cee0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2cef0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2cf00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2cf10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2cf20 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2cf30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2cf40 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2cf50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2cf60 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2cf70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2cf80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2cf90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2cfa0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2cfb0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2cfc0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63  _RV, C_DigestEnc
2cfd0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
2cfe0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2cff0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2d000 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2d010 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
2d020 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
2d030 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
2d040 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
2d050 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
2d060 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d070 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2d080 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2d090 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2d0a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d0b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2d0c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2d0d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2d0e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2d0f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2d100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d110 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d120 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d130 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2d140 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d150 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2d160 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2d170 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d180 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2d190 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2d1a0 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
2d1b0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2d1c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d1d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
2d1e0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
2d1f0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
2d200 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
2d210 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2d220 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
2d230 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2d240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d250 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d260 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d270 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d290 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d2a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d2b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d2c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d2d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d2e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d2f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2d300 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d310 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2d320 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d330 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d340 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d350 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d360 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d370 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45  N(CK_RV, C_SignE
2d380 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
2d390 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2d3a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2d3b0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2d3c0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
2d3d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2d3e0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2d3f0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
2d400 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
2d410 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d420 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d430 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d440 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d470 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d480 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d490 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d4a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d4b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d4c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d4d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d4e0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2d4f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d500 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2d510 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2d520 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d530 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2d540 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2d550 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
2d560 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2d570 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2d580 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2d590 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2d5a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
2d5b0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
2d5c0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
2d5d0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2d5e0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2d5f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d600 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d610 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d620 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d640 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d650 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d660 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d670 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d680 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d690 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d6a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d6b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d6c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d6d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d6e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d6f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d700 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d710 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d720 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
2d730 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53  erateKey)(CK_SES
2d740 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2d750 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2d760 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2d770 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
2d780 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
2d790 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
2d7a0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2d7b0 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
2d7c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d7d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2d7e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2d7f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2d800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d810 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2d820 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2d830 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2d840 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2d850 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2d860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d870 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d880 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d890 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2d8a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d8b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2d8c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2d8d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d8e0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2d8f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2d900 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
2d910 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d920 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d930 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2d940 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
2d950 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62  TRIBUTE_PTR pPub
2d960 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  licKeyTemplate, 
2d970 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69  CK_ULONG ulPubli
2d980 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  cKeyAttributeCou
2d990 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  nt, CK_ATTRIBUTE
2d9a0 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79  _PTR pPrivateKey
2d9b0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
2d9c0 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41  NG ulPrivateKeyA
2d9d0 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
2d9e0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
2d9f0 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c  PTR phPublicKey,
2da00 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2da10 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b  E_PTR phPrivateK
2da20 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2da30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2da40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2da50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2da60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2da70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2da80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2da90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2daa0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2dab0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2dac0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2dad0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2dae0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2daf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2db00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2db10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2db20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2db30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2db40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2db50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2db60 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29  K_RV, C_WrapKey)
2db70 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2db80 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2db90 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2dba0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2dbb0 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70  ECT_HANDLE hWrap
2dbc0 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  pingKey, CK_OBJE
2dbd0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20  CT_HANDLE hKey, 
2dbe0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
2dbf0 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
2dc00 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64  G_PTR pulWrapped
2dc10 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  KeyLen) {..CACKE
2dc20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dc30 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2dc40 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2dc50 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2dc60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dc70 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2dc80 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2dc90 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2dca0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2dcb0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2dcc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2dcd0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2dce0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2dcf0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2dd00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2dd10 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2dd20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2dd30 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2dd40 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2dd50 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72  ON(CK_RV, C_Unwr
2dd60 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
2dd70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2dd80 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2dd90 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2dda0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2ddb0 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c   hUnwrappingKey,
2ddc0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72   CK_BYTE_PTR pWr
2ddd0 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f  appedKey, CK_ULO
2dde0 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  NG ulWrappedKeyL
2ddf0 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  en, CK_ATTRIBUTE
2de00 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
2de10 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
2de20 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
2de30 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2de40 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
2de50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2de60 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2de70 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2de80 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2de90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2dea0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2deb0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2dec0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2ded0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2dee0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2def0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2df00 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2df10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2df20 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2df30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2df40 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2df50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2df60 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2df70 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2df80 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76  N(CK_RV, C_Deriv
2df90 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
2dfa0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2dfb0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2dfc0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2dfd0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2dfe0 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54  hBaseKey, CK_ATT
2dff0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
2e000 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2e010 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
2e020 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2e030 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
2e040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e050 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e060 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e070 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e090 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e0a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e0b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e0c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e0d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2e0e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e0f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2e100 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e110 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2e120 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e130 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2e140 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2e150 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e160 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e170 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e180 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f  _SeedRandom)(CK_
2e190 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e1a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2e1b0 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55  _PTR pSeed, CK_U
2e1c0 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20  LONG ulSeedLen) 
2e1d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2e1e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2e1f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2e200 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2e210 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e220 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2e230 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2e240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e250 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2e260 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2e270 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e280 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2e290 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e2a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2e2b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2e2c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2e2d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2e2e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e2f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2e300 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2e310 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  , C_GenerateRand
2e320 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
2e330 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2e340 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e  CK_BYTE_PTR pRan
2e350 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  domData, CK_ULON
2e360 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b  G ulRandomLen) {
2e370 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e380 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e390 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2e3a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e3b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e3c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e3d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e3e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e3f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e400 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e410 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e420 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e430 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e440 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2e450 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e460 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2e470 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2e480 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e490 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63  D);.}../* Deprec
2e4a0 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
2e4b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e4c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
2e4d0 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28  FunctionStatus)(
2e4e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2e4f0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
2e500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e510 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e530 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2e540 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e550 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
2e560 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e570 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
2e580 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2e590 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
2e5a0 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
2e5b0 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
2e5c0 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
2e5d0 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
2e5e0 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20  ../* Deprecated 
2e5f0 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44  Function */.CK_D
2e600 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2e610 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75  K_RV, C_CancelFu
2e620 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  nction)(CK_SESSI
2e630 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e640 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
2e650 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2e660 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
2e670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2e680 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2e690 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2e6a0 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
2e6b0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
2e6c0 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
2e6d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
2e6e0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
2e6f0 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
2e700 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
2e710 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
2e720 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
2e730 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e740 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
2e750 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49  nList)(CK_FUNCTI
2e760 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20  ON_LIST_PTR_PTR 
2e770 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20  ppFunctionList) 
2e780 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c  {..CK_FUNCTION_L
2e790 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f  IST_PTR pFunctio
2e7a0 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  nList;...CACKEY_
2e7b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2e7c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
2e7d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d  pFunctionList ==
2e7e0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2e7f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e800 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f  Error. ppFunctio
2e810 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29  nList is NULL.")
2e820 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e830 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2e840 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  .}...pFunctionLi
2e850 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  st = malloc(size
2e860 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73  of(*pFunctionLis
2e870 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  t));...pFunction
2e880 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61  List->version.ma
2e890 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
2e8a0 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
2e8b0 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
2e8c0 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  xff;..pFunctionL
2e8d0 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e  ist->version.min
2e8e0 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
2e8f0 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
2e900 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
2e910 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  f;...pFunctionLi
2e920 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65  st->C_Initialize
2e930 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b   = C_Initialize;
2e940 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2e950 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f  >C_Finalize = C_
2e960 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  Finalize;..pFunc
2e970 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49  tionList->C_GetI
2e980 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b  nfo = C_GetInfo;
2e990 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2e9a0 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d  >C_GetSlotList =
2e9b0 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a   C_GetSlotList;.
2e9c0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2e9d0 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20  C_GetSlotInfo = 
2e9e0 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09  C_GetSlotInfo;..
2e9f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ea00 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20  _GetTokenInfo = 
2ea10 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a  C_GetTokenInfo;.
2ea20 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ea30 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
2ea40 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c  nt = C_WaitForSl
2ea50 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74  otEvent;..pFunct
2ea60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
2ea70 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f  chanismList = C_
2ea80 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
2ea90 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2eaa0 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
2eab0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68  Info = C_GetMech
2eac0 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e  anismInfo;..pFun
2ead0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
2eae0 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54  tToken = C_InitT
2eaf0 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  oken;..pFunction
2eb00 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20  List->C_InitPIN 
2eb10 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46  = C_InitPIN;..pF
2eb20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2eb30 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e  etPIN = C_SetPIN
2eb40 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2eb50 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20  ->C_OpenSession 
2eb60 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b  = C_OpenSession;
2eb70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2eb80 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20  >C_CloseSession 
2eb90 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  = C_CloseSession
2eba0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2ebb0 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73  ->C_CloseAllSess
2ebc0 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c  ions = C_CloseAl
2ebd0 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e  lSessions;..pFun
2ebe0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2ebf0 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f  SessionInfo = C_
2ec00 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a  GetSessionInfo;.
2ec10 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ec20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
2ec30 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61  ate = C_GetOpera
2ec40 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
2ec50 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
2ec60 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d  OperationState =
2ec70 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_SetOperationS
2ec80 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tate;..pFunction
2ec90 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20  List->C_Login = 
2eca0 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74  C_Login;..pFunct
2ecb0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75  ionList->C_Logou
2ecc0 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70  t = C_Logout;..p
2ecd0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2ece0 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43  CreateObject = C
2ecf0 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09  _CreateObject;..
2ed00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ed10 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f  _CopyObject = C_
2ed20 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75  CopyObject;..pFu
2ed30 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2ed40 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f  stroyObject = C_
2ed50 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09  DestroyObject;..
2ed60 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ed70 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d  _GetObjectSize =
2ed80 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65   C_GetObjectSize
2ed90 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2eda0 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  ->C_GetAttribute
2edb0 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74  Value = C_GetAtt
2edc0 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
2edd0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2ede0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
2edf0 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74   = C_SetAttribut
2ee00 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69  eValue;..pFuncti
2ee10 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
2ee20 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69  jectsInit = C_Fi
2ee30 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09  ndObjectsInit;..
2ee40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ee50 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43  _FindObjects = C
2ee60 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70  _FindObjects;..p
2ee70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2ee80 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
2ee90 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
2eea0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
2eeb0 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
2eec0 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  Init = C_Encrypt
2eed0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2eee0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20  List->C_Encrypt 
2eef0 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46  = C_Encrypt;..pF
2ef00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
2ef10 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
2ef20 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  _EncryptUpdate;.
2ef30 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ef40 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d  C_EncryptFinal =
2ef50 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b   C_EncryptFinal;
2ef60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2ef70 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d  >C_DecryptInit =
2ef80 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a   C_DecryptInit;.
2ef90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2efa0 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65  C_Decrypt = C_De
2efb0 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f  crypt;..pFunctio
2efc0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
2efd0 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
2efe0 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
2eff0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
2f000 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63  yptFinal = C_Dec
2f010 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ryptFinal;..pFun
2f020 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
2f030 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65  estInit = C_Dige
2f040 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  stInit;..pFuncti
2f050 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
2f060 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46   = C_Digest;..pF
2f070 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2f080 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
2f090 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70  DigestUpdate;..p
2f0a0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f0b0 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69  DigestKey = C_Di
2f0c0 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74  gestKey;..pFunct
2f0d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
2f0e0 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73  tFinal = C_Diges
2f0f0 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
2f100 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e  onList->C_SignIn
2f110 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b  it = C_SignInit;
2f120 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f130 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e  >C_Sign = C_Sign
2f140 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f150 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d  ->C_SignUpdate =
2f160 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09   C_SignUpdate;..
2f170 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f180 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53  _SignFinal = C_S
2f190 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  ignFinal;..pFunc
2f1a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2f1b0 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f  RecoverInit = C_
2f1c0 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b  SignRecoverInit;
2f1d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f1e0 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d  >C_SignRecover =
2f1f0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a   C_SignRecover;.
2f200 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f210 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43  C_VerifyInit = C
2f220 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46  _VerifyInit;..pF
2f230 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
2f240 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79  erify = C_Verify
2f250 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f260 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  ->C_VerifyUpdate
2f270 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 74   = C_VerifyUpdat
2f280 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2f290 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c  t->C_VerifyFinal
2f2a0 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c   = C_VerifyFinal
2f2b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f2c0 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
2f2d0 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  rInit = C_Verify
2f2e0 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46  RecoverInit;..pF
2f2f0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
2f300 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43  erifyRecover = C
2f310 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a  _VerifyRecover;.
2f320 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f330 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55  C_DigestEncryptU
2f340 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74  pdate = C_Digest
2f350 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
2f360 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f370 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
2f380 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
2f390 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70  DigestUpdate;..p
2f3a0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f3b0 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
2f3c0 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70  e = C_SignEncryp
2f3d0 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
2f3e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2f3f0 70 74 56 65 72 69 66 79 55 70 64 61 74 65 20 3d  ptVerifyUpdate =
2f400 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
2f410 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2f420 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
2f430 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61  teKey = C_Genera
2f440 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  teKey;..pFunctio
2f450 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
2f460 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e  eKeyPair = C_Gen
2f470 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70  erateKeyPair;..p
2f480 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f490 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70  WrapKey = C_Wrap
2f4a0 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
2f4b0 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79  ist->C_UnwrapKey
2f4c0 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a   = C_UnwrapKey;.
2f4d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f4e0 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f  C_DeriveKey = C_
2f4f0 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e  DeriveKey;..pFun
2f500 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65  ctionList->C_See
2f510 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64  dRandom = C_Seed
2f520 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69  Random;..pFuncti
2f530 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
2f540 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e  teRandom = C_Gen
2f550 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46  erateRandom;..pF
2f560 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2f570 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
2f580 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
2f590 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69  Status;..pFuncti
2f5a0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c  onList->C_Cancel
2f5b0 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e  Function = C_Can
2f5c0 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46  celFunction;..pF
2f5d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2f5e0 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  etFunctionList =
2f5f0 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69   C_GetFunctionLi
2f600 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f  st;...*ppFunctio
2f610 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f  nList = pFunctio
2f620 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  nList;...CACKEY_
2f630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2f640 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2f650 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2f660 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2f670 0a 7d 0a 0a                                      .}..