Hex Artifact Content

Artifact 3db9c71bd582f1de927c38de753a5daef74cf47a:


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 4b 49 20   0x58../*** PKI 
11c0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46  Information - EF
11d0: 20 37 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69   7000 ***/.#defi
11e0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
11f0: 54 49 46 49 43 41 54 45 20 20 20 20 20 20 20 20  TIFICATE        
1200: 20 30 78 37 30 0a 23 64 65 66 69 6e 65 20 47 53   0x70.#define GS
1210: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
1220: 55 45 5f 44 41 54 45 20 20 20 20 20 30 78 37 31  UE_DATE     0x71
1230: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1240: 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44  AG_CERT_EXPIRE_D
1250: 41 54 45 20 20 20 20 30 78 37 32 0a 0a 2f 2a 2a  ATE    0x72../**
1260: 20 41 70 70 6c 65 74 20 49 44 73 20 2a 2a 2f 0a   Applet IDs **/.
1270: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 41 49  #define GSCIS_AI
1280: 44 5f 43 43 43 20 20 20 20 20 20 20 20 20 20 20  D_CCC           
1290: 20 20 20 20 20 20 30 78 41 30 2c 20 30 78 30 30        0xA0, 0x00
12a0: 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78  , 0x00, 0x01, 0x
12b0: 31 36 2c 20 30 78 44 42 2c 20 30 78 30 30 0a 0a  16, 0xDB, 0x00..
12c0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  /* Maximum size 
12d0: 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e 20  of data portion 
12e0: 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20  of APDUs */./** 
12f0: 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73 20  Do not set this 
1300: 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23 64  above 250 **/.#d
1310: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50 44  efine CACKEY_APD
1320: 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20 20  U_MTU           
1330: 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52 20      250../* ATR 
1340: 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  If not available
1350: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f   */.#ifndef MAX_
1360: 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e 65  ATR_SIZE.#define
1370: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31 30   MAX_ATR_SIZE 10
1380: 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  24.#endif..#ifde
1390: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a 23  f CACKEY_DEBUG.#
13a0: 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49 4d    ifdef HAVE_TIM
13b0: 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  E_H.#    include
13c0: 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69 63   <time.h>.static
13d0: 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f 64   time_t cackey_d
13e0: 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20  ebug_start_time 
13f0: 3d 20 30 3b 0a 23 20 20 20 20 64 65 66 69 6e 65  = 0;.#    define
1400: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1410: 49 4e 54 54 49 4d 45 20 7b 20 69 66 20 28 63 61  INTTIME { if (ca
1420: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
1430: 5f 74 69 6d 65 20 3d 3d 20 30 29 20 7b 20 63 61  _time == 0) { ca
1440: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
1450: 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  _time = time(NUL
1460: 4c 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 63  L); }; fprintf(c
1470: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1480: 2c 20 22 5b 25 6c 75 5d 3a 20 22 2c 20 28 75 6e  , "[%lu]: ", (un
1490: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 74 69  signed long) (ti
14a0: 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63 6b 65  me(NULL) - cacke
14b0: 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69  y_debug_start_ti
14c0: 6d 65 29 29 3b 20 7d 0a 23 20 20 65 6c 73 65 0a  me)); }.#  else.
14d0: 23 20 20 20 20 64 65 66 69 6e 65 20 43 41 43 4b  #    define CACK
14e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49  EY_DEBUG_PRINTTI
14f0: 4d 45 20 2f 2a 2a 2f 0a 23 20 20 65 6e 64 69 66  ME /**/.#  endif
1500: 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  ..#  define CACK
1510: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1520: 78 2e 2e 2e 29 20 7b 20 43 41 43 4b 45 59 5f 44  x...) { CACKEY_D
1530: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20  EBUG_PRINTTIME; 
1540: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1550: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1560: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f  :%i: ", __func__
1570: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 66 70 72  , __LINE__); fpr
1580: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
1590: 67 5f 66 64 28 29 2c 20 78 29 3b 20 66 70 72 69  g_fd(), x); fpri
15a0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
15b0: 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 20 66 66  _fd(), "\n"); ff
15c0: 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75  lush(cackey_debu
15d0: 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20 64 65  g_fd()); }.#  de
15e0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
15f0: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
1600: 20 79 29 20 7b 20 75 6e 73 69 67 6e 65 64 20 63   y) { unsigned c
1610: 68 61 72 20 2a 54 4d 50 42 55 46 3b 20 75 6e 73  har *TMPBUF; uns
1620: 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20  igned long idx; 
1630: 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67 6e  TMPBUF = (unsign
1640: 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b 20  ed char *) (x); 
1650: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1660: 4e 54 54 49 4d 45 3b 20 66 70 72 69 6e 74 66 28  NTTIME; fprintf(
1670: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1680: 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 25 73 20  ), "%s():%i: %s 
1690: 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78   (%s/%lu = {%02x
16a0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
16b0: 49 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75  INE__, f, #x, (u
16c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79  nsigned long) (y
16d0: 29 2c 20 54 4d 50 42 55 46 5b 30 5d 29 3b 20 66  ), TMPBUF[0]); f
16e0: 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
16f0: 20 3c 20 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b   < (y); idx++) {
1700: 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f   fprintf(cackey_
1710: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 2c 20 25  debug_fd(), ", %
1720: 30 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78  02x", TMPBUF[idx
1730: 5d 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 63  ]); }; fprintf(c
1740: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1750: 2c 20 22 7d 29 5c 6e 22 29 3b 20 66 66 6c 75 73  , "})\n"); fflus
1760: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
1770: 64 28 29 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e  d()); }.#  defin
1780: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
1790: 45 52 52 4f 52 28 78 29 20 7b 20 66 70 72 69 6e  ERROR(x) { fprin
17a0: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
17b0: 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20  fd(), "%s():%i: 
17c0: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
17d0: 49 4e 45 5f 5f 29 3b 20 43 41 43 4b 45 59 5f 44  INE__); CACKEY_D
17e0: 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20  EBUG_PRINTTIME; 
17f0: 70 65 72 72 6f 72 28 78 29 3b 20 66 66 6c 75 73  perror(x); fflus
1800: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
1810: 64 28 29 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e  d()); }.#  defin
1820: 65 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b  e free(x) { CACK
1830: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1840: 22 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c  "FREE(%p) (%s)",
1850: 20 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29   (void *) x, #x)
1860: 3b 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74  ; free(x); }..st
1870: 61 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65  atic FILE *cacke
1880: 79 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29  y_debug_fd(void)
1890: 20 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20   {..static FILE 
18a0: 2a 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61  *fd = NULL;..cha
18b0: 72 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66  r *logfile;...if
18c0: 20 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a   (fd != NULL) {.
18d0: 09 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d  ..return(fd);..}
18e0: 0a 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f  .../*.. * Log to
18f0: 20 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c   stderr initiall
1900: 79 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20  y so we can use 
1910: 64 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e  debugging within
1920: 0a 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69  .. * this functi
1930: 6f 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69  on without getti
1940: 6e 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e  ng into an infin
1950: 69 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66  ite loop.. */..f
1960: 64 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f  d = stderr;...lo
1970: 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22  gfile = getenv("
1980: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1990: 46 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67  FILE");..if (log
19a0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
19b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19c0: 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76  RINTF("Found env
19d0: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
19e0: 65 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29  e: %s", logfile)
19f0: 3b 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73  ;....logfile = s
1a00: 74 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27  trchr(logfile, '
1a10: 3d 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69  =');...if (logfi
1a20: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
1a30: 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e  .logfile = geten
1a40: 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  v("CACKEY_DEBUG_
1a50: 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65  LOGFILE");...} e
1a60: 6c 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65  lse {....logfile
1a70: 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  ++;...}..}...if 
1a80: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1a90: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1aa0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1ab0: 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20   log file: %s", 
1ac0: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20  logfile);....fd 
1ad0: 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c  = fopen(logfile,
1ae0: 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28   "a");..}...if (
1af0: 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
1b00: 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a  fd = stderr;..}.
1b10: 0a 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65  ..if (fd == stde
1b20: 72 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  rr) {...CACKEY_D
1b30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1b40: 75 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b  urning stderr");
1b50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
1b60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b70: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c  ("Returning %p",
1b80: 20 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09   (void *) fd);..
1b90: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
1ba0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
1bb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
1bc0: 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20  C_MALLOC(size_t 
1bd0: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
1be0: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
1bf0: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
1c00: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
1c10: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 43 41  lloc(size);...CA
1c20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c30: 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74 66 28 63  TIME;..fprintf(c
1c40: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1c50: 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66  , "%s():%i: ", f
1c60: 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72  unc, line);..fpr
1c70: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
1c80: 67 5f 66 64 28 29 2c 20 22 4d 41 4c 4c 4f 43 28  g_fd(), "MALLOC(
1c90: 29 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29  ) = %p", retval)
1ca0: 3b 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65  ;..fprintf(cacke
1cb0: 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c  y_debug_fd(), "\
1cc0: 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63  n");..fflush(cac
1cd0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b  key_debug_fd());
1ce0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
1cf0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1d00: 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  d *CACKEY_DEBUG_
1d10: 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69  FUNC_REALLOC(voi
1d20: 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 73  d *ptr, size_t s
1d30: 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ize, const char 
1d40: 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29  *func, int line)
1d50: 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c   {..void *retval
1d60: 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
1d70: 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b  lloc(ptr, size);
1d80: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d  ...if (retval !=
1d90: 20 70 74 72 29 20 7b 0a 09 09 43 41 43 4b 45 59   ptr) {...CACKEY
1da0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49 4d 45  _DEBUG_PRINTTIME
1db0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 63 61 63 6b  ;...fprintf(cack
1dc0: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1dd0: 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e 63  %s():%i: ", func
1de0: 2c 20 6c 69 6e 65 29 3b 0a 09 09 66 70 72 69 6e  , line);...fprin
1df0: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
1e00: 66 64 28 29 2c 20 22 52 45 41 4c 4c 4f 43 28 25  fd(), "REALLOC(%
1e10: 70 29 20 3d 20 25 70 22 2c 20 70 74 72 2c 20 72  p) = %p", ptr, r
1e20: 65 74 76 61 6c 29 3b 0a 09 09 66 70 72 69 6e 74  etval);...fprint
1e30: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
1e40: 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09 09 66 66  d(), "\n");...ff
1e50: 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75  lush(cackey_debu
1e60: 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a 09 69 66  g_fd());..}...if
1e70: 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c   (retval == NULL
1e80: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e90: 55 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a 2a 20  UG_PRINTF(" *** 
1ea0: 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f  ERROR *** reallo
1eb0: 63 20 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20  c returned NULL 
1ec0: 28 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c 20 28  (size = %lu)", (
1ed0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
1ee0: 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ize);..}...retur
1ef0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
1f00: 61 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45  atic char *CACKE
1f10: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52  Y_DEBUG_FUNC_STR
1f20: 44 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  DUP(const char *
1f30: 70 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ptr, const char 
1f40: 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29  *func, int line)
1f50: 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c   {..char *retval
1f60: 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72  ;...retval = str
1f70: 64 75 70 28 70 74 72 29 3b 0a 0a 09 43 41 43 4b  dup(ptr);...CACK
1f80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54 49  EY_DEBUG_PRINTTI
1f90: 4d 45 3b 0a 09 66 70 72 69 6e 74 66 28 63 61 63  ME;..fprintf(cac
1fa0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
1fb0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75 6e  "%s():%i: ", fun
1fc0: 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69 6e  c, line);..fprin
1fd0: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
1fe0: 66 64 28 29 2c 20 22 53 54 52 44 55 50 5f 4d 41  fd(), "STRDUP_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 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
2070: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2080: 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67  TAG_TO_STR(unsig
2090: 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a  ned char tag) {.
20a0: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
20b0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
20c0: 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75  _CARDID:....retu
20d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
20e0: 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  RDID");...case G
20f0: 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52  SCIS_TAG_CCC_VER
2100: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2110: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29  IS_TAG_CCC_VER")
2120: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2130: 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72  AG_CCG_VER:....r
2140: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2150: 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61  _CCG_VER");...ca
2160: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2170: 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  DURL:....return(
2180: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55  "GSCIS_TAG_CARDU
2190: 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RL");...case GSC
21a0: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
21b0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
21c0: 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09  TAG_PKCS15");...
21d0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52  case GSCIS_TAG_R
21e0: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09  EG_DATA_MODEL:..
21f0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2200: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
2210: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  EL");...case GSC
2220: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
2230: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2240: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
2250: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2260: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a  _TAG_CARD_APDU:.
2270: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2280: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29  _TAG_CARD_APDU")
2290: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
22a0: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a  AG_REDIRECTION:.
22b0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
22c0: 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e  _TAG_REDIRECTION
22d0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
22e0: 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75  _TAG_CT:....retu
22f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54  rn("GSCIS_TAG_CT
2300: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2310: 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75  _TAG_ST:....retu
2320: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54  rn("GSCIS_TAG_ST
2330: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2340: 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09  _TAG_NEXTCCC:...
2350: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2360: 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09  AG_NEXTCCC");...
2370: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46  case GSCIS_TAG_F
2380: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
2390: 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45  "GSCIS_TAG_FNAME
23a0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
23b0: 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_MNAME:....r
23c0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
23d0: 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _MNAME");...case
23e0: 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45   GSCIS_TAG_LNAME
23f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2400: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a  IS_TAG_LNAME");.
2410: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2420: 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75  _SUFFIX:....retu
2430: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55  rn("GSCIS_TAG_SU
2440: 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47  FFIX");...case G
2450: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
2460: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  ENCY:....return(
2470: 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f  "GSCIS_TAG_GOVT_
2480: 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65  AGENCY");...case
2490: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
24a0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
24b0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29  CIS_TAG_BUREAU")
24c0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
24d0: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a  AG_BUREAU_CODE:.
24e0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
24f0: 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45  _TAG_BUREAU_CODE
2500: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2510: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a  _TAG_DEPT_CODE:.
2520: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2530: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29  _TAG_DEPT_CODE")
2540: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2550: 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74  AG_TITLE:....ret
2560: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54  urn("GSCIS_TAG_T
2570: 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47  ITLE");...case G
2580: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
2590: 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  G:....return("GS
25a0: 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47  CIS_TAG_BUILDING
25b0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
25c0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
25d0: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  1:....return("GS
25e0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
25f0: 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47  DDR1");...case G
2600: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2610: 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e  ADDR2:....return
2620: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2630: 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61  CE_ADDR2");...ca
2640: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2650: 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74  ICE_CITY:....ret
2660: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2670: 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09  FFICE_CITY");...
2680: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2690: 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09  FFICE_STATE:....
26a0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
26b0: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29  G_OFFICE_STATE")
26c0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
26d0: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09  AG_OFFICE_ZIP:..
26e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
26f0: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29  TAG_OFFICE_ZIP")
2700: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2710: 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52  AG_OFFICE_COUNTR
2720: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2730: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2740: 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65  OUNTRY");...case
2750: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2760: 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75  E_PHONE:....retu
2770: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2780: 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09  FICE_PHONE");...
2790: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
27a0: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a  FFICE_PHONE_EXT:
27b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
27c0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
27d0: 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65  NE_EXT");...case
27e0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
27f0: 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e  E_FAX:....return
2800: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2810: 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65  CE_FAX");...case
2820: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2830: 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75  E_EMAIL:....retu
2840: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2850: 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09  FICE_EMAIL");...
2860: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2870: 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72  FFICE_ROOM:....r
2880: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2890: 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a  _OFFICE_ROOM");.
28a0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
28b0: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a  _NONGOV_AGENCY:.
28c0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
28d0: 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e  _TAG_NONGOV_AGEN
28e0: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CY");...case GSC
28f0: 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47  IS_TAG_SSN_DESIG
2900: 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e  NATOR:....return
2910: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  ("GSCIS_TAG_SSN_
2920: 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09  DESIGNATOR");...
2930: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2940: 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  SN:....return("G
2950: 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a  SCIS_TAG_SSN");.
2960: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2970: 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28  _DOB:....return(
2980: 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29  "GSCIS_TAG_DOB")
2990: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
29a0: 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65  AG_GENDER:....re
29b0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
29c0: 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65  GENDER");...case
29d0: 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49   GSCIS_TAG_USERI
29e0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
29f0: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29  CIS_TAG_USERID")
2a00: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2a10: 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65  AG_DOMAIN:....re
2a20: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2a30: 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65  DOMAIN");...case
2a40: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57   GSCIS_TAG_PASSW
2a50: 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ORD:....return("
2a60: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
2a70: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RD");...case GSC
2a80: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a  IS_TAG_ISSUERID:
2a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2aa0: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22 29  S_TAG_ISSUERID")
2ab0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2ac0: 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74  AG_SERNO:....ret
2ad0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
2ae0: 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47  ERNO");...case G
2af0: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44  SCIS_TAG_ISSUE_D
2b00: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2b10: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f  GSCIS_TAG_ISSUE_
2b20: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
2b30: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f  SCIS_TAG_EXPIRE_
2b40: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
2b50: 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52  "GSCIS_TAG_EXPIR
2b60: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
2b70: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f   GSCIS_TAG_CARD_
2b80: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
2b90: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f  "GSCIS_TAG_CARD_
2ba0: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47  TYPE");...case G
2bb0: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
2bc0: 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  Y_CODE:....retur
2bd0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43  n("GSCIS_TAG_SEC
2be0: 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09  URITY_CODE");...
2bf0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2c00: 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65  ARDID_AID:....re
2c10: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2c20: 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09  CARDID_AID");...
2c30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2c40: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72  ERTIFICATE:....r
2c50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c60: 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a  _CERTIFICATE");.
2c70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2c80: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45  _CERT_ISSUE_DATE
2c90: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2ca0: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55  IS_TAG_CERT_ISSU
2cb0: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
2cc0: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
2cd0: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
2ce0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2cf0: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
2d00: 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  TE");..}...retur
2d10: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
2d20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2d30: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
2d40: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
2d50: 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f  O_STR(LONG retco
2d60: 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72  de) {..switch (r
2d70: 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65  etcode) {...case
2d80: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
2d90: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2da0: 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a  RD_S_SUCCESS");.
2db0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
2dc0: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
2dd0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
2de0: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65  CELLED");...case
2df0: 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49   SCARD_E_CANT_DI
2e00: 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  SPOSE:....return
2e10: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44  ("SCARD_E_CANT_D
2e20: 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65  ISPOSE");...case
2e30: 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49   SCARD_E_INSUFFI
2e40: 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09  CIENT_BUFFER:...
2e50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2e60: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
2e70: 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  FFER");...case S
2e80: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
2e90: 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  TR:....return("S
2ea0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
2eb0: 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  TR");...case SCA
2ec0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
2ed0: 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DLE:....return("
2ee0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2ef0: 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65  HANDLE");...case
2f00: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
2f10: 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72  _PARAMETER:....r
2f20: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2f30: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52  NVALID_PARAMETER
2f40: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2f50: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
2f60: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
2f70: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
2f80: 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53  RGET");...case S
2f90: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56  CARD_E_INVALID_V
2fa0: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
2fb0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
2fc0: 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65  _VALUE");...case
2fd0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f   SCARD_E_NO_MEMO
2fe0: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RY:....return("S
2ff0: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59  CARD_E_NO_MEMORY
3000: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3010: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
3020: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
3030: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
3040: 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  ADER");...case S
3050: 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a  CARD_E_TIMEOUT:.
3060: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3070: 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09  _E_TIMEOUT");...
3080: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41  case SCARD_E_SHA
3090: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a  RING_VIOLATION:.
30a0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
30b0: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  _E_SHARING_VIOLA
30c0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53  TION");...case S
30d0: 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43  CARD_E_NO_SMARTC
30e0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
30f0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54  SCARD_E_NO_SMART
3100: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
3110: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43  CARD_E_UNKNOWN_C
3120: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
3130: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3140: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
3150: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
3160: 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e  MATCH:....return
3170: 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  ("SCARD_E_PROTO_
3180: 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61  MISMATCH");...ca
3190: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52  se SCARD_E_NOT_R
31a0: 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  EADY:....return(
31b0: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41  "SCARD_E_NOT_REA
31c0: 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  DY");...case SCA
31d0: 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43  RD_E_SYSTEM_CANC
31e0: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
31f0: 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  ("SCARD_E_SYSTEM
3200: 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09  _CANCELLED");...
3210: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54  case SCARD_E_NOT
3220: 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09  _TRANSACTED:....
3230: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3240: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29  NOT_TRANSACTED")
3250: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3260: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
3270: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
3280: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3290: 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09  NAVAILABLE");...
32a0: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53  case SCARD_W_UNS
32b0: 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09  UPPORTED_CARD:..
32c0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
32d0: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
32e0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
32f0: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56  RD_W_UNRESPONSIV
3300: 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  E_CARD:....retur
3310: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53  n("SCARD_W_UNRES
3320: 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a  PONSIVE_CARD");.
3330: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
3340: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09  NPOWERED_CARD:..
3350: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3360: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
3370: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3380: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09  _W_RESET_CARD:..
3390: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
33a0: 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a  W_RESET_CARD");.
33b0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52  ..case SCARD_W_R
33c0: 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09  EMOVED_CARD:....
33d0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
33e0: 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a  REMOVED_CARD");.
33f0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
3400: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09  CI_TOO_SMALL:...
3410: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3420: 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  _PCI_TOO_SMALL")
3430: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3440: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
3450: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
3460: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3470: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
3480: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50  case SCARD_E_DUP
3490: 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09  LICATE_READER:..
34a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
34b0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
34c0: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
34d0: 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50  RD_E_CARD_UNSUPP
34e0: 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ORTED:....return
34f0: 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  ("SCARD_E_CARD_U
3500: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
3510: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
3520: 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75  SERVICE:....retu
3530: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  rn("SCARD_E_NO_S
3540: 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65  ERVICE");...case
3550: 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45   SCARD_E_SERVICE
3560: 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74  _STOPPED:....ret
3570: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52  urn("SCARD_E_SER
3580: 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a  VICE_STOPPED");.
3590: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
35a0: 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55  NSUPPORTED_FEATU
35b0: 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RE:....return("S
35c0: 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54  CARD_E_UNSUPPORT
35d0: 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 69  ED_FEATURE");.#i
35e0: 66 64 65 66 20 53 43 41 52 44 5f 57 5f 49 4e 53  fdef SCARD_W_INS
35f0: 45 52 54 45 44 5f 43 41 52 44 0a 09 09 63 61 73  ERTED_CARD...cas
3600: 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  e SCARD_W_INSERT
3610: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
3620: 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45  rn("SCARD_W_INSE
3630: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e  RTED_CARD");.#en
3640: 64 69 66 0a 23 69 66 64 65 66 20 53 43 41 52 44  dif.#ifdef SCARD
3650: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3660: 41 49 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 53  AILABLE...case S
3670: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3680: 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09  S_AVAILABLE:....
3690: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
36a0: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
36b0: 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09  ABLE");.#endif..
36c0: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
36d0: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
36e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
36f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
3700: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74  BJID_TO_STR(uint
3710: 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73  16_t objid) {..s
3720: 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a  witch (objid) {.
3730: 09 09 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09  ..case 0x2000:..
3740: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3750: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
3760: 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65  ALINFO");...case
3770: 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75   0x2100:....retu
3780: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3790: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
37a0: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
37b0: 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x3000:....return
37c0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
37d0: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
37e0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30  ");...case 0x400
37f0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3800: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c  CKEY_TLV_OBJID_L
3810: 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  OGIN");...case 0
3820: 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x5000:....return
3830: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3840: 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09  ID_CARDINFO");..
3850: 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09  .case 0x6000:...
3860: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3870: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54  TLV_OBJID_BIOMET
3880: 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30  RICS");...case 0
3890: 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x7000:....return
38a0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
38b0: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
38c0: 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  T");...case 0x02
38d0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
38e0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
38f0: 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09  CAC_PERSON");...
3900: 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09  case 0x0202:....
3910: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3920: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e  LV_OBJID_CAC_BEN
3930: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3940: 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72  0x0203:....retur
3950: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3960: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
3970: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3980: 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72  0x0201:....retur
3990: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
39a0: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
39b0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  L");...case 0x02
39c0: 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  FE:....return("C
39d0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
39e0: 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09  CAC_PKICERT");..
39f0: 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  }....return("UNK
3a00: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
3a10: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
3a20: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3a30: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75  APPTYPE_TO_STR(u
3a40: 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65 29 20  int8_t apptype) 
3a50: 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70 74 79  {..switch (appty
3a60: 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30  pe) {...case 0x0
3a70: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f  0:....return("NO
3a80: 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  NE");...case 0x0
3a90: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  1:....return("CA
3aa0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3ab0: 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30  ERIC");...case 0
3ac0: 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x02:....return("
3ad0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3ae0: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3af0: 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  3:....return("CA
3b00: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3b10: 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c  ERIC | CACKEY_TL
3b20: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
3b30: 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74  ase 0x04:....ret
3b40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3b50: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
3b60: 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72  e 0x05:....retur
3b70: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3b80: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3b90: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3ba0: 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09  ;...case 0x06:..
3bb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3bc0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43  _TLV_APP_SKI | C
3bd0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3be0: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37  I");...case 0x07
3bf0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3c00: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
3c10: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
3c20: 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45  _APP_SKI | CACKE
3c30: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
3c40: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e  ..}...return("IN
3c50: 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 73 74 61 74  VALID");.}..stat
3c60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43  ic const char *C
3c70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
3c80: 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
3c90: 52 28 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54  R(CK_ATTRIBUTE_T
3ca0: 59 50 45 20 61 74 74 72 29 20 7b 0a 09 73 77 69  YPE attr) {..swi
3cb0: 74 63 68 20 28 61 74 74 72 29 20 7b 0a 09 09 63  tch (attr) {...c
3cc0: 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09  ase CKA_CLASS:..
3cd0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4c  ..return("CKA_CL
3ce0: 41 53 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ASS");...case CK
3cf0: 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72 65 74 75  A_TOKEN:....retu
3d00: 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b  rn("CKA_TOKEN");
3d10: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56  ...case CKA_PRIV
3d20: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
3d30: 43 4b 41 5f 50 52 49 56 41 54 45 22 29 3b 0a 09  CKA_PRIVATE");..
3d40: 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a  .case CKA_LABEL:
3d50: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3d60: 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  LABEL");...case 
3d70: 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 3a  CKA_APPLICATION:
3d80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3d90: 41 50 50 4c 49 43 41 54 49 4f 4e 22 29 3b 0a 09  APPLICATION");..
3da0: 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a  .case CKA_VALUE:
3db0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3dc0: 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20  VALUE");...case 
3dd0: 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 3a 0a 09  CKA_OBJECT_ID:..
3de0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 42  ..return("CKA_OB
3df0: 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09 63 61 73  JECT_ID");...cas
3e00: 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
3e10: 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72  E_TYPE:....retur
3e20: 6e 28 22 43 4b 41 5f 43 45 52 54 49 46 49 43 41  n("CKA_CERTIFICA
3e30: 54 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  TE_TYPE");...cas
3e40: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
3e50: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 53 53  .return("CKA_ISS
3e60: 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  UER");...case CK
3e70: 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a  A_SERIAL_NUMBER:
3e80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3e90: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 22 29 3b  SERIAL_NUMBER");
3ea0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 43 5f 49  ...case CKA_AC_I
3eb0: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
3ec0: 28 22 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 22  ("CKA_AC_ISSUER"
3ed0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 57  );...case CKA_OW
3ee0: 4e 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NER:....return("
3ef0: 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a 09 09 63  CKA_OWNER");...c
3f00: 61 73 65 20 43 4b 41 5f 41 54 54 52 5f 54 59 50  ase CKA_ATTR_TYP
3f10: 45 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ES:....return("C
3f20: 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 22 29 3b  KA_ATTR_TYPES");
3f30: 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
3f40: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
3f50: 43 4b 41 5f 54 52 55 53 54 45 44 22 29 3b 0a 09  CKA_TRUSTED");..
3f60: 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59  .case CKA_KEY_TY
3f70: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  PE:....return("C
3f80: 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29 3b 0a 09  KA_KEY_TYPE");..
3f90: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43  .case CKA_SUBJEC
3fa0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
3fb0: 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a 09 09 63  A_SUBJECT");...c
3fc0: 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 72  ase CKA_ID:....r
3fd0: 65 74 75 72 6e 28 22 43 4b 41 5f 49 44 22 29 3b  eturn("CKA_ID");
3fe0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53  ...case CKA_SENS
3ff0: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ITIVE:....return
4000: 28 22 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 22  ("CKA_SENSITIVE"
4010: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e  );...case CKA_EN
4020: 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e  CRYPT:....return
4030: 28 22 43 4b 41 5f 45 4e 43 52 59 50 54 22 29 3b  ("CKA_ENCRYPT");
4040: 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
4050: 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPT:....return("
4060: 43 4b 41 5f 44 45 43 52 59 50 54 22 29 3b 0a 09  CKA_DECRYPT");..
4070: 09 63 61 73 65 20 43 4b 41 5f 57 52 41 50 3a 0a  .case CKA_WRAP:.
4080: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 57  ...return("CKA_W
4090: 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  RAP");...case CK
40a0: 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09 72 65 74  A_UNWRAP:....ret
40b0: 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52 41 50 22  urn("CKA_UNWRAP"
40c0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49  );...case CKA_SI
40d0: 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  GN:....return("C
40e0: 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09 63 61 73  KA_SIGN");...cas
40f0: 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  e CKA_SIGN_RECOV
4100: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
4110: 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 22  KA_SIGN_RECOVER"
4120: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45  );...case CKA_VE
4130: 52 49 46 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIFY:....return(
4140: 22 43 4b 41 5f 56 45 52 49 46 59 22 29 3b 0a 09  "CKA_VERIFY");..
4150: 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59  .case CKA_VERIFY
4160: 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74  _RECOVER:....ret
4170: 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 5f  urn("CKA_VERIFY_
4180: 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73  RECOVER");...cas
4190: 65 20 43 4b 41 5f 44 45 52 49 56 45 3a 0a 09 09  e CKA_DERIVE:...
41a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 52  .return("CKA_DER
41b0: 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IVE");...case CK
41c0: 41 5f 53 54 41 52 54 5f 44 41 54 45 3a 0a 09 09  A_START_DATE:...
41d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 54 41  .return("CKA_STA
41e0: 52 54 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  RT_DATE");...cas
41f0: 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54 45 3a 0a  e CKA_END_DATE:.
4200: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4210: 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  ND_DATE");...cas
4220: 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
4230: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f  ..return("CKA_MO
4240: 44 55 4c 55 53 22 29 3b 0a 09 09 63 61 73 65 20  DULUS");...case 
4250: 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53  CKA_MODULUS_BITS
4260: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4270: 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 22 29 3b  _MODULUS_BITS");
4280: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c  ...case CKA_PUBL
4290: 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09  IC_EXPONENT:....
42a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 55 42 4c  return("CKA_PUBL
42b0: 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09  IC_EXPONENT");..
42c0: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54  .case CKA_PRIVAT
42d0: 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72  E_EXPONENT:....r
42e0: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41  eturn("CKA_PRIVA
42f0: 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09  TE_EXPONENT");..
4300: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f  .case CKA_PRIME_
4310: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  1:....return("CK
4320: 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a 09 09 63  A_PRIME_1");...c
4330: 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 32 3a  ase CKA_PRIME_2:
4340: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4350: 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09 63 61 73  PRIME_2");...cas
4360: 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  e CKA_EXPONENT_1
4370: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4380: 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09  _EXPONENT_1");..
4390: 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45  .case CKA_EXPONE
43a0: 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  NT_2:....return(
43b0: 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 22  "CKA_EXPONENT_2"
43c0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4f  );...case CKA_CO
43d0: 45 46 46 49 43 49 45 4e 54 3a 0a 09 09 09 72 65  EFFICIENT:....re
43e0: 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45 46 46 49  turn("CKA_COEFFI
43f0: 43 49 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  CIENT");...case 
4400: 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09 09 72 65  CKA_PRIME:....re
4410: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 22  turn("CKA_PRIME"
4420: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55  );...case CKA_SU
4430: 42 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72  BPRIME:....retur
4440: 6e 28 22 43 4b 41 5f 53 55 42 50 52 49 4d 45 22  n("CKA_SUBPRIME"
4450: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 42 41  );...case CKA_BA
4460: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SE:....return("C
4470: 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09 63 61 73  KA_BASE");...cas
4480: 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  e CKA_PRIME_BITS
4490: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44a0: 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09  _PRIME_BITS");..
44b0: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 5f 50 52  .case CKA_SUB_PR
44c0: 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  IME_BITS:....ret
44d0: 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f 50 52 49  urn("CKA_SUB_PRI
44e0: 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  ME_BITS");...cas
44f0: 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  e CKA_VALUE_BITS
4500: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4510: 5f 56 41 4c 55 45 5f 42 49 54 53 22 29 3b 0a 09  _VALUE_BITS");..
4520: 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f  .case CKA_VALUE_
4530: 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  LEN:....return("
4540: 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 22 29 3b  CKA_VALUE_LEN");
4550: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52  ...case CKA_EXTR
4560: 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  ACTABLE:....retu
4570: 72 6e 28 22 43 4b 41 5f 45 58 54 52 41 43 54 41  rn("CKA_EXTRACTA
4580: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BLE");...case CK
4590: 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72 65 74 75  A_LOCAL:....retu
45a0: 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b  rn("CKA_LOCAL");
45b0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e 45 56 45  ...case CKA_NEVE
45c0: 52 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  R_EXTRACTABLE:..
45d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4e 45  ..return("CKA_NE
45e0: 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45 22  VER_EXTRACTABLE"
45f0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 4c  );...case CKA_AL
4600: 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45 3a 0a  WAYS_SENSITIVE:.
4610: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4620: 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45 22  LWAYS_SENSITIVE"
4630: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45  );...case CKA_KE
4640: 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a  Y_GEN_MECHANISM:
4650: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4660: 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53  KEY_GEN_MECHANIS
4670: 4d 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  M");...case CKA_
4680: 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 72  MODIFIABLE:....r
4690: 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 49 46  eturn("CKA_MODIF
46a0: 49 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  IABLE");...case 
46b0: 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53  CKA_ECDSA_PARAMS
46c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
46d0: 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 22 29 3b  _ECDSA_PARAMS");
46e0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 5f 50  ...case CKA_EC_P
46f0: 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  OINT:....return(
4700: 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 22 29 3b  "CKA_EC_POINT");
4710: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 43 4f  ...case CKA_SECO
4720: 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09 09 09 72  NDARY_AUTH:....r
4730: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 43 4f 4e  eturn("CKA_SECON
4740: 44 41 52 59 5f 41 55 54 48 22 29 3b 0a 09 09 63  DARY_AUTH");...c
4750: 61 73 65 20 43 4b 41 5f 41 55 54 48 5f 50 49 4e  ase CKA_AUTH_PIN
4760: 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65 74 75 72  _FLAGS:....retur
4770: 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f  n("CKA_AUTH_PIN_
4780: 46 4c 41 47 53 22 29 3b 0a 09 09 63 61 73 65 20  FLAGS");...case 
4790: 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54  CKA_HW_FEATURE_T
47a0: 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPE:....return("
47b0: 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54  CKA_HW_FEATURE_T
47c0: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
47d0: 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a  A_RESET_ON_INIT:
47e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
47f0: 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b  RESET_ON_INIT");
4800: 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 41 53 5f  ...case CKA_HAS_
4810: 52 45 53 45 54 3a 0a 09 09 09 72 65 74 75 72 6e  RESET:....return
4820: 28 22 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 22  ("CKA_HAS_RESET"
4830: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45  );...case CKA_VE
4840: 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a 0a 09 09  NDOR_DEFINED:...
4850: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 4e  .return("CKA_VEN
4860: 44 4f 52 5f 44 45 46 49 4e 45 44 22 29 3b 0a 09  DOR_DEFINED");..
4870: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
4880: 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66  OWN");.}..#  def
4890: 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41  ine malloc(x) CA
48a0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
48b0: 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63  MALLOC(x, __func
48c0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20  __, __LINE__).# 
48d0: 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28   define realloc(
48e0: 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42  x, y) CACKEY_DEB
48f0: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
4900: 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  x, y, __func__, 
4910: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64  __LINE__).#  ifd
4920: 65 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75  ef strdup.#    u
4930: 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65  ndef strdup.#  e
4940: 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73  ndif.#  define s
4950: 74 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f  trdup(x) CACKEY_
4960: 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55  DEBUG_FUNC_STRDU
4970: 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f  P(x, __func__, _
4980: 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23  _LINE__).#else.#
4990: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
49a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e  DEBUG_PRINTF(x..
49b0: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  .) /**/.#  defin
49c0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
49d0: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
49e0: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
49f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52  CACKEY_DEBUG_PER
4a00: 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64  ROR(x) /**/.#  d
4a10: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4a20: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
4a30: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4a40: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4a50: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4a60: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
4a70: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4a80: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4a90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4aa0: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
4ab0: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4ac0: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4ad0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4ae0: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78  APPTYPE_TO_STR(x
4af0: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4b00: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4b10: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
4b20: 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28  TTRIBUTE_TO_STR(
4b30: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4b40: 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75  ED".#endif..stru
4b50: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
4b60: 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69 67  dentity {..unsig
4b70: 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b  ned char applet[
4b80: 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66 69  7];..uint16_t fi
4b90: 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72  le;...size_t cer
4ba0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75  tificate_len;..u
4bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
4bc0: 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73 69  rtificate;...ssi
4bd0: 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b  ze_t keysize;.};
4be0: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
4bf0: 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75  identity {..stru
4c00: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
4c10: 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
4c20: 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54  entity;...CK_ATT
4c30: 52 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74  RIBUTE *attribut
4c40: 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74  es;..CK_ULONG at
4c50: 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a  tributes_count;.
4c60: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
4c70: 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74  y_session {..int
4c80: 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c   active;...CK_SL
4c90: 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09  OT_ID slotID;...
4ca0: 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a  CK_STATE state;.
4cb0: 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b  .CK_FLAGS flags;
4cc0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76  ..CK_ULONG ulDev
4cd0: 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f  iceError;..CK_VO
4ce0: 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
4cf0: 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20  ion;..CK_NOTIFY 
4d00: 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74  Notify;...struct
4d10: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
4d20: 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
4d30: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
4d40: 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a  ntities_count;..
4d50: 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69  .int search_acti
4d60: 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ve;..CK_ATTRIBUT
4d70: 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65  E_PTR search_que
4d80: 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65  ry;..CK_ULONG se
4d90: 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
4da0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
4db0: 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b   search_curr_id;
4dc0: 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69  ...int sign_acti
4dd0: 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53  ve;..CK_MECHANIS
4de0: 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68  M_TYPE sign_mech
4df0: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f  anism;..CK_BYTE_
4e00: 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75  PTR sign_buf;..u
4e10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
4e20: 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67  n_buflen;..unsig
4e30: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
4e40: 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63  fused;..struct c
4e50: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
4e60: 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  sign_identity;..
4e70: 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74  .int decrypt_act
4e80: 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49  ive;..CK_MECHANI
4e90: 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f  SM_TYPE decrypt_
4ea0: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56  mechanism;..CK_V
4eb0: 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f  OID_PTR decrypt_
4ec0: 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55  mech_parm;..CK_U
4ed0: 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63  LONG decrypt_mec
4ee0: 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75  h_parmlen;..stru
4ef0: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
4f00: 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e  ty *decrypt_iden
4f10: 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  tity;.};..struct
4f20: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09   cackey_slot {..
4f30: 69 6e 74 20 61 63 74 69 76 65 3b 0a 09 69 6e 74  int active;..int
4f40: 20 69 6e 74 65 72 6e 61 6c 3b 0a 0a 09 63 68 61   internal;...cha
4f50: 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a  r *pcsc_reader;.
4f60: 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f  ..int pcsc_card_
4f70: 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52  connected;..SCAR
4f80: 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72  DHANDLE pcsc_car
4f90: 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63  d;...int transac
4fa0: 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74  tion_depth;..int
4fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65   transaction_nee
4fc0: 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74  d_hw_lock;...int
4fd0: 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43   slot_reset;...C
4fe0: 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c  K_FLAGS token_fl
4ff0: 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20  ags;...unsigned 
5000: 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44  char *label;...D
5010: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a  WORD protocol;..
5020: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61  .unsigned int ca
5030: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
5040: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
5050: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
5060: 63 61 63 68 65 64 5f 63 65 72 74 73 3b 0a 7d 3b  cached_certs;.};
5070: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
5080: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
5090: 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c  _GENERIC = 0x01,
50a0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
50b0: 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c  _SKI     = 0x02,
50c0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
50d0: 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a  _PKI     = 0x04.
50e0: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70  } cackey_tlv_app
50f0: 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65  type;..typedef e
5100: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
5110: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49  V_OBJID_GENERALI
5120: 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30  NFO       = 0x20
5130: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5140: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41  OBJID_PROPERSONA
5150: 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30  LINFO   = 0x2100
5160: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5170: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f  JID_ACCESSCONTRO
5180: 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a  L     = 0x3000,.
5190: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
51a0: 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20  D_LOGIN         
51b0: 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43      = 0x4000,..C
51c0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
51d0: 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20  CARDINFO        
51e0: 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43    = 0x5000,..CAC
51f0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49  KEY_TLV_OBJID_BI
5200: 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20  OMETRICS        
5210: 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x6000,..CACKE
5220: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
5230: 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20  TALSIGCERT    = 
5240: 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x7000,..CACKEY_
5250: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
5260: 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78  RSON        = 0x
5270: 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0200,..CACKEY_TL
5280: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45  V_OBJID_CAC_BENE
5290: 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32  FITS      = 0x02
52a0: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
52b0: 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42  OBJID_CAC_OTHERB
52c0: 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33  ENEFITS = 0x0203
52d0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
52e0: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
52f0: 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a  L     = 0x0201,.
5300: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5310: 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20  D_CAC_PKICERT   
5320: 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63      = 0x02FE.} c
5330: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5340: 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  id;..typedef enu
5350: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  m {..CACKEY_PCSC
5360: 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20  _S_TOKENPRESENT 
5370: 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f     = 1,..CACKEY_
5380: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
5390: 20 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43         = 0,..CAC
53a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
53b0: 49 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c  IC         = -1,
53c0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
53d0: 42 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20  BADPIN          
53e0: 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -2,..CACKEY_PC
53f0: 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  SC_E_LOCKED     
5400: 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b       = -3,..CACK
5410: 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
5420: 47 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a  GIN       = -4,.
5430: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  .CACKEY_PCSC_E_T
5440: 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d  OKENABSENT     =
5450: 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -6,..CACKEY_PCS
5460: 43 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 20  C_E_RETRY       
5470: 20 20 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65      = -7.} cacke
5480: 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63  y_ret;..struct c
5490: 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72  ackey_tlv_cardur
54a0: 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  l {..unsigned ch
54b0: 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d  ar        rid[5]
54c0: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70  ;..cackey_tlv_ap
54d0: 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65 3b  ptype   apptype;
54e0: 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  ..cackey_tlv_obj
54f0: 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b  ectid  objectid;
5500: 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  ..cackey_tlv_obj
5510: 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75  ectid  appid;..u
5520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20  nsigned char    
5530: 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73      pinid;.};..s
5540: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
5550: 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20  _entity;.struct 
5560: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
5570: 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67  y {..uint8_t tag
5580: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  ;..size_t length
5590: 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f  ;...union {...vo
55a0: 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72  id *value;...str
55b0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
55c0: 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61  ardurl *value_ca
55d0: 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74  rdurl;...uint8_t
55e0: 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b   value_byte;..};
55f0: 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ...struct cackey
5600: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65  _tlv_entity *_ne
5610: 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45  xt;.};../* CACKE
5620: 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73  Y Global Handles
5630: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
5640: 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20  *cackey_biglock 
5650: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73  = NULL;.static s
5660: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73  truct cackey_ses
5670: 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73  sion cackey_sess
5680: 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69  ions[128];.stati
5690: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
56a0: 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  slot cackey_slot
56b0: 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69  s[128];.static i
56c0: 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  nt cackey_initia
56d0: 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69  lized = 0;.stati
56e0: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67  c int cackey_big
56f0: 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43  lock_init = 0;.C
5700: 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41  K_C_INITIALIZE_A
5710: 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b  RGS cackey_args;
5720: 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74  ../** Extra cert
5730: 69 66 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c  ificates to incl
5740: 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f  ude in token **/
5750: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
5760: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74  csc_identity ext
5770: 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23  ra_certs[] = {.#
5780: 69 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f  include "cackey_
5790: 62 75 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22  builtin_certs.h"
57a0: 0a 7d 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f  .};../* PCSC Glo
57b0: 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73  bal Handles */.s
57c0: 74 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e  tatic LPSCARDCON
57d0: 54 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63  TEXT cackey_pcsc
57e0: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
57f0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
5800: 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74   long cackey_get
5810: 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a  version(void) {.
5820: 09 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
5830: 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32   long retval = 2
5840: 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  55;..unsigned lo
5850: 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75  ng major = 0;..u
5860: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e  nsigned long min
5870: 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d  or = 0;..char *m
5880: 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  ajor_str = NULL;
5890: 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74  ..char *minor_st
58a0: 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b  r = NULL;...CACK
58b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
58c0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
58d0: 20 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29   (retval != 255)
58e0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
58f0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
5900: 69 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65  ing 0x%lx (cache
5910: 64 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  d).", retval);..
5920: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
5930: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
5940: 30 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41  0;..#ifdef PACKA
5950: 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20  GE_VERSION.     
5960: 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50     major_str = P
5970: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a  ACKAGE_VERSION;.
5980: 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20  .if (major_str) 
5990: 7b 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  {..        major
59a0: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72   = strtoul(major
59b0: 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72  _str, &minor_str
59c0: 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69  , 10);....if (mi
59d0: 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69  nor_str) {....mi
59e0: 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69  nor = strtoul(mi
59f0: 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c  nor_str + 1, NUL
5a00: 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  L, 10);...}..}..
5a10: 09 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72  .retval = (major
5a20: 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72   << 16) | (minor
5a30: 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a   << 8);.#endif..
5a40: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5a50: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
5a60: 30 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b  0x%lx", retval);
5a70: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
5a80: 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52  );.}../* PC/SC R
5a90: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
5aa0: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
5ab0: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
5ac0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
5ad0: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29  onnect_all(void)
5ae0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
5af0: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
5b00: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
5b10: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
5b20: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
5b30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
5b40: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61  sconnects from a
5b50: 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f  ll cards.. *. */
5b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
5b70: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
5b80: 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b  nect_all(void) {
5b90: 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
5ba0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5bb0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
5bc0: 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
5bd0: 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
5be0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
5bf0: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
5c00: 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
5c10: 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
5c20: 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72  slots[idx].inter
5c30: 6e 61 6c 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69  nal) {..../* Ski
5c40: 70 20 69 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73  p internal slots
5c50: 20 2a 2f 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b   */....continue;
5c60: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
5c70: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
5c80: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
5c90: 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  d) {....CACKEY_D
5ca0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
5cb0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75  rdDisconnect(%lu
5cc0: 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69  ) called", (unsi
5cd0: 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b  gned long) idx);
5ce0: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
5cf0: 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74  nect(cackey_slot
5d00: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
5d10: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
5d20: 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  RD);...}....if (
5d30: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5d40: 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66 72  ].label) {....fr
5d50: 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
5d60: 69 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09  idx].label);....
5d70: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
5d80: 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  x].label = NULL;
5d90: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
5da0: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
5db0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
5dc0: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
5dd0: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
5de0: 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
5df0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5e00: 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
5e10: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
5e20: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
5e30: 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ots[idx].active)
5e40: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
5e50: 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69  UG_PRINTF("Marki
5e60: 6e 67 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25  ng active slot %
5e70: 6c 75 20 61 73 20 62 65 69 6e 67 20 72 65 73 65  lu as being rese
5e80: 74 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t", (unsigned lo
5e90: 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09  ng) idx);...}...
5ea0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
5eb0: 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  x].slot_reset = 
5ec0: 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  1;..}...CACKEY_D
5ed0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
5ee0: 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75  urning");...retu
5ef0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
5f00: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
5f10: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
5f20: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64  csc_connect(void
5f30: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
5f40: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
5f50: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
5f60: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
5f70: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
5f80: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
5f90: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
5fa0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
5fb0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
5fc0: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
5fd0: 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20  nction connects 
5fe0: 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e  to the PC/SC Con
5ff0: 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20  nection Manager 
6000: 61 6e 64 20 75 70 64 61 74 65 73 20 74 68 65 0a  and updates the.
6010: 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61   *     global ha
6020: 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ndle.. *. */.sta
6030: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
6040: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
6050: 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47  ct(void) {..LONG
6060: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
6070: 78 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48  xt_ret;.#ifdef H
6080: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44  AVE_SCARDISVALID
6090: 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63  CONTEXT..LONG sc
60a0: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b  ard_isvalid_ret;
60b0: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
60c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
60d0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
60e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
60f0: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
6100: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6110: 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  le = malloc(size
6120: 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  of(*cackey_pcsc_
6130: 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28  handle));...if (
6140: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6150: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
6160: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6170: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61  INTF("Call to ma
6180: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72  lloc() failed, r
6190: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
61a0: 75 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ure");.....cacke
61b0: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
61c0: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
61d0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
61e0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
61f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6200: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
6210: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
6220: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
6230: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6240: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
6250: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
6260: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
6270: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
6280: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6290: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
62a0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
62b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
62c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
62d0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
62e0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
62f0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
6300: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
6310: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6320: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
6330: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
6340: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
6350: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6360: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
6370: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6380: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
6390: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
63a0: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
63b0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
63c0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
63d0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
63e0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
63f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6400: 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  C);...}..}..#ifd
6410: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56  ef HAVE_SCARDISV
6420: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 43  ALIDCONTEXT..CAC
6430: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6440: 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f  ("SCardIsValidCo
6450: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
6460: 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69 64  ;..scard_isvalid
6470: 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56 61  _ret = SCardIsVa
6480: 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b  lidContext(*cack
6490: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
64a0: 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76 61  ..if (scard_isva
64b0: 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52 44  lid_ret != SCARD
64c0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
64d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
64e0: 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20  NTF("Handle has 
64f0: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28  become invalid (
6500: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
6510: 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74  ext = %s/%li), t
6520: 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 61  rying to re-esta
6530: 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45  blish...", CACKE
6540: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
6550: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
6560: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 2c  rd_isvalid_ret),
6570: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 73   (long) scard_is
6580: 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43  valid_ret);....C
6590: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
65a0: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69  TF("SCardEstabli
65b0: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  shContext() call
65c0: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73  ed");...scard_es
65d0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  t_context_ret = 
65e0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
65f0: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50  ntext(SCARD_SCOP
6600: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20  E_SYSTEM, NULL, 
6610: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73  NULL, cackey_pcs
6620: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20  c_handle);...if 
6630: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
6640: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
6650: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
6660: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6670: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61  NTF("Call to SCa
6680: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6690: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72  xt failed (retur
66a0: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74  ned %s/%li), ret
66b0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
66c0: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e", CACKEY_DEBUG
66d0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
66e0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f  O_STR(scard_est_
66f0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c  context_ret), (l
6700: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63  ong) scard_est_c
6710: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09  ontext_ret);....
6720: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
6730: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61  c_handle);....ca
6740: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6750: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63   = NULL;.....cac
6760: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
6770: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09  nect_all();.....
6780: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6790: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
67a0: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
67b0: 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c  UG_PRINTF("Handl
67c0: 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d 65 73  e has been re-es
67d0: 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a  tablished");..}.
67e0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
67f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
6800: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63  cessfully connec
6810: 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 72 65  ted to PC/SC, re
6820: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
6830: 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  ss");...return(C
6840: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
6850: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
6860: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
6870: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
6880: 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69  c_disconnect(voi
6890: 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  d);. *. * ARGUME
68a0: 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  NTS. *     None.
68b0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
68c0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
68d0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
68e0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
68f0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
6900: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
6910: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
6920: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
6930: 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65  unction disconne
6940: 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50 43 2f  cts from the PC/
6950: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  SC Connection ma
6960: 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65  nager and update
6970: 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67 6c 6f  s. *     the glo
6980: 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20  bal handle.. *. 
6990: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
69a0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
69b0: 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64  _disconnect(void
69c0: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
69d0: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b  rel_context_ret;
69e0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
69f0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
6a00: 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
6a10: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e  pcsc_handle == N
6a20: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
6a30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6a40: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65  );..}...scard_re
6a50: 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  l_context_ret = 
6a60: 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f 6e 74  SCardReleaseCont
6a70: 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ext(*cackey_pcsc
6a80: 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28  _handle);...if (
6a90: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6aa0: 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63  le) {...free(cac
6ab0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6ac0: 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 63 73  ;.....cackey_pcs
6ad0: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
6ae0: 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f  ..}...if (scard_
6af0: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  rel_context_ret 
6b00: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6b10: 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43  SS) {...return(C
6b20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6b30: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  ERIC);..}...retu
6b40: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
6b50: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
6b60: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76  YNPOSIS. *     v
6b70: 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  oid cackey_mark_
6b80: 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63  slot_reset(struc
6b90: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
6ba0: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
6bb0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
6bc0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
6bd0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
6be0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
6bf0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
6c00: 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f 74 20 68  n marks a slot h
6c10: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72  as having been r
6c20: 65 73 65 74 2c 20 74 6f 20 6c 61 74 65 72 20 62  eset, to later b
6c30: 65 20 63 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a  e cleaned up.. *
6c40: 20 20 20 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c       Cleanup onl
6c50: 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  y happens when a
6c60: 20 50 4b 43 53 23 31 31 20 63 6c 69 65 6e 74 20   PKCS#11 client 
6c70: 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65  calls C_FindObje
6c80: 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a  ctsInit.. *. */.
6c90: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
6ca0: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
6cb0: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
6cc0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
6cd0: 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c  if (slot == NULL
6ce0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
6cf0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6d00: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
6d10: 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70  );...if (slot->p
6d20: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
6d30: 65 64 29 20 7b 0a 09 09 53 43 61 72 64 44 69 73  ed) {...SCardDis
6d40: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
6d50: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
6d60: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a  EAVE_CARD);..}..
6d70: 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65  .slot->slot_rese
6d80: 74 20 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63  t = 1;..slot->pc
6d90: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
6da0: 64 20 3d 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f  d = 0;..slot->to
6db0: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
6dc0: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
6dd0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6de0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
6df0: 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  .");...return;.}
6e00: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
6e10: 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63 61 63  . *     LONG cac
6e20: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
6e30: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
6e40: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f  _slot *slot, DWO
6e50: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
6e60: 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c  col, LPDWORD sel
6e70: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b  ected_protocol);
6e80: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6e90: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
6ea0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
6eb0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
6ec0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
6ed0: 0a 20 2a 20 20 20 20 20 44 57 4f 52 44 20 64 65  . *     DWORD de
6ee0: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20  fault_protocol. 
6ef0: 2a 20 20 20 20 20 20 20 20 20 50 72 6f 74 6f 63  *         Protoc
6f00: 6f 6c 20 74 6f 20 61 74 74 65 6d 70 74 20 66 69  ol to attempt fi
6f10: 72 73 74 0a 20 2a 0a 20 2a 20 20 20 20 20 4c 50  rst. *. *     LP
6f20: 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70  DWORD selected_p
6f30: 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20  rotocol. *      
6f40: 20 20 20 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 6f     [OUT] Protoco
6f50: 6c 20 73 65 6c 65 63 74 65 64 0a 20 2a 0a 20 2a  l selected. *. *
6f60: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
6f70: 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e 20       The return 
6f80: 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 64  value from SCard
6f90: 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20  Reconnect(). *. 
6fa0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6fb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6fc0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
6fd0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
6fe0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 20  ). *. *     The 
6ff0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7000: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
7010: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69  ill be called fi
7020: 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a 20  rst with the. * 
7030: 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64 50      dwPreferredP
7040: 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66  rotocols of "def
7050: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20  ault_protocol". 
7060: 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72 65   If that call re
7070: 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 41  turns. *     SCA
7080: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7090: 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77 69  TCH try again wi
70a0: 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66  th a protocol of
70b0: 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e   T=0, and failin
70c0: 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54 3d  g. *     that T=
70d0: 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  1.. *. */.static
70e0: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
70f0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7100: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7110: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
7120: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50  ult_protocol, LP
7130: 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70  DWORD selected_p
7140: 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47  rotocol) {..LONG
7150: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7160: 0a 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7170: 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t = SCardReconne
7180: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
7190: 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  rd, SCARD_SHARE_
71a0: 53 48 41 52 45 44 2c 20 64 65 66 61 75 6c 74 5f  SHARED, default_
71b0: 70 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f  protocol, SCARD_
71c0: 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65  RESET_CARD, sele
71d0: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
71e0: 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
71f0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7200: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7210: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7220: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
7230: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
7240: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7250: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7260: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
7270: 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  )...scard_conn_r
7280: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7290: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
72a0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
72b0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
72c0: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52  ROTOCOL_T0, SCAR
72d0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65  D_RESET_CARD, se
72e0: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
72f0: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  ;....if (scard_c
7300: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7310: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7320: 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  H) {....CACKEY_D
7330: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7340: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65  rdReconnect() re
7350: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
7360: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
7370: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
7380: 54 3d 31 22 29 0a 09 09 09 73 63 61 72 64 5f 63  T=1")....scard_c
7390: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
73a0: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
73b0: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
73c0: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
73d0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
73e0: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
73f0: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
7400: 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  ocol);...}..}...
7410: 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e  return(scard_con
7420: 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n_ret);.}../*. *
7430: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7440: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7450: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7460: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7470: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
7480: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
7490: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
74a0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
74b0: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
74c0: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
74d0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
74e0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
74f0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7500: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7510: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7520: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7530: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7540: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
7550: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7560: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7570: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7580: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
7590: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
75a0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
75b0: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
75c0: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
75d0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
75e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
75f0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
7600: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
7610: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
7620: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
7630: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
7640: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
7650: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7660: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7670: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
7680: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
7690: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
76a0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
76b0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
76c0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
76d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
76e0: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
76f0: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
7700: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7710: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
7720: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7730: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
7740: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
7750: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
7760: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
7770: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
7780: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7790: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
77a0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
77b0: 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  d", slot->pcsc_r
77c0: 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f  eader);...scard_
77d0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
77e0: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
77f0: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
7800: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
7810: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7820: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7830: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
7840: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
7850: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
7860: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
7870: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7880: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7890: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43  MISMATCH) {....C
78a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
78b0: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
78c0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
78d0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
78e0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
78f0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73 63  just T=0")....sc
7900: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7910: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
7920: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
7930: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7940: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
7950: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7960: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
7970: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
7980: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20  otocol);.....if 
7990: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
79a0: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
79b0: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
79c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
79d0: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
79e0: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
79f0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7a00: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
7a10: 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09  h just T=1")....
7a20: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
7a30: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
7a40: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7a50: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
7a60: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
7a70: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7a80: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
7a90: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7aa0: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d  &protocol);....}
7ab0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
7ac0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
7ad0: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
7ae0: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
7af0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7b00: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7b10: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57 5f  eturned SCARD_W_
7b20: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c 20  UNPOWERED_CARD, 
7b30: 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e  trying to re-con
7b40: 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  nect...");.....s
7b50: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7b60: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7b70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7b80: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7b90: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7ba0: 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f 50  _DIRECT, SCARD_P
7bb0: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
7bc0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
7bd0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7be0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7bf0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7c00: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7c10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7c20: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
7c30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7c40: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7c50: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7c60: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7c70: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
7c80: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
7c90: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7ca0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7cb0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7cc0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7cd0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7ce0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7cf0: 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  0, &slot->pcsc_c
7d00: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7d10: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
7d20: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
7d30: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
7d40: 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  CH) {......CACKE
7d50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7d60: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7d70: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7d80: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7d90: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7da0: 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61 72   T=1")......scar
7db0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7dc0: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
7dd0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
7de0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7df0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7e00: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7e10: 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e  OCOL_T1, &slot->
7e20: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74  pcsc_card, &prot
7e30: 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  ocol);.....}....
7e40: 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  }.....scard_conn
7e50: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
7e60: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
7e70: 74 2c 20 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 72  t, protocol, &pr
7e80: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09  otocol);...}....
7e90: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7ea0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
7eb0: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
7ec0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7ed0: 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63  "Connection to c
7ee0: 61 72 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ard failed, retu
7ef0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7f00: 20 28 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29   (SCardConnect()
7f10: 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43   = %s/%li)", CAC
7f20: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
7f30: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
7f40: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20  card_conn_ret), 
7f50: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e  (long) scard_con
7f60: 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65 74 75  n_ret);.....retu
7f70: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7f80: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
7f90: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
7fa0: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b  d_connected = 1;
7fb0: 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
7fc0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
7fd0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
7fe0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
7ff0: 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72   = 0;...slot->pr
8000: 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f  otocol = protoco
8010: 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  l;..}...return(C
8020: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
8030: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
8040: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
8050: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67  y_ret cackey_beg
8060: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
8070: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8080: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
8090: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
80a0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
80b0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
80c0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
80d0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
80e0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
80f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
8100: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
8110: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
8120: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8130: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
8140: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
8150: 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
8160: 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 6d 69   should be termi
8170: 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 61 63  nated using "cac
8180: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
8190: 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  ion". *. */.stat
81a0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
81b0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
81c0: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
81d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
81e0: 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 63   {..cackey_ret c
81f0: 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a  ackey_conn_ret;.
8200: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e  .LONG scard_tran
8210: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  s_ret;...CACKEY_
8220: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
8230: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65  lled.");...cacke
8240: 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63  y_conn_ret = cac
8250: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
8260: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61 63  (slot);..if (cac
8270: 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20  key_conn_ret != 
8280: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8290: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
82a0: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
82b0: 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
82c0: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
82d0: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72  in error");....r
82e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
82f0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8300: 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
8310: 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09  tion_depth++;...
8320: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8330: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31 20  ction_depth > 1 
8340: 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  && !slot->transa
8350: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
8360: 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ck) {...CACKEY_D
8370: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 6c 72  EBUG_PRINTF("Alr
8380: 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e 73 61  eady in a transa
8390: 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e  ction, performin
83a0: 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77  g no action (new
83b0: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
83c0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
83d0: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75  _depth);....retu
83e0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
83f0: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  _OK);..}...slot-
8400: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
8410: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a  d_hw_lock = 0;..
8420: 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  .scard_trans_ret
8430: 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72 61   = SCardBeginTra
8440: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
8450: 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28  csc_card);..if (
8460: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
8470: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
8480: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
8490: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
84a0: 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61  ble to begin tra
84b0: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
84c0: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
84d0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
84e0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
84f0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
8500: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
8510: 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72  ssfully began tr
8520: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f  ansaction on slo
8530: 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70  t (%s)", slot->p
8540: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72  csc_reader);...r
8550: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8560: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
8570: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
8580: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
8590: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
85a0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
85b0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
85c0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
85d0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
85e0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
85f0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
8600: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
8610: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
8620: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8630: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
8640: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
8650: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8660: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
8670: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
8680: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
8690: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63 61  ion requires "ca
86a0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
86b0: 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61  action" to be ca
86c0: 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a  lled first. *. *
86d0: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
86e0: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
86f0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
8700: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8710: 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  lot) {..LONG sca
8720: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
8730: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8740: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8750: 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73  ..if (!slot->pcs
8760: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
8770: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
8780: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
8790: 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64  is not connected
87a0: 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  , unable to end 
87b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 63  transaction on c
87c0: 61 72 64 22 29 3b 0a 0a 09 09 69 66 20 28 73 6c  ard");....if (sl
87d0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
87e0: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
87f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8800: 4e 54 46 28 22 44 65 63 72 65 61 73 69 6e 67 20  NTF("Decreasing 
8810: 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 65 70 74  transaction dept
8820: 68 20 61 6e 64 20 61 73 6b 69 6e 67 20 66 6f 72  h and asking for
8830: 20 61 20 68 61 72 64 77 61 72 65 20 6c 6f 63 6b   a hardware lock
8840: 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 62 65 67   on the next beg
8850: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  in transaction (
8860: 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20  current depth = 
8870: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
8880: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
8890: 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
88a0: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a  ction_depth--;..
88b0: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
88c0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
88d0: 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e   0) {.....slot->
88e0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
88f0: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
8900: 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  .}...}....return
8910: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8920: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66  ENERIC);..}...if
8930: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
8940: 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29 20  ion_depth == 0) 
8950: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8960: 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e 61  _PRINTF("Termina
8970: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
8980: 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
8990: 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74  begun!");....ret
89a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
89b0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
89c0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
89d0: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66  on_depth--;...if
89e0: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
89f0: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
8a00: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8a10: 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63 74  PRINTF("Transact
8a20: 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70 72  ions still in pr
8a30: 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d  ogress, not term
8a40: 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20  inating on-card 
8a50: 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  Transaction (cur
8a60: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
8a70: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
8a80: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
8a90: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8aa0: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73  SC_S_OK);..}...s
8ab0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d  card_trans_ret =
8ac0: 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73 61 63   SCardEndTransac
8ad0: 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  tion(slot->pcsc_
8ae0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
8af0: 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28 73 63  E_CARD);..if (sc
8b00: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d  ard_trans_ret !=
8b10: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
8b20: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
8b30: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
8b40: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63  e to end transac
8b50: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20  tion, returning 
8b60: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72  in error");....r
8b70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8b80: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8b90: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8ba0: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
8bb0: 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64 20 74  lly terminated t
8bc0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c  ransaction on sl
8bd0: 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e  ot (%s)", slot->
8be0: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
8bf0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8c00: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20  SC_S_OK);.}../* 
8c10: 41 50 44 55 20 52 65 6c 61 74 65 64 20 46 75 6e  APDU Related Fun
8c20: 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20  ctions */./*. * 
8c30: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8c40: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8c50: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75  y_send_apdu(stru
8c60: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8c70: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
8c80: 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67  har class, unsig
8c90: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
8ca0: 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  tion, unsigned c
8cb0: 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64  har p1, unsigned
8cc0: 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e   char p2, unsign
8cd0: 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69  ed char lc, unsi
8ce0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
8cf0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
8d00: 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73  e, uint16_t *res
8d10: 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20  pcode, unsigned 
8d20: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20  char *respdata, 
8d30: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
8d40: 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  _len);. *. * ARG
8d50: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
8d60: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
8d70: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
8d80: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
8d90: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
8da0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73  signed char clas
8db0: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  s. *         APD
8dc0: 55 20 43 6c 61 73 73 20 28 47 53 43 49 53 5f 43  U Class (GSCIS_C
8dd0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f 72 20  LASS_ISO7816 or 
8de0: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
8df0: 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20  AL_PLATFORM. *  
8e00: 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 29 2c         usually),
8e10: 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20   (CLA). *. *    
8e20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
8e30: 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20  nstruction. *   
8e40: 20 20 20 20 20 20 41 50 44 55 20 49 6e 73 74 72        APDU Instr
8e50: 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a  uction (INS). *.
8e60: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
8e70: 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20 20 20  char p1. *      
8e80: 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65     APDU Paramete
8e90: 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20  r 1 (P1). *. *  
8ea0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8eb0: 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20 20 41   p2. *         A
8ec0: 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 32 20  PDU Parameter 2 
8ed0: 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  (P2). *. *     u
8ee0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 0a  nsigned char lc.
8ef0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
8f00: 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e  Length of Conten
8f10: 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73 20 69  t (Lc) -- this i
8f20: 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
8f30: 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20  "data". *       
8f40: 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20 49 66    parameter.  If
8f50: 20 22 64 61 74 61 22 20 69 73 20 73 70 65 63 69   "data" is speci
8f60: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
8f70: 69 73 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c  is parameter wil
8f80: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20  l. *         be 
8f90: 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20  ignored.. *. *  
8fa0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
8fb0: 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20   *data. *       
8fc0: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66    Pointer to buf
8fd0: 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20 49 74  fer to send.  It
8fe0: 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63 22 20   should be "Lc" 
8ff0: 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a  bytes long.  If.
9000: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
9010: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c  fied as NULL, "L
9020: 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  c" will not be s
9030: 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 62 75  ent, and this bu
9040: 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20  ffer will be. * 
9050: 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65 64 2e          ignored.
9060: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9070: 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a 20 20  ned char le. *  
9080: 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67         APDU Leng
9090: 74 68 20 6f 66 20 45 78 70 65 63 74 61 74 69 6f  th of Expectatio
90a0: 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73 20 69  n (Le) -- this i
90b0: 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
90c0: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 65  the. *         e
90d0: 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e 20 20  xpected reply.  
90e0: 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69  If this is speci
90f0: 66 69 65 64 20 61 73 20 30 20 74 68 65 6e 20 69  fied as 0 then i
9100: 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20  t will not. *   
9110: 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e 0a 20        be sent.. 
9120: 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f  *. *     uint16_
9130: 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20 20  t *respcode. *  
9140: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69         [OUT] Poi
9150: 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20  nter to storage 
9160: 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65  of APDU response
9170: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69 73 20   code.  If this 
9180: 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70  is. *         sp
9190: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
91a0: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 63 6f   the response co
91b0: 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61  de will be disca
91c0: 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  rded.. *. *     
91d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
91e0: 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20 20 20  espdata. *      
91f0: 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72     [OUT] Pointer
9200: 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41   to storage of A
9210: 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64 61 74  PDU response dat
9220: 61 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20  a.  If this is. 
9230: 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66  *         specif
9240: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65  ied as NULL, the
9250: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 77   response data w
9260: 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64  ill be discarded
9270: 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20  .  If. *        
9280: 20 74 68 65 20 22 72 65 73 70 64 61 74 61 5f 6c   the "respdata_l
9290: 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  en" parameter is
92a0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
92b0: 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65 72 0a  LL, this buffer.
92c0: 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20   *         will 
92d0: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2e 0a  not be updated..
92e0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
92f0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20   *respdata_len. 
9300: 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f  *         [IN, O
9310: 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69 74  UT] Pointer init
9320: 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  ialing containin
9330: 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  g the size of th
9340: 65 20 22 72 65 73 70 64 61 74 61 22 0a 20 2a 20  e "respdata". * 
9350: 20 20 20 20 20 20 20 20 62 75 66 66 65 72 2e 20          buffer. 
9360: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
9370: 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64 20 74  g, the pointed t
9380: 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64 61 74  o value is updat
9390: 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20 20 20  ed to the. *    
93a0: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 62       number of b
93b0: 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ytes written to 
93c0: 74 68 65 20 62 75 66 66 65 72 2e 20 20 49 66 20  the buffer.  If 
93d0: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
93e0: 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20 20 20  d as. *         
93f0: 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f  NULL, it will no
9400: 74 20 62 65 20 75 70 64 61 74 65 64 2c 20 61 6e  t be updated, an
9410: 64 20 22 72 65 73 70 64 61 74 61 22 20 77 69 6c  d "respdata" wil
9420: 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63 61 75  l be ignored cau
9430: 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20 20 20  sing. *         
9440: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74  the response dat
9450: 61 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  a to be discarde
9460: 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  d.. *. * RETURN 
9470: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
9480: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
9490: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
94a0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
94b0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
94c0: 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a       On error. *
94d0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
94e0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20  _E_TOKENABSENT  
94f0: 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67 20 66  If the sending f
9500: 61 69 6c 65 64 20 62 65 63 61 75 73 65 20 74 68  ailed because th
9510: 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20  e token is. *   
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 62 73               abs
9540: 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ent. *. * NOTES.
9550: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
9560: 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63  tion will connec
9570: 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43  t to the PC/SC C
9580: 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65  onnection Manage
9590: 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63  r via. *     cac
95a0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
95b0: 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a  () if needed.. *
95c0: 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20  . *     It will 
95d0: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63  connect to the c
95e0: 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65  ard in the reade
95f0: 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  r attached to th
9600: 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70  e slot. *     sp
9610: 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c  ecified.  It wil
9620: 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74  l reconnect to t
9630: 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63  he card if the c
9640: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20  onnection. *    
9650: 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20   goes away.. *. 
9660: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
9670: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
9680: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
9690: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
96a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
96b0: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
96c0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
96d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
96e0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
96f0: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
9700: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
9710: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
9720: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
9730: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
9740: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9750: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
9760: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   *respdata_len) 
9770: 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72  {..uint8_t major
9780: 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  _rc, minor_rc;..
9790: 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f  size_t bytes_to_
97a0: 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61  copy, tmp_respda
97b0: 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52  ta_len;..LPCSCAR
97c0: 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 6f  D_IO_REQUEST pio
97d0: 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 20  SendPci;..DWORD 
97e0: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44  protocol;..DWORD
97f0: 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f   xmit_len, recv_
9800: 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
9810: 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64  _xmit_ret, scard
9820: 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59  _reconn_ret;..BY
9830: 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34  TE xmit_buf[1024
9840: 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34  ], recv_buf[1024
9850: 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  ];..int pcsc_con
9860: 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67  nect_ret, pcsc_g
9870: 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74  etresp_ret;..int
9880: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
9890: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
98a0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
98b0: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
98c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
98d0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
98e0: 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  fied.");....retu
98f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
9900: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
9910: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
9920: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
9930: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
9940: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
9950: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
9960: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
9970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9980: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
9990: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
99a0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
99b0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
99c0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
99d0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  ERIC);..}.../* D
99e0: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70  etermine which p
99f0: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
9a00: 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68  using */..switch
9a10: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
9a20: 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ) {...case SCARD
9a30: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
9a40: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9a50: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
9a60: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43  break;...case SC
9a70: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a  ARD_PROTOCOL_T1:
9a80: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
9a90: 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a   SCARD_PCI_T1;..
9aa0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61  ...break;...defa
9ab0: 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ult:....CACKEY_D
9ac0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
9ad0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f  alid protocol fo
9ae0: 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29  und, aborting.")
9af0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
9b00: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9b10: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61  IC);..}.../* Tra
9b20: 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c  nsmit */..xmit_l
9b30: 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75  en = 0;..xmit_bu
9b40: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
9b50: 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66  class;..xmit_buf
9b60: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69  [xmit_len++] = i
9b70: 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69  nstruction;..xmi
9b80: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
9b90: 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75  ] = p1;..xmit_bu
9ba0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
9bb0: 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b  p2;..if (data) {
9bc0: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
9bd0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
9be0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
9bf0: 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b  x < lc; idx++) {
9c00: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
9c10: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b  t_len++] = data[
9c20: 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  idx];...}..}...i
9c30: 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b  f (le != 0x00) {
9c40: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
9c50: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d  _len++] = le;..}
9c60: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
9c70: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
9c80: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
9c90: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
9ca0: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73  lot);...if (clas
9cb0: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  s == GSCIS_CLASS
9cc0: 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74  _ISO7816 && inst
9cd0: 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53  ruction == GSCIS
9ce0: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26  _INSTR_VERIFY &&
9cf0: 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20 70   p1 == 0x00 && p
9d00: 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43  2 == 0x00) {...C
9d10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9d20: 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  TF("Sending APDU
9d30: 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29  : <<censored>>")
9d40: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
9d50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9d60: 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  BUF("Sending APD
9d70: 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  U:", xmit_buf, x
9d80: 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  mit_len);..}...r
9d90: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
9da0: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61  (recv_buf);..sca
9db0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
9dc0: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
9dd0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f  ->pcsc_card, pio
9de0: 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75  SendPci, xmit_bu
9df0: 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c  f, xmit_len, NUL
9e00: 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65  L, recv_buf, &re
9e10: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73  cv_len);...if (s
9e20: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
9e30: 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41   SCARD_E_NOT_TRA
9e40: 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43  NSACTED) {...CAC
9e50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9e60: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
9e70: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
9e80: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
9e90: 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61   %s/%lx), will a
9ea0: 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  sk calling funct
9eb0: 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f  ion to retry (no
9ec0: 74 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64  t resetting card
9ed0: 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  )...", CACKEY_DE
9ee0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
9ef0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
9f00: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
9f10: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
9f20: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a  xmit_ret);..../*
9f30: 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64   Begin Smartcard
9f40: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
9f50: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
9f60: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
9f70: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9f80: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a  _PCSC_E_RETRY);.
9f90: 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78  .}...if (scard_x
9fa0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
9fb0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
9fc0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9fd0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
9fe0: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
9ff0: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
a000: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
a010: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
a020: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
a030: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
a040: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
a050: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
a060: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
a070: 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e  G_PRINTF("Markin
a080: 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67  g slot as having
a090: 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09   been reset");..
a0a0: 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
a0b0: 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
a0c0: 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
a0d0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f  _ret == SCARD_W_
a0e0: 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09  RESET_CARD) {...
a0f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a100: 49 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75  INTF("Reset requ
a110: 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c  ired, please hol
a120: 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  d...");.....scar
a130: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  d_reconn_ret = c
a140: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
a150: 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44  card(slot, SCARD
a160: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
a170: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
a180: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
a190: 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f  ..if (scard_reco
a1a0: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
a1b0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
a1c0: 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f  ./* Update proto
a1d0: 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  col */.....slot-
a1e0: 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74  >protocol = prot
a1f0: 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74 63 68  ocol;.....switch
a200: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
a210: 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43  ) {......case SC
a220: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
a230: 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63  .......pioSendPc
a240: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
a250: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
a260: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
a270: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
a280: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
a290: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
a2a0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
a2b0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09  .default:.......
a2c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a2d0: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
a2e0: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74  tocol found, but
a2f0: 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20   too late to do 
a300: 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69  anything about i
a310: 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20  t now -- trying 
a320: 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09  anyway.");......
a330: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
a340: 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
a350: 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
a360: 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
a370: 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
a380: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
a390: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
a3a0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
a3b0: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
a3c0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
a3d0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
a3e0: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
a3f0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
a400: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
a410: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
a420: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
a430: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
a440: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a  ransmitting");..
a450: 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  ....recv_len = s
a460: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
a470: 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f  .....scard_xmit_
a480: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
a490: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
a4a0: 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c  ard, pioSendPci,
a4b0: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
a4c0: 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f  len, NULL, recv_
a4d0: 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b  buf, &recv_len);
a4e0: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
a4f0: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52  xmit_ret != SCAR
a500: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
a510: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a520: 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73  _PRINTF("Retrans
a530: 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75  mit failed, retu
a540: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
a550: 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63   after disconnec
a560: 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53  ting the card (S
a570: 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25  CardTransmit = %
a580: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
a590: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
a5a0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
a5b0: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  _xmit_ret), (lon
a5c0: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
a5d0: 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44  t);.......SCardD
a5e0: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
a5f0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
a600: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
a610: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
a620: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
a630: 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53  ;......./* End S
a640: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
a650: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f  tion */......slo
a660: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
a670: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63  epth = 1;......c
a680: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
a690: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
a6a0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
a6b0: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
a6c0: 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ENT);.....}....}
a6d0: 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
a6e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a6f0: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
a700: 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72  ard");......SCar
a710: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
a720: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
a730: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
a740: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
a750: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
a760: 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53  0;....../* End S
a770: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
a780: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  tion */.....slot
a790: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
a7a0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63  pth = 1;.....cac
a7b0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
a7c0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  ion(slot);......
a7d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a7e0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
a7f0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
a800: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
a810: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
a820: 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
a830: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
a840: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
a850: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
a860: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
a870: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
a880: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
a890: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  VE_CARD);....slo
a8a0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
a8b0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
a8c0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
a8d0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
a8e0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
a8f0: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
a900: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
a910: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
a920: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a930: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
a940: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
a950: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
a960: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
a970: 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
a980: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a990: 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64  INTBUF("Returned
a9a0: 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62   Value:", recv_b
a9b0: 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  uf, recv_len);..
a9c0: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
a9d0: 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61  2) {.../* Minima
a9e0: 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74  l response lengt
a9f0: 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65  h is 2 bytes, re
aa00: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
aa10: 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  re */...CACKEY_D
aa20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
aa30: 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ponse too small,
aa40: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
aa50: 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20  ilure (recv_len 
aa60: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
aa70: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
aa80: 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  n);..../* End Sm
aa90: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
aaa0: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
aab0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
aac0: 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  slot);....return
aad0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
aae0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
aaf0: 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c   Determine resul
ab00: 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72  t code */..major
ab10: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
ab20: 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d  ecv_len - 2];..m
ab30: 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  inor_rc = recv_b
ab40: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d  uf[recv_len - 1]
ab50: 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29  ;..if (respcode)
ab60: 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d   {...*respcode =
ab70: 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29   (major_rc << 8)
ab80: 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a   | minor_rc;..}.
ab90: 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73  ../* Adjust mess
aba0: 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72  age buffer */..r
abb0: 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09  ecv_len -= 2;...
abc0: 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20  /* Add bytes to 
abd0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
abe0: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
abf0: 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70  n = 0;..if (resp
ac00: 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61  data && respdata
ac10: 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65  _len) {...tmp_re
ac20: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65  spdata_len = *re
ac30: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62  spdata_len;....b
ac40: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a  ytes_to_copy = *
ac50: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
ac60: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
ac70: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
ac80: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
ac90: 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09  y = recv_len;...
aca0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
acb0: 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e  G_PRINTF("Copyin
acc0: 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74  g %lu bytes to t
acd0: 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27  he buffer (recv'
ace0: 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74  d %lu bytes, but
acf0: 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20   only %lu bytes 
ad00: 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66  left in our buff
ad10: 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  er)", (unsigned 
ad20: 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63  long) bytes_to_c
ad30: 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  opy, (unsigned l
ad40: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28  ong) recv_len, (
ad50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
ad60: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a  respdata_len);..
ad70: 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74  ..memcpy(respdat
ad80: 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74  a, recv_buf, byt
ad90: 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72  es_to_copy);...r
ada0: 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73  espdata += bytes
adb0: 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65  _to_copy;....*re
adc0: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74  spdata_len = byt
add0: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d  es_to_copy;...tm
ade0: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d  p_respdata_len -
adf0: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
ae00: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
ae10: 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20  (recv_len != 0) 
ae20: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
ae30: 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69  G_PRINTF("Throwi
ae40: 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65  ng away %lu byte
ae50: 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75  s, nowhere to pu
ae60: 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67  t them!", (unsig
ae70: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
ae80: 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  en);...}..}...if
ae90: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
aea0: 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65  61) {.../* We ne
aeb0: 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09  ed to READ */...
aec0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
aed0: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
aee0: 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09   required");....
aef0: 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20  if (minor_rc == 
af00: 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  0x00) {....minor
af10: 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  _rc = CACKEY_APD
af20: 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63  U_MTU;...}....pc
af30: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
af40: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
af50: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
af60: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
af70: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53  IS_INSTR_GET_RES
af80: 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30  PONSE, 0x00, 0x0
af90: 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f  0, 0, NULL, mino
afa0: 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20  r_rc, respcode, 
afb0: 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72  respdata, &tmp_r
afc0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
afd0: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
afe0: 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  p_ret != CACKEY_
aff0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
b000: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b010: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
b020: 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e   failed!  Return
b030: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b040: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
b050: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b060: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
b070: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b080: 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70  slot);.....if (p
b090: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
b0a0: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
b0b0: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65  _RETRY) {.....re
b0c0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b0d0: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a  _E_RETRY);....}.
b0e0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b0f0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
b100: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
b110: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
b120: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b  .*respdata_len +
b130: 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  = tmp_respdata_l
b140: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e  en;...}..../* En
b150: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b160: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
b170: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b180: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41  ion(slot);....CA
b190: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b1a0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
b1b0: 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20  success (buffer 
b1c0: 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29  read complete)")
b1d0: 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
b1e0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
b1f0: 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b200: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b210: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
b220: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
b230: 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  ;...if (major_rc
b240: 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a   == 0x90) {.../*
b250: 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41   Success */...CA
b260: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b270: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
b280: 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72  success (major_r
b290: 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09  c = 0x90)");....
b2a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b2b0: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09  SC_S_OK);..}....
b2c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b2d0: 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e  NTF("APDU Return
b2e0: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74  ed an error, ret
b2f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b300: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
b310: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
b320: 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  RIC);.}../*. * S
b330: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73  YNPOSIS. *     s
b340: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65  size_t cackey_re
b350: 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74  ad_buffer(struct
b360: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
b370: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
b380: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
b390: 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65  t count, unsigne
b3a0: 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73  d char t_or_v, s
b3b0: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
b3c0: 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  fset);. *. * ARG
b3d0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
b3e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
b3f0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
b400: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
b410: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
b420: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
b430: 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20  ar *buffer. *   
b440: 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66        [OUT] Buff
b450: 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  er. *. *     siz
b460: 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20  e_t count. *    
b470: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
b480: 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20  ytes to attempt 
b490: 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20  to read. *. *   
b4a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b4b0: 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20  t_or_v. *       
b4c0: 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62    Select the T-b
b4d0: 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d  uffer (01) or V-
b4e0: 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 72  buffer (02) to r
b4f0: 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20  ead from.  . *. 
b500: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69  *     size_t ini
b510: 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20  tial_offset. *  
b520: 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74         Specify t
b530: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67  he offset to beg
b540: 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d  in the read from
b550: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  . *. *. * RETURN
b560: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
b570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b580: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
b590: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
b5a0: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20   read, or -1 on 
b5b0: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54  error.. *. * NOT
b5c0: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
b5d0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
b5e0: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
b5f0: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
b600: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
b610: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
b620: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
b630: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
b640: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
b650: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
b660: 65 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  et) {..unsigned 
b670: 63 68 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65  char *init_buffe
b680: 72 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  r;..size_t init_
b690: 63 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69  count;..size_t i
b6a0: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
b6b0: 65 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66  et;...size_t off
b6c0: 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66  set = 0, max_off
b6d0: 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  set, max_count;.
b6e0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
b6f0: 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74  md[2];..uint16_t
b700: 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20   respcode;..int 
b710: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
b720: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b730: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e  "Called.");...in
b740: 69 74 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66  it_buffer = buff
b750: 65 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20  er;..init_count 
b760: 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69  = count;..init_i
b770: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20  nitial_offset = 
b780: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a  initial_offset;.
b790: 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63  ..max_offset = c
b7a0: 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74  ount;..max_count
b7b0: 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
b7c0: 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76  TU;...if (t_or_v
b7d0: 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20   != 1 && t_or_v 
b7e0: 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 2) {...CACKEY
b7f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
b800: 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61  nvalid T or V pa
b810: 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
b820: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
b830: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
b840: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63  turn(-1);..}...c
b850: 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a  md[0] = t_or_v;.
b860: 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09  ..while (1) {...
b870: 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61  if (offset >= ma
b880: 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43  x_offset) {....C
b890: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b8a0: 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73  TF("Buffer too s
b8b0: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
b8c0: 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29  what we got...")
b8d0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
b8e0: 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
b8f0: 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b  offset - offset;
b900: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d  ...if (count > m
b910: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63  ax_count) {....c
b920: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74  ount = max_count
b930: 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20  ;...}....cmd[1] 
b940: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64  = count;....send
b950: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
b960: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
b970: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
b980: 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53  _PLATFORM, GSCIS
b990: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46  _INSTR_READ_BUFF
b9a0: 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66  ER, ((initial_of
b9b0: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e  fset + offset) >
b9c0: 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e  > 8) & 0xff, (in
b9d0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
b9e0: 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20 73  ffset) & 0xff, s
b9f0: 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c  izeof(cmd), cmd,
ba00: 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65   0x00, &respcode
ba10: 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65  , buffer + offse
ba20: 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69  t, &count);....i
ba30: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
ba40: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
ba50: 52 59 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  RY) {....CACKEY_
ba60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
ba70: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
ba80: 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64  d, retrying read
ba90: 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72   buffer");.....r
baa0: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61  eturn(cackey_rea
bab0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69  d_buffer(slot, i
bac0: 6e 69 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74  nit_buffer, init
bad0: 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20  _count, t_or_v, 
bae0: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
baf0: 73 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  set));...}....if
bb00: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
bb10: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
bb20: 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64  {....if (respcod
bb30: 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09  e == 0x6A86) {..
bb40: 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74  ...if (max_count
bb50: 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72   == 1) {......br
bb60: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
bb70: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  max_count = max_
bb80: 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09  count / 2;......
bb90: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
bba0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bbb0: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
bbc0: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
bbd0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
bbe0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72  failure");.....r
bbf0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
bc00: 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e  ..offset += coun
bc10: 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20  t;....if (count 
bc20: 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09  < max_count) {..
bc30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bc40: 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61  RINTF("Short rea
bc50: 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c  d -- count = %i,
bc60: 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28   cmd[1] = %i", (
bc70: 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74  int) count, (int
bc80: 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62  ) cmd[1]);.....b
bc90: 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69  reak;...}..}..#i
bca0: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
bcb0: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
bcc0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
bcd0: 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f  if (offset > _PO
bce0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
bcf0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bd00: 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65  PRINTF("Offset e
bd10: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
bd20: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
bd30: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
bd40: 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d   = %li, offset =
bd50: 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
bd60: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
bd70: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
bd80: 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74   offset);....ret
bd90: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
bda0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ndif.#endif...CA
bdb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bdc0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
bdd0: 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c  success, read %l
bde0: 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67  u bytes", (unsig
bdf0: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
be00: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73  );...return(offs
be10: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
be20: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
be30: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
be40: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74  select_applet(st
be50: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
be60: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
be70: 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65   char *aid, size
be80: 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a  _t aid_len);. *.
be90: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
bea0: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
beb0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
bec0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
bed0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
bee0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
bef0: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a  ned char *aid. *
bf00: 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72 20           Buffer 
bf10: 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65  containing Apple
bf20: 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20  t ID to select. 
bf30: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
bf40: 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  aid_len. *      
bf50: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
bf60: 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 20  es in the "aid" 
bf70: 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 61  (Applet ID) para
bf80: 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55  meter. *. * RETU
bf90: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
bfa0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
bfb0: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
bfc0: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
bfd0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
bfe0: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
bff0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
c000: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
c010: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
c020: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
c030: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
c040: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
c050: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
c060: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
c070: 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74   {..int send_ret
c080: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
c090: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
c0a0: 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
c0b0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c  UG_PRINTBUF("Sel
c0c0: 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c  ecting applet:",
c0d0: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a   aid, aid_len);.
c0e0: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
c0f0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
c100: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
c110: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
c120: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43  NSTR_SELECT, GSC
c130: 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f  IS_PARAM_SELECT_
c140: 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69  APPLET, 0x00, ai
c150: 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30  d_len, aid, 0x00
c160: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
c170: 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f  LL);...if (send_
c180: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
c190: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
c1a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c1b0: 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
c1c0: 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69  g failed, retryi
c1d0: 6e 67 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74  ng select applet
c1e0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61  ");....return(ca
c1f0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
c200: 65 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69  et(slot, aid, ai
c210: 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66  d_len));..}...if
c220: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
c230: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
c240: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c250: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
c260: 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20  to open applet, 
c270: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
c280: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
c290: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
c2a0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
c2b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c2c0: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
c2d0: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29   selected file")
c2e0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
c2f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
c300: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c310: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
c320: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
c330: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
c340: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
c350: 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a  int16_t ef);. *.
c360: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
c370: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
c380: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
c390: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
c3a0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
c3b0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31  . *. *     uint1
c3c0: 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20  6_t ef. *       
c3d0: 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65    Elemental File
c3e0: 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a   to select. *. *
c3f0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
c400: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
c410: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
c420: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
c430: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
c440: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
c450: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
c460: 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 74       This select
c470: 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20  s an Elementary 
c480: 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20  File (EF) under 
c490: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65  the currently se
c4a0: 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65  lected. *     De
c4b0: 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 46  dicated File (DF
c4c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69  ). *. *     Typi
c4d0: 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61  cally this is ca
c4e0: 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 63  lled after selec
c4f0: 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74  ting the correct
c500: 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20   Applet (using. 
c510: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c  *     cackey_sel
c520: 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20  ect_applet) for 
c530: 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a  VM cards. *. */.
c540: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
c550: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
c560: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
c570: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
c580: 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75  int16_t ef) {..u
c590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 64  nsigned char fid
c5a0: 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65  _buf[2];..int se
c5b0: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
c5c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
c5d0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f  alled.");.../* O
c5e0: 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61  pen the elementa
c5f0: 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f  ry file */..fid_
c600: 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20  buf[0] = (ef >> 
c610: 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f  8) & 0xff;..fid_
c620: 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78  buf[1] = ef & 0x
c630: 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ff;...CACKEY_DEB
c640: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63  UG_PRINTF("Selec
c650: 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78  ting file: %04lx
c660: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
c670: 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72  g) ef);...send_r
c680: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
c690: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
c6a0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
c6b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
c6c0: 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c  ECT, 0x02, 0x0C,
c6d0: 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29   sizeof(fid_buf)
c6e0: 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c  , fid_buf, 0x00,
c6f0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
c700: 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  L);..if (send_re
c710: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
c720: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
c730: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c740: 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66  Failed to open f
c750: 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ile, returning i
c760: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
c770: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
c780: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
c790: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
c7a0: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
c7b0: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
c7c0: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
c7d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
c7e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c7f0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
c800: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76   cackey_free_tlv
c810: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  (struct cackey_t
c820: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29  lv_entity *root)
c830: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
c840: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
c850: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
c860: 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20  y *root. *      
c870: 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54     Root of the T
c880: 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74  LV list to start
c890: 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52   freeing. *. * R
c8a0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
c8b0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f     None. *. * NO
c8c0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
c8d0: 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74  function frees t
c8e0: 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69  he TLV linked li
c8f0: 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 72  sted returned fr
c900: 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65  om. *     "cacke
c910: 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20  y_read_tlv". *. 
c920: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c930: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
c940: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
c950: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b  _entity *root) {
c960: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
c970: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
c980: 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72  , *next;...if (r
c990: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
c9a0: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
c9b0: 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20  r (curr = root; 
c9c0: 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78  curr; curr = nex
c9d0: 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75  t) {...next = cu
c9e0: 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77  rr->_next;....sw
c9f0: 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29  itch (curr->tag)
ca00: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
ca10: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
ca20: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ca30: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
ca40: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
ca50: 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  ue) {......free(
ca60: 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09  curr->value);...
ca70: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
ca80: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
ca90: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66  _CARDURL:.....if
caa0: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61   (curr->value_ca
cab0: 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72  rdurl) {......fr
cac0: 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  ee(curr->value_c
cad0: 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09  ardurl);.....}..
cae0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
caf0: 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a  .free(curr);..}.
cb00: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
cb10: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
cb20: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
cb30: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
cb40: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
cb50: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
cb60: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
cb70: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
cb80: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
cb90: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
cba0: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
cbb0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
cbc0: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75  t *slot) {..stru
cbd0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
cbe0: 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74  tity *curr_entit
cbf0: 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c  y, *root = NULL,
cc00: 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09   *last = NULL;..
cc10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c  unsigned char tl
cc20: 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f  en_buf[2], tval_
cc30: 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c  buf[1024], *tval
cc40: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
cc50: 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76   vlen_buf[2], vv
cc60: 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76  al_buf[8192], *v
cc70: 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  val;..unsigned c
cc80: 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e  har *tmpbuf;..un
cc90: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62  signed long tmpb
cca0: 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20  uflen;..ssize_t 
ccb0: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
ccc0: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
ccd0: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
cce0: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
ccf0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
cd00: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
cd10: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
cd20: 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63  VE_LIBZ..int unc
cd30: 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e  ompress_ret;.#en
cd40: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
cd50: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
cd60: 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74  d.");...read_ret
cd70: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
cd80: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e  uffer(slot, tlen
cd90: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65  _buf, sizeof(tle
cda0: 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65  n_buf), 1, offse
cdb0: 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_t);..if (read_
cdc0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c  ret != sizeof(tl
cdd0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
cde0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cdf0: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
ce00: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ce10: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
ce20: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65  (NULL);..}...tle
ce30: 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d  n = (tlen_buf[1]
ce40: 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75   << 8) | tlen_bu
ce50: 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74  f[0];...read_ret
ce60: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
ce70: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e  uffer(slot, vlen
ce80: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65  _buf, sizeof(vle
ce90: 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65  n_buf), 2, offse
cea0: 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_v);..if (read_
ceb0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c  ret != sizeof(vl
cec0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
ced0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cee0: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
cef0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
cf00: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
cf10: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65  (NULL);..}...vle
cf20: 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d  n = (vlen_buf[1]
cf30: 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75   << 8) | vlen_bu
cf40: 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  f[0];...CACKEY_D
cf50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
cf60: 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56   Length = %lu, V
cf70: 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c  alue Length = %l
cf80: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
cf90: 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67  ng) tlen, (unsig
cfa0: 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b  ned long) vlen);
cfb0: 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32  ...offset_t += 2
cfc0: 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32  ;..offset_v += 2
cfd0: 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73  ;...if (tlen > s
cfe0: 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29  izeof(tval_buf))
cff0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d000: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65  G_PRINTF("Tag le
d010: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
d020: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
d030: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
d040: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
d050: 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65  .if (vlen > size
d060: 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(vval_buf)) {.
d070: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d080: 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e  RINTF("Value len
d090: 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  gth is too large
d0a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d0b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
d0c0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
d0d0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
d0e0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
d0f0: 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c  ot, tval_buf, tl
d100: 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29  en, 1, offset_t)
d110: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
d120: 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43  != tlen) {...CAC
d130: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d140: 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64  ("Unable to read
d150: 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72   entire T-buffer
d160: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d170: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
d180: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
d190: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
d1a0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
d1b0: 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c  ot, vval_buf, vl
d1c0: 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29  en, 2, offset_v)
d1d0: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
d1e0: 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43  != vlen) {...CAC
d1f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d200: 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64  ("Unable to read
d210: 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72   entire V-buffer
d220: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d230: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
d240: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
d250: 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b  tval = tval_buf;
d260: 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75  ..vval = vval_bu
d270: 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20  f;..while (tlen 
d280: 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29  > 0 && vlen > 0)
d290: 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c   {...tag = *tval
d2a0: 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c  ;...tval++;...tl
d2b0: 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76  en--;....if (*tv
d2c0: 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09  al == 0xff) {...
d2d0: 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b  .length = (tval[
d2e0: 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b  2] << 8) | tval[
d2f0: 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33  1];....tval += 3
d300: 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a  ;....tlen -= 3;.
d310: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65  ..} else {....le
d320: 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09  ngth = *tval;...
d330: 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e  .tval++;....tlen
d340: 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  --;...}....CACKE
d350: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d360: 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c  Tag: %s (%02x)",
d370: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
d380: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61  NC_TAG_TO_STR(ta
d390: 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  g), (unsigned in
d3a0: 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45  t) tag);...CACKE
d3b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
d3c0: 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c  ("Value:", vval,
d3d0: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72   length);....cur
d3e0: 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  r_entity = NULL;
d3f0: 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29 20  ...switch (tag) 
d400: 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  {....case GSCIS_
d410: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
d420: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
d430: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
d440: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  rr_entity));....
d450: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
d460: 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61  lue_cardurl = ma
d470: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
d480: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
d490: 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09  cardurl));......
d4a0: 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69  memcpy(curr_enti
d4b0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
d4c0: 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29  l->rid, vval, 5)
d4d0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
d4e0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
d4f0: 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c  ->apptype = vval
d500: 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [5];.....curr_en
d510: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
d520: 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20  url->objectid = 
d530: 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c  (vval[6] << 8) |
d540: 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75   vval[7];.....cu
d550: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
d560: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20  _cardurl->appid 
d570: 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29  = (vval[8] << 8)
d580: 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09   | vval[9];.....
d590: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
d5a0: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
d5b0: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
d5c0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
d5d0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
d5e0: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a  S_TAG_ACR_TABLE:
d5f0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
d600: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
d610: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
d620: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
d630: 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09  lloc(length);...
d640: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
d650: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
d660: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
d670: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
d680: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c  ..curr_entity->l
d690: 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a  ength = length;.
d6a0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
d6b0: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
d6c0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
d6d0: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
d6e0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
d6f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
d700: 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63  RTIFICATE:.....c
d710: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
d720: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
d730: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64  _entity));..#ifd
d740: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09  ef HAVE_LIBZ....
d750: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
d760: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70  gth * 2;.....tmp
d770: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
d780: 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e  buflen);......un
d790: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75  compress_ret = u
d7a0: 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66  ncompress(tmpbuf
d7b0: 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76  , &tmpbuflen, vv
d7c0: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
d7d0: 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
d7e0: 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09  ret != Z_OK) {..
d7f0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d800: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
d810: 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75  to decompress, u
d820: 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75  ncompress() retu
d830: 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72  rned %i -- resor
d840: 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63  ting to direct c
d850: 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73  opy", uncompress
d860: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70  _ret);.......tmp
d870: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
d880: 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ......memcpy(tmp
d890: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
d8a0: 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  h);.....}......C
d8b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d8c0: 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73  TBUF("Decompress
d8d0: 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c  ed to:", tmpbuf,
d8e0: 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c   tmpbuflen);.#el
d8f0: 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  se.....CACKEY_DE
d900: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73  BUG_PRINTF("Miss
d910: 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74  ing ZLIB Support
d920: 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61  , this certifica
d930: 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65  te is likely use
d940: 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09  less...");......
d950: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67  tmpbuflen = leng
d960: 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  th;.....memcpy(t
d970: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
d980: 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09  gth);.#endif....
d990: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
d9a0: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
d9b0: 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74  rr_entity->lengt
d9c0: 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  h = tmpbuflen;..
d9d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d9e0: 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a  value = tmpbuf;.
d9f0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
da00: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
da10: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
da20: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  se GSCIS_TAG_PKC
da30: 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  S15:.....curr_en
da40: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
da50: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
da60: 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  y));......curr_e
da70: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
da80: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
da90: 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20  y->value_byte = 
daa0: 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72  vval[0];.....cur
dab0: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
dac0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
dad0: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20  ak;...}....vval 
dae0: 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65  += length;...vle
daf0: 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09  n -= length;....
db00: 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20  if (curr_entity 
db10: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  != NULL) {....if
db20: 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (root == NULL) 
db30: 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72  {.....root = cur
db40: 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a  r_entity;....}..
db50: 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e  ...if (last != N
db60: 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d  ULL) {.....last-
db70: 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e  >_next = curr_en
db80: 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c  tity;....}.....l
db90: 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ast = curr_entit
dba0: 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  y;...}..}...retu
dbb0: 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(root);.}../*.
dbc0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
dbd0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
dbe0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
dbf0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
dc00: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
dc10: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
dc20: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
dc30: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
dc40: 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 75  _free_certs(stru
dc50: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
dc60: 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20  dentity *start, 
dc70: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e  size_t count, in
dc80: 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a  t free_start) {.
dc90: 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69  .size_t idx;...i
dca0: 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (start == NULL
dcb0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
dcc0: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
dcd0: 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64   idx < count; id
dce0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61  x++) {...if (sta
dcf0: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
dd00: 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73  ate) {....free(s
dd10: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
dd20: 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  icate);...}..}..
dd30: 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74 29  .if (free_start)
dd40: 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74 29   {...free(start)
dd50: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
dd60: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
dd70: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
dd80: 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70  tity *cackey_cop
dd90: 79 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63  y_certs(struct c
dda0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
ddb0: 69 74 79 20 2a 64 65 73 74 2c 20 73 74 72 75 63  ity *dest, struc
ddc0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
ddd0: 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73  entity *start, s
dde0: 69 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09  ize_t count) {..
ddf0: 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66  size_t idx;...if
de00: 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (start == NULL)
de10: 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c   {...return(NULL
de20: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 74  );..}...if (dest
de30: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65   == NULL) {...de
de40: 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  st = malloc(size
de50: 6f 66 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e  of(*dest) * coun
de60: 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  t);..}...for (id
de70: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75  x = 0; idx < cou
de80: 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d  nt; idx++) {...m
de90: 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e  emcpy(dest[idx].
dea0: 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64  applet, start[id
deb0: 78 5d 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  x].applet, sizeo
dec0: 66 28 64 65 73 74 5b 69 64 78 5d 2e 61 70 70 6c  f(dest[idx].appl
ded0: 65 74 29 29 3b 0a 09 09 64 65 73 74 5b 69 64 78  et));...dest[idx
dee0: 5d 2e 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69  ].file = start[i
def0: 64 78 5d 2e 66 69 6c 65 3b 0a 09 09 64 65 73 74  dx].file;...dest
df00: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
df10: 65 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69 64  e_len = start[id
df20: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
df30: 65 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e  en;...dest[idx].
df40: 6b 65 79 73 69 7a 65 20 3d 20 73 74 61 72 74 5b  keysize = start[
df50: 69 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09  idx].keysize;...
df60: 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69  .dest[idx].certi
df70: 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
df80: 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
df90: 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65  icate_len);...me
dfa0: 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63  mcpy(dest[idx].c
dfb0: 65 72 74 69 66 69 63 61 74 65 2c 20 73 74 61 72  ertificate, star
dfc0: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
dfd0: 74 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63 65  te, dest[idx].ce
dfe0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
dff0: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65 73 74  .}...return(dest
e000: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
e010: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
e020: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e030: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
e040: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
e050: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
e060: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
e070: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74   *. */.static st
e080: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
e090: 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
e0a0: 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74 72  y_read_certs(str
e0b0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e0c0: 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61  *slot, struct ca
e0d0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
e0e0: 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67  ty *certs, unsig
e0f0: 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29  ned long *count)
e100: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
e110: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
e120: 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63  *curr_id;..struc
e130: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e140: 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63  ity *ccc_tlv, *c
e150: 63 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c  cc_curr, *app_tl
e160: 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75  v, *app_curr;..u
e170: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 63  nsigned char ccc
e180: 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f  _aid[] = {GSCIS_
e190: 41 49 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67  AID_CCC};..unsig
e1a0: 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69  ned char curr_ai
e1b0: 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  d[7];..unsigned 
e1c0: 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b  long outidx = 0;
e1d0: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61  ..cackey_ret tra
e1e0: 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69  nsaction_ret;..i
e1f0: 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62  nt certs_resizab
e200: 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  le;..int send_re
e210: 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a  t, select_ret;..
e220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e230: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
e240: 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20  ...if (count == 
e250: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
e260: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
e270: 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65  ount is NULL, re
e280: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e290: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e2a0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
e2b0: 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  certs != NULL) {
e2c0: 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d  ...if (*count ==
e2d0: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
e2e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e2f0: 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72  quested we retur
e300: 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f  n 0 objects, sho
e310: 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09  rt-circuit");...
e320: 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b  ..return(certs);
e330: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 73  ...}..}...if (!s
e340: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29  lot->slot_reset)
e350: 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63   {...if (slot->c
e360: 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09  ached_certs) {..
e370: 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
e380: 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72 74 73  ULL) {.....certs
e390: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
e3a0: 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d  (*certs) * slot-
e3b0: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
e3c0: 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f 75 6e 74  unt);.....*count
e3d0: 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   = slot->cached_
e3e0: 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09  certs_count;....
e3f0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
e400: 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d   (*count > slot-
e410: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
e420: 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  unt) {......*cou
e430: 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65  nt = slot->cache
e440: 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09  d_certs_count;..
e450: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
e460: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
e470: 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63  certs, slot->cac
e480: 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e  hed_certs, *coun
e490: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  t);.....return(c
e4a0: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
e4b0: 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  if (slot->cached
e4c0: 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61 63 6b  _certs) {...cack
e4d0: 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 6c  ey_free_certs(sl
e4e0: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
e4f0: 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  , slot->cached_c
e500: 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a  erts_count, 1);.
e510: 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  ...slot->cached_
e520: 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  certs = NULL;..}
e530: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
e540: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
e550: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
e560: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
e570: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
e580: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
e590: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
e5a0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
e5b0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
e5c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
e5d0: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
e5e0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
e5f0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e600: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e610: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
e620: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
e630: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
e640: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
e650: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
e660: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
e670: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
e680: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
e690: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
e6a0: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
e6b0: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
e6c0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
e6d0: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
e6e0: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
e6f0: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
e700: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
e710: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
e720: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e730: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
e740: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
e750: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
e760: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20  ailure");..../* 
e770: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
e780: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
e790: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
e7a0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
e7b0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e7c0: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64  L);..}.../* Read
e7d0: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
e7e0: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
e7f0: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20  TLV */..ccc_tlv 
e800: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
e810: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f  v(slot);.../* Lo
e820: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20  ok for CARDURLs 
e830: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20  that coorespond 
e840: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a  to PKI applets *
e850: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  /..for (ccc_curr
e860: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
e870: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
e880: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
e890: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e8a0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
e8b0: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20   tag: %s ... ", 
e8c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
e8d0: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63  C_TAG_TO_STR(ccc
e8e0: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09  _curr->tag));...
e8f0: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74  .if (ccc_curr->t
e900: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
e910: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41  CARDURL) {....CA
e920: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e930: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
e940: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
e950: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
e960: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  s)");.....contin
e970: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
e980: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
e990: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
e9a0: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
e9b0: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
e9c0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
e9d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e9e0: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
e9f0: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
ea00: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
ea10: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
ea20: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
ea30: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
ea40: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
ea50: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
ea60: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
ea70: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
ea80: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
ea90: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
eaa0: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
eab0: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
eac0: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
ead0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
eae0: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
eaf0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
eb00: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
eb10: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
eb20: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b  l->rid));...CACK
eb30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb40: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
eb50: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
eb60: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
eb70: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
eb80: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
eb90: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
eba0: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
ebb0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
ebc0: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  id);...CACKEY_DE
ebd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65  BUG_PRINTF("Obje
ebe0: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ctID = %s/%04lx"
ebf0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
ec00: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
ec10: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
ec20: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
ec30: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
ec40: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
ec50: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
ec60: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63  jectid);....memc
ec70: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
ec80: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
ec90: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
eca0: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
ecb0: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
ecc0: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ;...curr_aid[siz
ecd0: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
ece0: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
ecf0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
ed00: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
ed10: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69  f;...curr_aid[si
ed20: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
ed30: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e   1] = ccc_curr->
ed40: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
ed50: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09  ppid & 0xff;....
ed60: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
ed70: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
ed80: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
ed90: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
eda0: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64  t(slot, curr_aid
edb0: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  , sizeof(curr_ai
edc0: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  d));...if (selec
edd0: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
ede0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
edf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ee00: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
ee10: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
ee20: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
ee30: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
ee40: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
ee50: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20  ;...}..../* ... 
ee60: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
ee70: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65  ) */...select_re
ee80: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
ee90: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
eea0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
eeb0: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
eec0: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
eed0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
eee0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
eef0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ef00: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
ef10: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
ef20: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
ef30: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
ef40: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
ef50: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .../* Process th
ef60: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f  is file's TLV lo
ef70: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  oking for certif
ef80: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f  icates */...app_
ef90: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
efa0: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
efb0: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20  for (app_curr = 
efc0: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72  app_tlv; app_cur
efd0: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r; app_curr = ap
efe0: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  p_curr->_next) {
eff0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f000: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
f010: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
f020: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
f030: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
f040: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70  tag));....if (ap
f050: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  p_curr->tag != G
f060: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
f070: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b  CATE) {.....CACK
f080: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f090: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
f0a0: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
f0b0: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41   about CERTIFICA
f0c0: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e  TEs)");......con
f0d0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
f0e0: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
f0f0: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
f100: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70  idx++;.....memcp
f110: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  y(curr_id->apple
f120: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
f130: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
f140: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69  let));....curr_i
f150: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  d->file = ccc_cu
f160: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
f170: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
f180: 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65  curr_id->keysize
f190: 20 3d 20 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45   = -1;.....CACKE
f1a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f1b0: 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
f1c0: 3e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74  >applet (%p) wit
f1d0: 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63  h %lu bytes:", c
f1e0: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
f1f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f200: 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
f210: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 43 41 43  applet));....CAC
f220: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
f230: 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f  UF("VAL:", curr_
f240: 69 64 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65  id->applet, size
f250: 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  of(curr_id->appl
f260: 65 74 29 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  et));.....curr_i
f270: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
f280: 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c  en = app_curr->l
f290: 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f  ength;.....curr_
f2a0: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
f2b0: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
f2c0: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
f2d0: 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
f2e0: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
f2f0: 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61  te, app_curr->va
f300: 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  lue, curr_id->ce
f310: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
f320: 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e  ....if (outidx >
f330: 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  = *count) {.....
f340: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
f350: 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  ble) {......*cou
f360: 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65  nt *= 2;......ce
f370: 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
f380: 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
f390: 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
f3a0: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
f3b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
f3c0: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
f3d0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f  ey_free_tlv(app_
f3e0: 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74  tlv);....if (out
f3f0: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
f400: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
f410: 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  }...cackey_free_
f420: 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09  tlv(ccc_tlv);...
f430: 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
f440: 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
f450: 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
f460: 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
f470: 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
f480: 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
f490: 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  }...slot->cached
f4a0: 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f  _certs = cackey_
f4b0: 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c  copy_certs(NULL,
f4c0: 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b   certs, *count);
f4d0: 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
f4e0: 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f  erts_count = *co
f4f0: 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  unt;.../* Termin
f500: 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
f510: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
f520: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
f530: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65  tion(slot);...re
f540: 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a  turn(certs);.}..
f550: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
f560: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
f570: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
f580: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
f590: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
f5a0: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
f5b0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
f5c0: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
f5d0: 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
f5e0: 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  pt(struct cackey
f5f0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
f600: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
f610: 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
f620: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
f630: 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  f, size_t buflen
f640: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
f650: 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20  *outbuf, size_t 
f660: 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70  outbuflen, int p
f670: 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70  adInput, int unp
f680: 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 75 6e 73  adOutput) {..uns
f690: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62  igned char *tmpb
f6a0: 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a  uf, *tmpbuf_s, *
f6b0: 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67  outbuf_s;..unsig
f6c0: 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f 74  ned char bytes_t
f6d0: 6f 5f 73 65 6e 64 2c 20 70 31 3b 0a 09 75 6e 73  o_send, p1;..uns
f6e0: 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b  igned char block
f6f0: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65  type;..cackey_re
f700: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
f710: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
f720: 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20  .ssize_t retval 
f730: 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74  = 0, unpadoffset
f740: 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
f750: 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70  len, padlen, tmp
f760: 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  outbuflen;..int 
f770: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
f780: 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b  ..int le;...CACK
f790: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f7a0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
f7b0: 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
f7c0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
f7d0: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
f7e0: 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b   slot is NULL");
f7f0: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
f800: 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20  .}...if (buf == 
f810: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
f820: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f830: 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55  rror.  buf is NU
f840: 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
f850: 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75  -1);..}...if (ou
f860: 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tbuf == NULL) {.
f870: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f880: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f  RINTF("Error.  o
f890: 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b  utbuf is NULL");
f8a0: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
f8b0: 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  .}...if (identit
f8c0: 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
f8d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f8e0: 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
f8f0: 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tity is NULL");.
f900: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
f910: 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
f920: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
f930: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
f940: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f950: 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
f960: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
f970: 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
f980: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
f990: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64  ./* Determine id
f9a0: 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20  entity Key size 
f9b0: 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  */..if (identity
f9c0: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
f9d0: 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a  >keysize < 0) {.
f9e0: 09 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  ..identity->pcsc
f9f0: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
fa00: 7a 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79  ze = x509_to_key
fa10: 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70  size(identity->p
fa20: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
fa30: 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74  rtificate, ident
fa40: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
fa50: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
fa60: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61  len);..}.../* Pa
fa70: 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79  d message to key
fa80: 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61   size */..if (pa
fa90: 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28  dInput) {...if (
faa0: 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
fab0: 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
fac0: 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62   > 0) {....if (b
fad0: 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74  uflen != identit
fae0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
faf0: 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09  ->keysize) {....
fb00: 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69  .if (buflen > (i
fb10: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
fb20: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
fb30: 2b 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43  + 3)) {......CAC
fb40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fb50: 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67  ("Error.  Messag
fb60: 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  e is too large t
fb70: 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29  o sign/decrypt")
fb80: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ;.......return(-
fb90: 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74  1);.....}......t
fba0: 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74  mpbuflen = ident
fbb0: 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
fbc0: 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09  ty->keysize;....
fbd0: 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
fbe0: 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09  (tmpbuflen);....
fbf0: 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31  .free_tmpbuf = 1
fc00: 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20  ;......padlen = 
fc10: 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c  tmpbuflen - bufl
fc20: 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20  en - 3;....../* 
fc30: 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d  RSA PKCS#1 EMSA-
fc40: 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69  PKCS1-v1_5 Paddi
fc50: 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66  ng */.....tmpbuf
fc60: 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  [0] = 0x00;.....
fc70: 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31  tmpbuf[1] = 0x01
fc80: 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d  ;.....memset(&tm
fc90: 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70  pbuf[2], 0xFF, p
fca0: 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62  adlen);.....tmpb
fcb0: 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20  uf[padlen + 2]= 
fcc0: 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79  0x00;.....memcpy
fcd0: 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  (&tmpbuf[padlen 
fce0: 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65  + 3], buf, bufle
fcf0: 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  n);......CACKEY_
fd00: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
fd10: 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c  Unpadded:", buf,
fd20: 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41   buflen);.....CA
fd30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fd40: 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74  BUF("Padded:", t
fd50: 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
fd60: 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  );....} else {..
fd70: 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
fd80: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
fd90: 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65   buflen;.....fre
fda0: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
fdb0: 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
fdc0: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
fdd0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fde0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
fdf0: 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69  determine key si
fe00: 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d  ze, hoping the m
fe10: 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72  essage is proper
fe20: 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09  ly padded!");...
fe30: 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
fe40: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
fe50: 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74  uflen;....free_t
fe60: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61  mpbuf = 0;....pa
fe70: 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  dlen = 0;...}..}
fe80: 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66   else {...tmpbuf
fe90: 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66   = buf;...tmpbuf
fea0: 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
feb0: 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
fec0: 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
fed0: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61  }.../* Begin tra
fee0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
fef0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
ff00: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f  ction(slot);.../
ff10: 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
ff20: 20 61 70 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b   applet */..CACK
ff30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ff40: 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65  "Selecting apple
ff50: 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e  t found at %p ..
ff60: 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  .", identity->pc
ff70: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
ff80: 6c 65 74 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65  let);..cackey_se
ff90: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
ffa0: 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
ffb0: 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65  _identity->apple
ffc0: 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69  t, sizeof(identi
ffd0: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
ffe0: 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f  y->applet));.../
fff0: 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74  * Select correct
10000 20 66 69 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79   file */..cackey
10010 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f  _select_file(slo
10020 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
10030 63 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65  c_identity->file
10040 29 3b 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20  );...tmpbuf_s = 
10050 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f  tmpbuf;..outbuf_
10060 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 69  s = outbuf;..whi
10070 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b  le (tmpbuflen) {
10080 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e  ...if (tmpbuflen
10090 20 3e 20 32 34 35 29 20 7b 0a 09 09 09 62 79 74   > 245) {....byt
100a0 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35  es_to_send = 245
100b0 3b 0a 09 09 09 70 31 20 3d 20 30 78 38 30 3b 0a  ;....p1 = 0x80;.
100c0 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
100d0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65  } else {....byte
100e0 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62  s_to_send = tmpb
100f0 75 66 6c 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30  uflen;....p1 = 0
10100 78 30 30 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30  x00;....le = 0x0
10110 30 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74  0;...}....tmpout
10120 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c  buflen = outbufl
10130 65 6e 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20  en;....send_ret 
10140 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
10150 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
10160 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
10170 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54  FORM, GSCIS_INST
10180 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70  R_SIGNDECRYPT, p
10190 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74  1, 0x00, bytes_t
101a0 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
101b0 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
101c0 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
101d0 66 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 65 6e  flen);...if (sen
101e0 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
101f0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
10200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10210 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
10220 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75  g Failed -- retu
10230 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
10240 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f  );.....if (free_
10250 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66  tmpbuf) {.....if
10260 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
10270 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
10280 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
10290 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
102a0 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
102b0 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
102c0 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20  n(slot);.....if 
102d0 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
102e0 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  982) {.....CACKE
102f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10300 53 65 63 75 72 69 74 79 20 73 74 61 74 75 73 20  Security status 
10310 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64 2e 20  not satisified. 
10320 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c   Returning NEEDL
10330 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63  OGIN");......cac
10340 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
10350 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73  set(slot);.....s
10360 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot->token_flags
10370 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
10380 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75  UIRED;......retu
10390 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
103a0 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09  _NEEDLOGIN);....
103b0 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72  }.....if (send_r
103c0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
103d0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
103e0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
103f0 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65  BUG_PRINTF("Toke
10400 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72  n absent.  Retur
10410 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54  ning TOKENABSENT
10420 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ");......cackey_
10430 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
10440 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75  slot);......retu
10450 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
10460 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
10470 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ..}.....return(-
10480 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75  1);...}....tmpbu
10490 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  f += bytes_to_se
104a0 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20  nd;...tmpbuflen 
104b0 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  -= bytes_to_send
104c0 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74  ;....outbuf += t
104d0 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f  mpoutbuflen;...o
104e0 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f  utbuflen -= tmpo
104f0 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76  utbuflen;...retv
10500 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c  al += tmpoutbufl
10510 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  en;..}...if (fre
10520 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66  e_tmpbuf) {...if
10530 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
10540 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
10550 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66  ...}..}...outbuf
10560 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f   = outbuf_s;.../
10570 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
10580 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
10590 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
105a0 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  t);..#ifdef CACK
105b0 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
105c0 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
105d0 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75  E_MAX..if (outbu
105e0 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53  flen > _POSIX_SS
105f0 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
10600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10610 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65  ("Outbuflen exce
10620 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
10630 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
10640 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
10650 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d  %li, outbuflen =
10660 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
10670 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
10680 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
10690 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09   outbuflen);....
106a0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
106b0 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
106c0 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 20  ./* Unpad reply 
106d0 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 74  */..if (unpadOut
106e0 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65 74  put) {...if (ret
106f0 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 41  val < 3) {....CA
10700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10710 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f 20  F("Reply is too 
10720 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f  small, we are no
10730 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 20  t able to unpad 
10740 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20  -- passing back 
10750 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74  and hoping for t
10760 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09  he best!");.....
10770 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10780 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
10790 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61  n success, retva
107a0 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22  l = %li (bytes)"
107b0 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29  , (long) retval)
107c0 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76  ;....return(retv
107d0 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  al);...}....if (
107e0 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 30  outbuf[0] != 0x0
107f0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
10800 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 72  EBUG_PRINTF("Unr
10810 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 6e  ecognized paddin
10820 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 73  g scheme -- pass
10830 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70  ing back and hop
10840 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74  ing for the best
10850 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  !");.....CACKEY_
10860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10870 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
10880 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69  ss, retval = %li
10890 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67   (bytes)", (long
108a0 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65  ) retval);....re
108b0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09  turn(retval);...
108c0 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d  }....blocktype =
108d0 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e   outbuf[1];...un
108e0 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  padoffset = 0;..
108f0 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74  ..switch (blockt
10900 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30  ype) {....case 0
10910 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64  x00:...../* Padd
10920 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68  ing Scheme 1, th
10930 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f  e first non-zero
10940 20 62 79 74 65 20 69 73 20 74 68 65 20 73 74 61   byte is the sta
10950 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09  rt of data */...
10960 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
10970 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
10980 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
10990 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
109a0 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
109b0 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30  npadoffset] != 0
109c0 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  x00) {.......bre
109d0 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
109e0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
109f0 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a  ase 0x01:...../*
10a00 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
10a10 32 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65  2, pad bytes are
10a20 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62   0xFF followed b
10a30 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f  y 0x00 */.....fo
10a40 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
10a50 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
10a60 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
10a70 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
10a80 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
10a90 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29  offset] != 0xFF)
10aa0 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74   {.......if (out
10ab0 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
10ac0 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   == 0x00) {.....
10ad0 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  ...unpadoffset++
10ae0 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b  ;.........break;
10af0 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  .......} else {.
10b00 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
10b10 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
10b20 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61  lid padding data
10b30 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e   found, returnin
10b40 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68  g in failure, sh
10b50 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30  ould have been 0
10b60 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78  x00 found 0x%02x
10b70 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
10b80 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66  ) outbuf[unpadof
10b90 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09  fset]);.........
10ba0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09  return(-1);.....
10bb0 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  ..}......} else 
10bc0 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
10bd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
10be0 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74  alid padding dat
10bf0 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69  a found, returni
10c00 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73  ng in failure, s
10c10 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
10c20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32  0xFF found 0x%02
10c30 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  x", (unsigned in
10c40 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  t) outbuf[unpado
10c50 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09  ffset]);........
10c60 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09  return(-1);.....
10c70 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  .}.....}.....bre
10c80 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32  ak;....case 0x02
10c90 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67  :...../* Padding
10ca0 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62   Scheme 3, pad b
10cb0 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72  ytes are non-zer
10cc0 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79 74  o first zero byt
10cd0 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20 73  e found is the s
10ce0 65 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a 2f  eperator byte */
10cf0 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f  .....for (unpado
10d00 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64  ffset = 2; unpad
10d10 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b  offset < retval;
10d20 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20   unpadoffset++) 
10d30 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  {......if (outbu
10d40 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d  f[unpadoffset] =
10d50 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09  = 0x00) {.......
10d60 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a  unpadoffset++;..
10d70 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10d80 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  ..}.....}.....br
10d90 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
10da0 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72 65  unpadoffset > re
10db0 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45  tval) {....CACKE
10dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10dd0 4f 66 66 73 65 74 20 67 72 65 61 74 65 72 20 74  Offset greater t
10de0 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c 20  han reply size, 
10df0 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 61  aborting.  (unpa
10e00 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 72  doffset = %lu, r
10e10 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28  etval = %lu)", (
10e20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
10e30 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e 73  npadoffset, (uns
10e40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 76  igned long) retv
10e50 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
10e60 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  -1);...}....CACK
10e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
10e80 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 74  F("Padded:", out
10e90 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  buf, retval);...
10ea0 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64  .retval -= unpad
10eb0 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76  offset;...memmov
10ec0 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66  e(outbuf, outbuf
10ed0 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20   + unpadoffset, 
10ee0 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b  retval);....CACK
10ef0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
10f00 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f  F("Unpadded:", o
10f10 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
10f20 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
10f30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
10f40 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
10f50 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
10f60 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
10f70 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
10f80 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  (retval);.}../*.
10f90 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
10fa0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
10fb0 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
10fc0 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
10fd0 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
10fe0 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
10ff0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
11000 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
11010 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72  cackey_login(str
11020 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
11030 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
11040 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67  char *pin, unsig
11050 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e  ned long pin_len
11060 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d  , int *tries_rem
11070 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73  aining_p) {..uns
11080 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70  igned char cac_p
11090 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30  in[8] = {0xFF, 0
110a0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
110b0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
110c0 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31  F, 0xFF};..uint1
110d0 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64  6_t response_cod
110e0 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65  e;..int tries_re
110f0 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65  maining;..int se
11100 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64  nd_ret;.../* Ind
11110 69 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f  icate that we do
11120 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20   not know about 
11130 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61  how many tries a
11140 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a  re remaining */.
11150 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
11160 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69  ning_p) {...*tri
11170 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d  es_remaining_p =
11180 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70   -1;..}.../* App
11190 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e  arently, CAC PIN
111a0 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20  s are *EXACTLY* 
111b0 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20  8 bytes long -- 
111c0 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66  pad with 0xFF if
111d0 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
111e0 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29  f (pin_len >= 8)
111f0 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f   {...memcpy(cac_
11200 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d  pin, pin, 8);..}
11210 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
11220 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70  (cac_pin, pin, p
11230 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a  in_len);..}.../*
11240 20 49 73 73 75 65 20 50 49 4e 20 56 65 72 69 66   Issue PIN Verif
11250 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d  y */..send_ret =
11260 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
11270 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
11280 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
11290 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c  IS_INSTR_VERIFY,
112a0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 73 69 7a   0x00, 0x00, siz
112b0 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61  eof(cac_pin), ca
112c0 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65  c_pin, 0x00, &re
112d0 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c  sponse_code, NUL
112e0 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
112f0 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
11300 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
11310 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63  .if ((response_c
11320 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d  ode & 0x63C0) ==
11330 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72   0x63C0) {....tr
11340 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20  ies_remaining = 
11350 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
11360 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45   0xF);.....CACKE
11370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11380 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
11390 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65   failed, %i trie
113a0 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72  s remaining", tr
113b0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a  ies_remaining);.
113c0 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
113d0 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09  maining_p) {....
113e0 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
113f0 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61  g_p = tries_rema
11400 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09  ining;....}.....
11410 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11420 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
11430 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
11440 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
11450 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
11460 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
11470 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
11480 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c  led, device is l
11490 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74  ocked");.....ret
114a0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
114b0 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a  E_LOCKED);...}..
114c0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
114d0 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
114e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
114f0 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
11500 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63  erification succ
11510 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72  eeded");...retur
11520 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
11530 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
11540 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
11550 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
11560 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11570 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
11580 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
11590 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
115a0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
115b0 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
115c0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
115d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
115e0 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
115f0 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e  key_ret pcsc_con
11600 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44  nect_ret;..DWORD
11610 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c   reader_len = 0,
11620 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74   state = 0, prot
11630 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65  ocol = 0, atr_le
11640 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58  n;..BYTE atr[MAX
11650 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e  _ATR_SIZE];..LON
11660 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63  G status_ret, sc
11670 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
11680 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11690 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
116a0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e  ;...if (slot->in
116b0 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b  ternal) {...CACK
116c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
116d0 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e  "Returning token
116e0 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72 6e   present (intern
116f0 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09  al token)");....
11700 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11710 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
11720 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  T);..}...pcsc_co
11730 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
11740 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
11750 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63  slot);..if (pcsc
11760 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
11770 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
11780 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11790 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
117a0 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
117b0 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
117c0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
117d0 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
117e0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
117f0 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c  ENT);..}...atr_l
11800 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29  en = sizeof(atr)
11810 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ;..status_ret = 
11820 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
11830 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
11840 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
11850 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
11860 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
11870 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  );...if (status_
11880 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49  ret == SCARD_E_I
11890 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b  NVALID_HANDLE) {
118a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
118b0 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61  PRINTF("SCardSta
118c0 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  tus() returned S
118d0 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
118e0 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69  ANDLE, marking i
118f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f  s not already co
11900 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69  nnected and tryi
11910 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61  ng again");...ca
11920 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
11930 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70  eset(slot);....p
11940 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
11950 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
11960 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69  _card(slot);...i
11970 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
11980 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
11990 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
119a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
119b0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
119c0 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
119d0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
119e0 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  sent");.....retu
119f0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
11a00 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
11a10 09 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20  .}....atr_len = 
11a20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73  sizeof(atr);...s
11a30 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
11a40 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
11a50 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
11a60 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
11a70 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
11a80 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09  tr, &atr_len);..
11a90 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72  }...if (status_r
11aa0 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
11ab0 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65  CCESS) {...cacke
11ac0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
11ad0 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28  t(slot);....if (
11ae0 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43  status_ret == SC
11af0 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
11b00 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
11b10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
11b20 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61  t required, plea
11b30 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09  se hold...");...
11b40 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  ..scard_reconn_r
11b50 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f  et = cackey_reco
11b60 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c  nnect_card(slot,
11b70 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
11b80 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
11b90 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f  COL_T1, &protoco
11ba0 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  l);....if (scard
11bb0 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
11bc0 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
11bd0 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20  {...../* Update 
11be0 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09  protocol */.....
11bf0 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
11c00 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09   protocol;......
11c10 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20  /* Re-establish 
11c20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
11c30 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a  it was present *
11c40 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  /.....if (slot->
11c50 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
11c60 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  h > 0) {......sl
11c70 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
11c80 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c  depth--;......sl
11c90 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
11ca0 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31  need_hw_lock = 1
11cb0 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65  ;......cackey_be
11cc0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
11cd0 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  slot);.....}....
11ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11cf0 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63  RINTF("Reset suc
11d00 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72 79  cessful, requery
11d10 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74 75  ing");.....statu
11d20 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
11d30 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
11d40 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
11d50 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
11d60 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
11d70 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69  &atr_len);.....i
11d80 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d  f (status_ret !=
11d90 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
11da0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
11db0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 74  DEBUG_PRINTF("St
11dc0 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71 75  ill unable to qu
11dd0 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c  ery card status,
11de0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
11df0 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53   absent.  SCardS
11e00 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43  tatus() = %s", C
11e10 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11e20 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
11e30 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a  (status_ret));..
11e40 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
11e50 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
11e60 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09  BSENT);.....}...
11e70 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
11e80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11e90 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63  F("Unable to rec
11ea0 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
11eb0 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
11ec0 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52 65  absent.  SCardRe
11ed0 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22 2c  connect() = %s",
11ee0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
11ef0 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
11f00 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  TR(scard_reconn_
11f10 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74 75  ret));......retu
11f20 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
11f30 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
11f40 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
11f50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11f60 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
11f70 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74   query card stat
11f80 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  us, returning to
11f90 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61  ken absent.  SCa
11fa0 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22  rdStatus() = %s"
11fb0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
11fc0 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
11fd0 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29  STR(status_ret))
11fe0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
11ff0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
12000 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a  ABSENT);...}..}.
12010 0a 09 69 66 20 28 28 73 74 61 74 65 20 26 20 53  ..if ((state & S
12020 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20  CARD_ABSENT) == 
12030 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a  SCARD_ABSENT) {.
12040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12050 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 61  RINTF("Card is a
12060 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67  bsent, returning
12070 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b   token absent");
12080 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
12090 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
120a0 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  SENT);..}...CACK
120b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
120c0 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e  "Returning token
120d0 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72   present.");...r
120e0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
120f0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
12100 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
12110 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
12120 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
12130 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
12140 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
12150 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
12160 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
12170 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
12180 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73  ize_t cackey_pcs
12190 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61  c_identity_to_la
121a0 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65  bel(struct cacke
121b0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
121c0 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67  *identity, unsig
121d0 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f  ned char *label_
121e0 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  buf, unsigned lo
121f0 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  ng label_buf_len
12200 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
12210 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ng certificate_l
12220 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c  en;..void *label
12230 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65  _asn1;..void *ce
12240 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20  rtificate;..int 
12250 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a  x509_read_ret;..
12260 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69  .certificate = i
12270 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
12280 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61  cate;..certifica
12290 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74  te_len = identit
122a0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  y->certificate_l
122b0 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66  en;...if (certif
122c0 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b  icate_len < 0) {
122d0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
122e0 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
122f0 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a  t = x509_to_subj
12300 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ect(certificate,
12310 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
12320 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62  , (void **) &lab
12330 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78  el_asn1);..if (x
12340 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
12350 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  ) {...return(-1)
12360 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64  ;..}...x509_read
12370 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74  _ret = x509_dn_t
12380 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61  o_string(label_a
12390 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  sn1, x509_read_r
123a0 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62  et, (char *) lab
123b0 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75  el_buf, label_bu
123c0 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69  f_len, "CN");..i
123d0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
123e0 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f   <= 0) {...x509_
123f0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
12400 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62  dn_to_string(lab
12410 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65  el_asn1, x509_re
12420 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29  ad_ret, (char *)
12430 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65   label_buf, labe
12440 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29  l_buf_len, NULL)
12450 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65  ;....if (x509_re
12460 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
12470 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
12480 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  }..}..#ifdef CAC
12490 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
124a0 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
124b0 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39  ZE_MAX..if (x509
124c0 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53  _read_ret > _POS
124d0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
124e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
124f0 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64  RINTF("x509_read
12500 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d 61 78  _ret exceeds max
12510 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
12520 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
12530 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35  . (max = %li, x5
12540 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c  09_read_ret = %l
12550 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
12560 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
12570 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35  nsigned long) x5
12580 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09  09_read_ret);...
12590 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
125a0 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
125b0 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65  ..return(x509_re
125c0 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52  ad_ret);.}../* R
125d0 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
125e0 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
125f0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63  t cackey_mutex_c
12600 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74  reate(void **mut
12610 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
12620 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
12630 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
12640 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
12650 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
12660 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
12670 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
12680 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
12690 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
126a0 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
126b0 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
126c0 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
126d0 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c  ead_mutex = mall
126e0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65  oc(sizeof(*pthre
126f0 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66  ad_mutex));...if
12700 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78   (!pthread_mutex
12710 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
12720 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
12730 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
12740 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65  emory.");.....re
12750 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
12760 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
12770 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
12780 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74  init(pthread_mut
12790 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20  ex, NULL);...if 
127a0 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
127b0 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
127c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
127d0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
127e0 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  it() returned er
127f0 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
12800 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
12810 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
12820 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68  ....*mutex = pth
12830 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65  read_mutex;..} e
12840 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
12850 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
12860 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
12870 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
12880 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
12890 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
128a0 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
128b0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
128c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
128d0 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
128e0 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29 20  s.CreateMutex() 
128f0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
12900 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
12910 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
12920 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
12930 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
12940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12950 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
12960 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
12970 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
12980 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
12990 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
129a0 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
129b0 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75  ex_lock(void *mu
129c0 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
129d0 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
129e0 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
129f0 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
12a00 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
12a10 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
12a20 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
12a30 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
12a40 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
12a50 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
12a60 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
12a70 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
12a80 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74  read_mutex = mut
12a90 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ex;....pthread_r
12aa0 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
12ab0 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65  mutex_lock(pthre
12ac0 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
12ad0 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
12ae0 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
12af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12b00 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
12b10 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ck() returned er
12b20 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
12b30 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
12b40 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
12b50 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
12b60 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  (cackey_args.Loc
12b70 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  kMutex) {....cus
12b80 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
12b90 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
12ba0 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
12bb0 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
12bc0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
12bd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12be0 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
12bf0 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72  gs.LockMutex() r
12c00 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
12c10 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75  li).", (long) cu
12c20 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  stom_retval);...
12c30 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12c40 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ..}...}..}...CAC
12c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12c60 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65  ("Returning suce
12c70 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a  ssfully (0)");..
12c80 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
12c90 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
12ca0 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
12cb0 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
12cc0 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d  x_unlock(void *m
12cd0 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
12ce0 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
12cf0 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
12d00 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
12d10 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
12d20 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
12d30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
12d40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
12d50 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
12d60 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
12d70 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
12d80 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
12d90 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75  hread_mutex = mu
12da0 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  tex;....pthread_
12db0 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
12dc0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74  _mutex_unlock(pt
12dd0 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09  hread_mutex);...
12de0 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
12df0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
12e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12e10 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
12e20 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e  _unlock() return
12e30 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c  ed error (%i).",
12e40 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29   pthread_retval)
12e50 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
12e60 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
12e70 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
12e80 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b  s.UnlockMutex) {
12e90 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
12ea0 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
12eb0 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65  UnlockMutex(mute
12ec0 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
12ed0 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
12ee0 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
12ef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12f00 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
12f10 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  ckMutex() return
12f20 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
12f30 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
12f40 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
12f50 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
12f60 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
12f70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
12f80 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
12f90 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
12fa0 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(0);.}..static
12fb0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
12fc0 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  R cackey_get_att
12fd0 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43  ributes(CK_OBJEC
12fe0 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c  T_CLASS objectcl
12ff0 61 73 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b  ass, struct cack
13000 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
13010 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
13020 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
13030 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47  ty_num, CK_ULONG
13040 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
13050 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f  ..static CK_BBOO
13060 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09  L ck_true = 1;..
13070 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20  static CK_BBOOL 
13080 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73  ck_false = 0;..s
13090 74 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63  tatic CK_TRUST c
130a0 6b 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54  k_trusted = CK_T
130b0 52 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52  RUSTED_DELEGATOR
130c0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61  ;..CK_ULONG numa
130d0 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c  ttrs = 0, retval
130e0 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52  _count;..CK_ATTR
130f0 49 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f  IBUTE_TYPE curr_
13100 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41  attr_type;..CK_A
13110 54 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74  TTRIBUTE curr_at
13120 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b  tr, *retval;..CK
13130 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65  _VOID_PTR pValue
13140 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61  ;..CK_ULONG ulVa
13150 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45  lueLen;..CK_OBJE
13160 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65  CT_CLASS ck_obje
13170 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45  ct_class;..CK_CE
13180 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63  RTIFICATE_TYPE c
13190 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
131a0 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45  pe;..CK_KEY_TYPE
131b0 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43   ck_key_type;..C
131c0 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70  K_UTF8CHAR ucTmp
131d0 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31  Buf[1024];..SHA1
131e0 43 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78  Context sha1_ctx
131f0 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63  ;..MD5_CTX md5_c
13200 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61  tx;..uint8_t sha
13210 31 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68 53  1_hash[SHA1HashS
13220 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d  ize];..uint8_t m
13230 64 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53  d5_hash[MD5HashS
13240 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ize];..unsigned 
13250 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74  char *certificat
13260 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74  e;..ssize_t cert
13270 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31  ificate_len = -1
13280 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  , x509_read_ret;
13290 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65  ..int pValue_fre
132a0 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  e;...CACKEY_DEBU
132b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
132c0 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20   (objectClass = 
132d0 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75  %lu, identity_nu
132e0 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  m = %lu).", (uns
132f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65  igned long) obje
13300 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74  ctclass, identit
13310 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f  y_num);...*pulCo
13320 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f  unt = 0;...if (o
13330 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
13340 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
13350 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
13360 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26  CKO_PUBLIC_KEY &
13370 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
13380 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
13390 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
133a0 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
133b0 54 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45  TRUST) {...CACKE
133c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
133d0 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65  Returning 0 obje
133e0 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61  cts (NULL), inva
133f0 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73  lid object class
13400 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
13410 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74  LL);..}.../* Get
13420 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64   Cert */..if (id
13430 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20  entity == NULL) 
13440 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13450 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
13460 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
13470 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65  LL), invalid ide
13480 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b  ntiy provided");
13490 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
134a0 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61  ;..}...certifica
134b0 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  te = identity->c
134c0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72  ertificate;..cer
134d0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69  tificate_len = i
134e0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
134f0 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  cate_len;...if (
13500 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
13510 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69  == -1 || certifi
13520 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  cate == NULL) {.
13530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13540 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
13550 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
13560 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74 79  ), this identity
13570 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
13580 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  n X.509 certific
13590 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ate associated w
135a0 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20  ith it and will 
135b0 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72  not work");....r
135c0 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
135d0 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
135e0 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
135f0 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e  ASN.1 encoded X.
13600 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
13610 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f  */..if (x509_to_
13620 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61  serial(certifica
13630 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
13640 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20  len, NULL) < 0) 
13650 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13660 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
13670 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
13680 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63  LL), the X.509 c
13690 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63  ertificate assoc
136a0 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
136b0 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20  identity is not 
136c0 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75  valid");....retu
136d0 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  rn(NULL);..}...r
136e0 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34  etval_count = 64
136f0 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c  ;..retval = mall
13700 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  oc(retval_count 
13710 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  * sizeof(*retval
13720 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f  ));...for (curr_
13730 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63  attr_type = 0; c
13740 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20  urr_attr_type < 
13750 30 78 63 65 35 33 36 33 62 66 3b 20 63 75 72 72  0xce5363bf; curr
13760 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a  _attr_type++) {.
13770 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f  ..if (curr_attr_
13780 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b  type == 0x800) {
13790 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79  ....curr_attr_ty
137a0 70 65 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b  pe = 0xce536300;
137b0 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66  ...}....pValue_f
137c0 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75  ree = 0;...pValu
137d0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61  e = NULL;...ulVa
137e0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
137f0 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68  G) -1;....switch
13800 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
13810 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ) {....case CKA_
13820 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45  CLASS:.....CACKE
13830 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13840 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
13850 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28  bute CKA_CLASS (
13860 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
13870 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
13880 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
13890 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63  .....ck_object_c
138a0 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61  lass = objectcla
138b0 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ss;......pValue 
138c0 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  = &ck_object_cla
138d0 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ss;.....ulValueL
138e0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f  en = sizeof(ck_o
138f0 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09  bject_class);...
13900 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13910 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
13920 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
13930 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
13940 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45  long) *((CK_OBJE
13950 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c  CT_CLASS *) pVal
13960 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
13970 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13980 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
13990 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
139a0 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43  A_TOKEN:.....CAC
139b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
139c0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
139d0 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e  ribute CKA_TOKEN
139e0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
139f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13a00 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
13a10 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
13a20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
13a30 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
13a40 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
13a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13a60 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
13a70 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
13a80 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
13a90 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
13aa0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
13ab0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
13ac0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
13ad0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
13ae0 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45  case CKA_PRIVATE
13af0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
13b00 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
13b10 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
13b20 43 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78 25  CKA_PRIVATE (0x%
13b30 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
13b40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
13b50 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
13b60 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
13b70 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
13b80 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
13b90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13ba0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
13bb0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
13bc0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
13bd0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
13be0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
13bf0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
13c00 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
13c10 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c  false;.....ulVal
13c20 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
13c30 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43  k_false);......C
13c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13c50 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
13c60 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
13c70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13c80 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
13c90 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
13ca0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13cb0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
13cc0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
13cd0 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a  se CKA_TRUSTED:.
13ce0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13cf0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
13d00 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
13d10 41 5f 54 52 55 53 54 45 44 20 28 30 78 25 30 38  A_TRUSTED (0x%08
13d20 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
13d30 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
13d40 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
13d50 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
13d60 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
13d70 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
13d80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13d90 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
13da0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
13db0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
13dc0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
13dd0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
13de0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61  ;.....}......pVa
13df0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
13e00 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
13e10 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
13e20 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
13e30 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
13e40 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
13e50 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
13e60 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
13e70 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
13e80 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
13e90 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
13ea0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13eb0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d  k;....case CKA_M
13ec0 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43  ODIFIABLE:.....C
13ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13ee0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
13ef0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44  ttribute CKA_MOD
13f00 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78  IFIABLE (0x%08lx
13f10 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
13f20 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
13f30 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
13f40 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
13f50 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
13f60 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
13f70 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
13f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
13f90 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
13fa0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
13fb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
13fc0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
13fd0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
13fe0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13ff0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
14000 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
14010 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43  A_LABEL:.....CAC
14020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14030 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
14040 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c  ribute CKA_LABEL
14050 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
14060 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14070 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
14080 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44  ;....../* XXX: D
14090 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f  etermine name */
140a0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
140b0 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72  = snprintf((char
140c0 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69   *) ucTmpBuf, si
140d0 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20  zeof(ucTmpBuf), 
140e0 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c  "Identity #%lu",
140f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14100 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a   identity_num);.
14110 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54  ....pValue = ucT
14120 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 20 28  mpBuf;......if (
14130 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69  ulValueLen >= si
14140 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20  zeof(ucTmpBuf)) 
14150 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  {......ulValueLe
14160 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 61 6c  n = 0;......pVal
14170 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d  ue = NULL;.....}
14180 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14190 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
141a0 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
141b0 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
141c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
141d0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
141e0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
141f0 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43  A_VALUE:.....CAC
14200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14210 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
14220 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45  ribute CKA_VALUE
14230 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
14240 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14250 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
14260 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f  ;......switch (o
14270 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09  bjectclass) {...
14280 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56  ...case CKO_PRIV
14290 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43  ATE_KEY:.......C
142a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
142b0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
142c0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
142d0 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69  use we are a pri
142e0 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  vate key.");....
142f0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
14300 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50  case CKO_NETSCAP
14310 45 5f 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43  E_TRUST:.......C
14320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14330 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
14340 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
14350 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
14360 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
14370 63 74 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  ct");........bre
14380 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ak;......case CK
14390 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09  O_PUBLIC_KEY:...
143a0 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
143b0 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
143c0 09 09 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  .......x509_read
143d0 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70  _ret = x509_to_p
143e0 75 62 6b 65 79 28 63 65 72 74 69 66 69 63 61 74  ubkey(certificat
143f0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
14400 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
14410 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
14420 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09  ad_ret < 0) { ..
14430 09 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
14440 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65  NULL;........} e
14450 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c  lse {.........ul
14460 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
14470 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09  read_ret;.......
14480 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09  .}.......}......
14490 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
144a0 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  se CKO_CERTIFICA
144b0 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65  TE:.......pValue
144c0 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a   = certificate;.
144d0 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
144e0 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c   = certificate_l
144f0 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  en;........break
14500 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
14510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14520 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
14530 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
14540 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14550 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
14560 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14570 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09  se CKA_ISSUER:..
14580 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14590 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
145a0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
145b0 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78  _ISSUER (0x%08lx
145c0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
145d0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
145e0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
145f0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
14600 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
14610 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
14620 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
14630 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
14640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14650 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
14660 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
14670 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
14680 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e  certificate or N
14690 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
146a0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
146b0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
146c0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
146d0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
146e0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
146f0 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28   x509_to_issuer(
14700 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
14710 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
14720 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
14730 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
14740 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
14750 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
14760 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
14770 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
14780 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
14790 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
147a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
147b0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
147c0 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
147d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
147e0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
147f0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14800 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  se CKA_SERIAL_NU
14810 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  MBER:.....CACKEY
14820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14830 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
14840 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  ute CKA_SERIAL_N
14850 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29 20  UMBER (0x%08lx) 
14860 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
14870 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
14880 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
14890 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
148a0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
148b0 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
148c0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
148d0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
148e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
148f0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
14900 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
14910 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
14920 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74  rtificate or Net
14930 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
14940 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
14950 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
14960 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
14970 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
14980 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
14990 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65  509_to_serial(ce
149a0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
149b0 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
149c0 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
149d0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
149e0 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
149f0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
14a00 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
14a10 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
14a20 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
14a30 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
14a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14a50 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
14a60 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
14a70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14a80 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
14a90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14aa0 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a  se CKA_SUBJECT:.
14ab0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14ac0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
14ad0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
14ae0 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25 30 38  A_SUBJECT (0x%08
14af0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
14b00 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
14b10 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
14b20 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
14b30 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
14b40 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
14b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14b60 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
14b70 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
14b80 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
14b90 74 69 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09  tificate");.....
14ba0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
14bb0 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
14bc0 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
14bd0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
14be0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62  et = x509_to_sub
14bf0 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65  ject(certificate
14c00 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
14c10 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
14c20 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
14c30 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
14c40 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
14c50 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14c60 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
14c70 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
14c80 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
14c90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14ca0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
14cb0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
14cc0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
14cd0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
14ce0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
14cf0 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a  ...case CKA_ID:.
14d00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14d10 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
14d20 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
14d30 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e  A_ID (0x%08lx) .
14d40 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
14d50 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
14d60 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
14d70 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
14d80 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
14d90 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
14da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
14db0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
14dc0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
14dd0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
14de0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
14df0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14e00 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66  .}......ucTmpBuf
14e10 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79  [0] = ((identity
14e20 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20  _num + 1) >> 8) 
14e30 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d  & 0xff;.....ucTm
14e40 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e  pBuf[1] =  (iden
14e50 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20  tity_num + 1) & 
14e60 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75  0xff;......pValu
14e70 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09  e = &ucTmpBuf;..
14e80 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14e90 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  2;......CACKEY_D
14ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14eb0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
14ec0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
14ed0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
14ee0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
14ef0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
14f00 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  A_CERTIFICATE_TY
14f10 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PE:.....CACKEY_D
14f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
14f30 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
14f40 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
14f50 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29  E_TYPE (0x%08lx)
14f60 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
14f70 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
14f80 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
14f90 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
14fa0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
14fb0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
14fc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14fd0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
14fe0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
14ff0 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
15000 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09  icate.");.......
15010 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
15020 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70  ../* We only sup
15030 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69  port one certifi
15040 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09  cate type */....
15050 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  .ck_certificate_
15060 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39  type = CKC_X_509
15070 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
15080 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  &ck_certificate_
15090 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
150a0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
150b0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
150c0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
150d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
150e0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43  .. returning CKC
150f0 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70  _X_509 (%lu) (%p
15100 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
15110 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45  d long) *((CK_CE
15120 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a  RTIFICATE_TYPE *
15130 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
15140 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
15150 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
15160 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
15170 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ase CKA_KEY_TYPE
15180 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
15190 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
151a0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
151b0 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78  CKA_KEY_TYPE (0x
151c0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
151d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
151e0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
151f0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
15200 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss != CKO_PRIVAT
15210 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63  E_KEY && objectc
15220 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c  lass != CKO_PUBL
15230 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43  IC_KEY) {......C
15240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15250 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
15260 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
15270 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
15280 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62   key.");.......b
15290 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
152a0 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
152b0 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65  ort one key type
152c0 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74   */.....ck_key_t
152d0 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a  ype = CKK_RSA;..
152e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
152f0 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75  _key_type;.....u
15300 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15310 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b  of(ck_key_type);
15320 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15330 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15340 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53  returning CKK_RS
15350 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  A (%lu) (%p/%lu)
15360 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15370 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
15380 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
15390 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
153a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
153b0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
153c0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
153d0 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43  KA_SIGN:.....CAC
153e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
153f0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
15400 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20  ribute CKA_SIGN 
15410 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15420 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15430 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
15440 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
15450 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
15460 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
15470 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15480 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
15490 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
154a0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
154b0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
154c0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
154d0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
154e0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
154f0 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
15500 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
15510 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
15520 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15530 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
15540 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
15550 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
15560 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
15570 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15580 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
15590 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
155a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
155b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
155c0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
155d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
155e0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
155f0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
15600 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15610 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15620 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15630 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09  _SIGN_RECOVER:..
15640 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15650 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
15660 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
15670 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30  _SIGN_RECOVER (0
15680 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15690 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
156a0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
156b0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
156c0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
156d0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
156e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
156f0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
15700 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
15710 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
15720 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
15730 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
15740 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
15750 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79  ./* We currently
15760 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53   only support "S
15770 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69  ign with Appendi
15780 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65  x" */.....pValue
15790 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
157a0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
157b0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
157c0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
157d0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
157e0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
157f0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15800 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15810 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15820 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15830 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
15840 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
15850 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45  ;....case CKA_DE
15860 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45  CRYPT:.....CACKE
15870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15880 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
15890 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54  bute CKA_DECRYPT
158a0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
158b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
158c0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
158d0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
158e0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
158f0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
15900 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15910 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
15920 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
15930 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
15940 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
15950 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
15960 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
15970 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15980 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
15990 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74  TE_KEY || object
159a0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42  class == CKO_PUB
159b0 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  LIC_KEY) {......
159c0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
159d0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
159e0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
159f0 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
15a00 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
15a10 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
15a20 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
15a30 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
15a40 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
15a50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15a60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
15a70 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
15a80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
15a90 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
15aa0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
15ab0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
15ac0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
15ad0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
15ae0 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09  KA_SENSITIVE:...
15af0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15b00 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
15b10 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
15b20 53 45 4e 53 49 54 49 56 45 20 28 30 78 25 30 38  SENSITIVE (0x%08
15b30 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
15b40 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
15b50 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
15b60 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
15b70 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
15b80 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
15b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15ba0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
15bb0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
15bc0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
15bd0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
15be0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
15bf0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
15c00 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15c10 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
15c20 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
15c30 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
15c40 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
15c50 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
15c60 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
15c70 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
15c80 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
15c90 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
15ca0 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
15cb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15cc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
15cd0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
15ce0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
15cf0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
15d00 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
15d10 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
15d20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
15d30 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
15d40 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41  ..case CKA_EXTRA
15d50 43 54 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  CTABLE:.....CACK
15d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15d70 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15d80 69 62 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43  ibute CKA_EXTRAC
15d90 54 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20  TABLE (0x%08lx) 
15da0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
15db0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
15dc0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
15dd0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
15de0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
15df0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
15e00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
15e10 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
15e20 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
15e30 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
15e40 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
15e50 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
15e60 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
15e70 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15e80 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
15e90 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
15ea0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
15eb0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
15ec0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
15ed0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
15ee0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
15ef0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15f00 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
15f10 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
15f20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15f30 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
15f40 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
15f50 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15f60 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
15f70 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
15f80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15f90 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
15fa0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
15fb0 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a  se CKA_MODULUS:.
15fc0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15fd0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
15fe0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
15ff0 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38  A_MODULUS (0x%08
16000 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
16010 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
16020 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
16030 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
16040 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
16050 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
16060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16070 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
16080 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
16090 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
160a0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
160b0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
160c0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
160d0 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
160e0 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
160f0 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
16100 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65  09_to_modulus(ce
16110 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
16120 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
16130 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
16140 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
16150 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
16160 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
16170 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
16180 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
16190 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
161a0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
161b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
161c0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
161d0 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
161e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
161f0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
16200 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
16210 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  se CKA_PUBLIC_EX
16220 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b  PONENT:.....CACK
16230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16240 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
16250 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43  ibute CKA_PUBLIC
16260 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38  _EXPONENT (0x%08
16270 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
16280 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
16290 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
162a0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
162b0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
162c0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
162d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
162e0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
162f0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
16300 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
16310 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
16320 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
16330 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
16340 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
16350 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
16360 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
16370 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63  09_to_exponent(c
16380 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
16390 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
163a0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
163b0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
163c0 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
163d0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
163e0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
163f0 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
16400 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
16410 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
16420 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16430 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16440 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
16450 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16460 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16470 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
16480 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49  ase CKA_TRUST_DI
16490 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a  GITAL_SIGNATURE:
164a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
164b0 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49  ST_NON_REPUDIATI
164c0 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ON:....case CKA_
164d0 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48  TRUST_KEY_ENCIPH
164e0 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20  ERMENT:....case 
164f0 43 4b 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45  CKA_TRUST_DATA_E
16500 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09  NCIPHERMENT:....
16510 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b  case CKA_TRUST_K
16520 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09  EY_AGREEMENT:...
16530 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
16540 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09  KEY_CERT_SIGN:..
16550 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
16560 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61  _CRL_SIGN:....ca
16570 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52  se CKA_TRUST_SER
16580 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73  VER_AUTH:....cas
16590 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45  e CKA_TRUST_CLIE
165a0 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65  NT_AUTH:....case
165b0 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f   CKA_TRUST_CODE_
165c0 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65  SIGNING:....case
165d0 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c   CKA_TRUST_EMAIL
165e0 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09  _PROTECTION:....
165f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16600 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
16610 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
16620 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c  RUST_... (0x%08l
16630 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
16640 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
16650 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
16660 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73  Value = &ck_trus
16670 74 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ted;.....ulValue
16680 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
16690 74 72 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43  trusted);......C
166a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
166b0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
166c0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
166d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
166e0 29 20 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29  ) *((CK_TRUST *)
166f0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
16700 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16710 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
16720 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
16730 73 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31  se CKA_CERT_SHA1
16740 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45  _HASH:.....CACKE
16750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16760 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
16770 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48  bute CKA_CERT_SH
16780 41 31 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78  A1_HASH (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 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
167e0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
167f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16800 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
16810 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
16820 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
16830 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
16840 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
16850 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53  ak;.....}......S
16860 48 41 31 52 65 73 65 74 28 26 73 68 61 31 5f 63  HA1Reset(&sha1_c
16870 74 78 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70  tx);.....SHA1Inp
16880 75 74 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65  ut(&sha1_ctx, ce
16890 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
168a0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
168b0 09 53 48 41 31 52 65 73 75 6c 74 28 26 73 68 61  .SHA1Result(&sha
168c0 31 5f 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68  1_ctx, sha1_hash
168d0 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
168e0 20 73 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09   sha1_hash;.....
168f0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
16900 65 6f 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a  eof(sha1_hash);.
16910 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16920 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
16930 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
16940 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
16950 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
16960 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
16970 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
16980 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09  ERT_MD5_HASH:...
16990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
169a0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
169b0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
169c0 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30  CERT_MD5_HASH (0
169d0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
169e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
169f0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
16a00 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
16a10 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
16a20 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
16a30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16a40 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
16a50 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
16a60 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
16a70 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  t a Netscape tru
16a80 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
16a90 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
16aa0 0a 09 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64  .....MD5Init(&md
16ab0 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55  5_ctx);.....MD5U
16ac0 70 64 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20  pdate(&md5_ctx, 
16ad0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
16ae0 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
16af0 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f  ...MD5Final(md5_
16b00 68 61 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b  hash, &md5_ctx);
16b10 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d  ......pValue = m
16b20 64 35 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56  d5_hash;.....ulV
16b30 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
16b40 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09  (md5_hash);.....
16b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16b60 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
16b70 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
16b80 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
16b90 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
16ba0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
16bb0 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70  ..default:.....p
16bc0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
16bd0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
16be0 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09  CK_LONG) -1;....
16bf0 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
16c00 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c  f (((CK_LONG) ul
16c10 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43  ValueLen) != ((C
16c20 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09  K_LONG) -1)) {..
16c30 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61  ../* Push curr_a
16c40 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ttr onto the sta
16c50 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74  ck */....curr_at
16c60 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61  tr.type = curr_a
16c70 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72  ttr_type;....cur
16c80 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
16c90 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
16ca0 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56  ....curr_attr.pV
16cb0 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  alue = malloc(cu
16cc0 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
16cd0 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63  en);....memcpy(c
16ce0 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c  urr_attr.pValue,
16cf0 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74   pValue, curr_at
16d00 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  tr.ulValueLen);.
16d10 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66  ....if (pValue_f
16d20 72 65 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b  ree && pValue) {
16d30 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c 75 65  .....free(pValue
16d40 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
16d50 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76  numattrs >= retv
16d60 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  al_count) {.....
16d70 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63  retval = realloc
16d80 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f  (retval, retval_
16d90 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
16da0 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a  retval));....}..
16db0 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61  ...memcpy(&retva
16dc0 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75  l[numattrs], &cu
16dd0 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28  rr_attr, sizeof(
16de0 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09  curr_attr));....
16df0 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a  numattrs++;...}.
16e00 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72  .}...if (numattr
16e10 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76  s != 0) {...retv
16e20 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  al_count = numat
16e30 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20  trs;...retval = 
16e40 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20  realloc(retval, 
16e50 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
16e60 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
16e70 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65  ..} else {...fre
16e80 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  e(retval);....re
16e90 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  tval = NULL;..}.
16ea0 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75  ..*pulCount = nu
16eb0 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59  mattrs;...CACKEY
16ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16ed0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a  eturning %lu obj
16ee0 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d  ects (%p).", num
16ef0 61 74 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20  attrs, (void *) 
16f00 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
16f10 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
16f20 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
16f30 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
16f40 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  (struct cackey_i
16f50 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
16f60 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ies, unsigned lo
16f70 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  ng identities_co
16f80 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
16f90 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
16fa0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
16fb0 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  id_idx, attr_idx
16fc0 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69  ;...if (identiti
16fd0 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64  es == NULL || id
16fe0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
16ff0 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  = 0) {...return;
17000 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64  ..}...for (id_id
17010 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20  x = 0; id_idx < 
17020 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
17030 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  ; id_idx++) {...
17040 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69  if (identities[i
17050 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
17060 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74  s) {....for (att
17070 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f  r_idx = 0; attr_
17080 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73  idx < identities
17090 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
170a0 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f  tes_count; attr_
170b0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72  idx++) {.....cur
170c0 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69  r_attr = &identi
170d0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
170e0 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78  ributes[attr_idx
170f0 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72  ];......if (curr
17100 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b  _attr->pValue) {
17110 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f  ......free(curr_
17120 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09  attr->pValue);..
17130 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
17140 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
17150 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
17160 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e   {.....free(iden
17170 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
17180 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d  ttributes);....}
17190 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
171a0 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65  _certs(identitie
171b0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
171c0 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a  dentity, 1, 1);.
171d0 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64  ..}..}...free(id
171e0 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74  entities);.}..st
171f0 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
17200 6e 67 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  ng cackey_read_d
17210 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  od_identities(st
17220 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
17230 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
17240 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
17250 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b  num_dod_certs) {
17260 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
17270 63 65 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78  cert_idx, id_idx
17280 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e   = 0;...if (iden
17290 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20  tities == NULL) 
172a0 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64  {...return(num_d
172b0 6f 64 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09  od_certs * 3);..
172c0 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64  }...for (cert_id
172d0 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20  x = 0; cert_idx 
172e0 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b  < num_dod_certs;
172f0 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09   cert_idx++) {..
17300 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
17310 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
17320 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e  y = NULL;...iden
17330 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
17340 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
17350 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
17360 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  s(CKO_CERTIFICAT
17370 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b  E, &extra_certs[
17380 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30  cert_idx], 0xf00
17390 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  0 | cert_idx, &i
173a0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
173b0 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
173c0 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b  nt);...id_idx++;
173d0 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
173e0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
173f0 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  tity = NULL;...i
17400 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
17410 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
17420 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
17430 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f  utes(CKO_PUBLIC_
17440 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74  KEY, &extra_cert
17450 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66  s[cert_idx], 0xf
17460 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20  000 | cert_idx, 
17470 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
17480 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
17490 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b  ount);...id_idx+
174a0 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73  +;....identities
174b0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
174c0 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
174d0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
174e0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
174f0 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
17500 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43  ibutes(CKO_NETSC
17510 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72  APE_TRUST, &extr
17520 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78  a_certs[cert_idx
17530 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74  ], 0xf000 | cert
17540 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
17550 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
17560 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69  utes_count);...i
17570 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65  d_idx++;..}...re
17580 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a  turn(id_idx);.}.
17590 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
175a0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
175b0 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
175c0 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
175d0 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
175e0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
175f0 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74  ids_found) {..st
17600 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
17610 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
17620 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72  identities;..str
17630 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
17640 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
17650 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
17660 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c  num_ids, id_idx,
17670 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09   curr_id_type;..
17680 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
17690 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64  m_certs, num_dod
176a0 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78  _certs, cert_idx
176b0 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65  ;..int include_e
176c0 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a  xtra_certs = 0;.
176d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
176e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
176f0 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  ;...if (ids_foun
17700 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
17710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17720 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
17730 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
17740 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
17750 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
17760 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e  KEY_CARD_SLOT_IN
17770 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54  CLUDE_EXTRA_CERT
17780 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  S..include_extra
17790 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64  _certs = 1;.#end
177a0 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  if...if (getenv(
177b0 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54  "CACKEY_DOD_CERT
177c0 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20  S_ON_HW_SLOTS") 
177d0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
177e0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
177f0 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67   = 1;..}...if (g
17800 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
17810 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57  _DOD_CERTS_ON_HW
17820 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _SLOTS") != NULL
17830 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78  ) {...include_ex
17840 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  tra_certs = 0;..
17850 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
17860 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
17870 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
17880 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72   {...num_dod_cer
17890 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  ts = 0;..} else 
178a0 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  {...num_dod_cert
178b0 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61  s = sizeof(extra
178c0 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66  _certs) / sizeof
178d0 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29  (extra_certs[0])
178e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
178f0 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e  >internal) {...n
17900 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f  um_ids = cackey_
17910 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
17920 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f  ies(NULL, num_do
17930 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20  d_certs);....if 
17940 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b  (num_ids != 0) {
17950 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d  ....identities =
17960 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20   malloc(num_ids 
17970 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  * sizeof(*identi
17980 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b  ties));.....cack
17990 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
179a0 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65  tities(identitie
179b0 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  s, num_dod_certs
179c0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
179d0 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
179e0 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f  LL;...}....*ids_
179f0 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b  found = num_ids;
17a00 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74  ....return(ident
17a10 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73  ities);..}...pcs
17a20 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
17a30 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
17a40 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75  (slot, NULL, &nu
17a50 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70  m_certs);..if (p
17a60 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
17a70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43  = NULL) {.../* C
17a80 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66  onvert number of
17a90 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72   Certs to number
17aa0 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09   of objects */..
17ab0 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f  .num_ids = (CKO_
17ac0 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b  PRIVATE_KEY - CK
17ad0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20  O_CERTIFICATE + 
17ae0 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  1) * num_certs;.
17af0 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65  ...if (include_e
17b00 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09  xtra_certs) {...
17b10 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b  .num_ids += cack
17b20 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
17b30 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d  tities(NULL, num
17b40 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d  _dod_certs);...}
17b50 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d  ....identities =
17b60 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20   malloc(num_ids 
17b70 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  * sizeof(*identi
17b80 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64  ties));..../* Ad
17b90 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20  d certificates, 
17ba0 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64  public keys, and
17bb0 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66 72   private keys fr
17bc0 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72 64  om the smartcard
17bd0 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30   */...id_idx = 0
17be0 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64  ;...for (cert_id
17bf0 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20  x = 0; cert_idx 
17c00 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72  < num_certs; cer
17c10 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f  t_idx++) {....fo
17c20 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20  r (curr_id_type 
17c30 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
17c40 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20  E; curr_id_type 
17c50 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  <= CKO_PRIVATE_K
17c60 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  EY; curr_id_type
17c70 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69  ++) {.....identi
17c80 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
17c90 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
17ca0 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
17cb0 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70  curr_id_type, &p
17cc0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
17cd0 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69  ert_idx], cert_i
17ce0 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
17cf0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
17d00 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09  es_count);......
17d10 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
17d20 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
17d30 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
17d40 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  (*identities[id_
17d50 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
17d60 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79  ty));.....memcpy
17d70 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
17d80 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
17d90 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  y, &pcsc_identit
17da0 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73  ies[cert_idx], s
17db0 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
17dc0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
17dd0 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  dentity));......
17de0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
17df0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
17e00 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ->certificate = 
17e10 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e  malloc(pcsc_iden
17e20 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
17e30 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
17e40 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64  );.....memcpy(id
17e50 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17e60 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  .pcsc_identity->
17e70 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73  certificate, pcs
17e80 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
17e90 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
17ea0 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
17eb0 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
17ec0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
17ed0 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09  .....id_idx++;..
17ee0 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69  ..}...}....if (i
17ef0 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
17f00 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ts) {....CACKEY_
17f10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
17f20 63 6c 75 64 69 6e 67 20 44 6f 44 20 43 65 72 74  cluding DoD Cert
17f30 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64  ificates on hard
17f40 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09  ware slot");....
17f50 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64  .cackey_read_dod
17f60 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e  _identities(iden
17f70 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c  tities + id_idx,
17f80 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
17f90 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
17fa0 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
17fb0 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
17fc0 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64  erts, 1);....*id
17fd0 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64  s_found = num_id
17fe0 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65  s;....return(ide
17ff0 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09  ntities);..}....
18000 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a  *ids_found = 0;.
18010 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d  .return(NULL);.}
18020 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
18030 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
18040 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  itialize)(CK_VOI
18050 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29  D_PTR pInitArgs)
18060 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   {..CK_C_INITIAL
18070 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20  IZE_ARGS CK_PTR 
18080 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20  args;..uint32_t 
18090 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f  idx, highest_slo
180a0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e  t;..int mutex_in
180b0 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  it_ret;...CACKEY
180c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
180d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
180e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
180f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
18100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18110 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69  or.  Already ini
18120 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
18130 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
18140 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54  OKI_ALREADY_INIT
18150 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
18160 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20  f (pInitArgs != 
18170 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d  NULL) {...args =
18180 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65   pInitArgs;...me
18190 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67  mcpy(&cackey_arg
181a0 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28  s, args, sizeof(
181b0 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a  cackey_args));..
181c0 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
181d0 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  teMutex == NULL 
181e0 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
181f0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
18200 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
18210 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
18220 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d  ->UnlockMutex ==
18230 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
18240 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65  args->CreateMute
18250 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
18260 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  s->DestroyMutex 
18270 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
18280 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55  >LockMutex != NU
18290 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f  LL || args->Unlo
182a0 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29  ckMutex != NULL)
182b0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
182c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
182d0 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74  r. Some, but not
182e0 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70   All threading p
182f0 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
18300 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
18310 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
18320 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  _BAD);....}...}.
18330 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b  .} else {...cack
18340 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
18350 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
18360 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f  ckey_args.Destro
18370 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  yMutex = NULL;..
18380 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  .cackey_args.Loc
18390 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
183a0 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  .cackey_args.Unl
183b0 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
183c0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66  ...cackey_args.f
183d0 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66  lags = 0;..}...f
183e0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
183f0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
18400 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
18410 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
18420 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
18430 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
18440 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
18450 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20  e = 0;..}...for 
18460 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
18470 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
18480 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
18490 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
184a0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63  ; idx++) {...cac
184b0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
184c0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63  ctive = 0;...cac
184d0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
184e0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
184f0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
18500 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
18510 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
18520 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
18530 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
18540 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
18550 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
18560 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  dx].slot_reset =
18570 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
18580 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c  ts[idx].token_fl
18590 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ags = 0;...cacke
185a0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
185b0 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  el = NULL;...cac
185c0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
185d0 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a  nternal = 0;..}.
185e0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
185f0 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45  CKEY_NO_EXTRA_CE
18600 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  RTS") != NULL) {
18610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18620 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f  PRINTF("Asked no
18630 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44  t to include DoD
18640 20 63 65 72 74 69 66 69 63 61 74 65 73 22 29 3b   certificates");
18650 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69 67  ..} else {...hig
18660 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a  hest_slot = (siz
18670 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
18680 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
18690 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31  y_slots[0])) - 1
186a0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
186b0 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64  G_PRINTF("Includ
186c0 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69 6e  ing DoD certs in
186d0 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73   slot %lu", (uns
186e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67 68  igned long) high
186f0 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61  est_slot);....ca
18700 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
18710 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20  st_slot].active 
18720 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 1;...cackey_sl
18730 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
18740 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a  ].internal = 1;.
18750 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
18760 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62  ighest_slot].lab
18770 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  el = (unsigned c
18780 68 61 72 20 2a 29 20 22 44 6f 44 20 43 65 72 74  har *) "DoD Cert
18790 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63  ificates";...cac
187a0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
187b0 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  t_slot].pcsc_rea
187c0 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  der = "CACKey";.
187d0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
187e0 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b  ighest_slot].tok
187f0 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  en_flags = 0;..}
18800 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  ...cackey_initia
18810 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20  lized = 1;...if 
18820 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  (!cackey_biglock
18830 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78  _init) {...mutex
18840 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b  _init_ret = cack
18850 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
18860 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  &cackey_biglock)
18870 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69  ;....if (mutex_i
18880 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
18890 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
188a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
188b0 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  Mutex initializa
188c0 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a  tion failed.");.
188d0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
188e0 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a  ANT_LOCK);...}..
188f0 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  ..cackey_biglock
18900 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09  _init = 1;..}...
18910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18920 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
18930 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
18940 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
18950 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
18960 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
18970 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29  _RV, C_Finalize)
18980 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65  (CK_VOID_PTR pRe
18990 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33  served) {..uint3
189a0 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
189b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
189c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
189d0 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
189e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
189f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18a00 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
18a10 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
18a20 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
18a30 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
18a40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
18a50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
18a60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18a70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
18a80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
18a90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
18aa0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
18ab0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  LIZED);..}...for
18ac0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
18ad0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
18ae0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
18af0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
18b00 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
18b10 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
18b20 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
18b30 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73  ive) {....C_Clos
18b40 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
18b50 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  .}..}...cackey_s
18b60 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
18b70 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64  all();...for (id
18b80 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
18b90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
18ba0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
18bb0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
18bc0 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
18bd0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
18be0 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63  internal) {....c
18bf0 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
18c00 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
18c10 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
18c20 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  r) {....free(cac
18c30 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
18c40 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d  csc_reader);...}
18c50 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
18c60 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
18c70 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63  _certs) {....cac
18c80 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63  key_free_certs(c
18c90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
18ca0 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63  .cached_certs, c
18cb0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
18cc0 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  .cached_certs_co
18cd0 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63  unt, 1);.....cac
18ce0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63  key_slots[idx].c
18cf0 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55  ached_certs = NU
18d00 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  LL;...}..}...cac
18d10 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
18d20 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  ect();...cackey_
18d30 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
18d40 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18d50 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18d60 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
18d70 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
18d80 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
18d90 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
18da0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66  (CK_RV, C_GetInf
18db0 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70  o)(CK_INFO_PTR p
18dc0 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
18dd0 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
18de0 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
18df0 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
18e00 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
18e10 38 43 48 41 52 20 6c 69 62 72 61 72 79 44 65 73  8CHAR libraryDes
18e20 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41  cription[] = "CA
18e30 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f  CKey";...CACKEY_
18e40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
18e50 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
18e60 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
18e70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18e80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
18e90 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
18ea0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
18eb0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
18ec0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
18ed0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
18ee0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18ef0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
18f00 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
18f10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
18f20 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
18f30 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70  IALIZED);..}...p
18f40 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65  Info->cryptokiVe
18f50 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28  rsion.major = ((
18f60 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
18f70 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
18f80 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
18f90 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72  nfo->cryptokiVer
18fa0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43  sion.minor = ((C
18fb0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
18fc0 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
18fd0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d  8) & 0xff;...mem
18fe0 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
18ff0 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
19000 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
19010 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
19020 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
19030 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d  anufacturerID, m
19040 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73  anufacturerID, s
19050 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72  izeof(manufactur
19060 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49  erID) - 1);...pI
19070 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30  nfo->flags = 0x0
19080 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  0;...memset(pInf
19090 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
190a0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
190b0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  of(pInfo->librar
190c0 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  yDescription));.
190d0 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
190e0 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
190f0 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  n, libraryDescri
19100 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69  ption, sizeof(li
19110 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
19120 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
19130 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
19140 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
19150 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
19160 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
19170 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
19180 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
19190 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
191a0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
191b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
191c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
191d0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
191e0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
191f0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  KR_OK);.}../*. *
19200 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66   Process list of
19210 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72   readers, and cr
19220 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74  eate mapping bet
19230 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65  ween reader name
19240 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f   and slot ID. */
19250 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
19260 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
19270 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f  SlotList)(CK_BBO
19280 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c  OL tokenPresent,
19290 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
192a0 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c  pSlotList, CK_UL
192b0 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
192c0 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20  ) {..static int 
192d0 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a  first_call = 1;.
192e0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
192f0 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  l;..int pcsc_con
19300 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c  nect_ret;..CK_UL
19310 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  ONG count, slot_
19320 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73  count = 0, currs
19330 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09  lot, slot_idx;..
19340 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
19350 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72  rs, *pcsc_reader
19360 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65  s_s, *pcsc_reade
19370 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 73  rs_e;..DWORD pcs
19380 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09  c_readers_len;..
19390 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72  LONG scard_listr
193a0 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a  eaders_ret;..siz
193b0 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f  e_t curr_reader_
193c0 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72  len;..int slot_r
193d0 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  eset;...CACKEY_D
193e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
193f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75  led.");...if (pu
19400 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
19410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19430 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
19440 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19450 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
19460 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
19470 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
19480 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19490 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
194a0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
194b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
194c0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
194d0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
194e0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
194f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
19500 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19510 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
19520 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
19530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
19550 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
19560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19570 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
19580 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69  .}.../* Clear li
19590 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09  st of slots */..
195a0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
195b0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
195c0 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61  {...if (first_ca
195d0 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63  ll) {....first_c
195e0 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f  all = 0;.....slo
195f0 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d  t_reset = 1;...}
19600 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..../* If any of
19610 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20   the slots have 
19620 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20  been reset then 
19630 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  purge all inform
19640 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20  ation and check 
19650 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28  again */...for (
19660 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
19670 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
19680 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
19690 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
196a0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
196b0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  lot++) {....if (
196c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
196d0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
196e0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
196f0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
19700 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
19710 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
19720 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
19730 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65  .}.....if (cacke
19740 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
19750 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
19760 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ....slot_reset =
19770 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a   1;......break;.
19780 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
19790 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
197a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
197b0 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c  INTF("Purging al
197c0 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  l slot informati
197d0 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e  on.");...../* On
197e0 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
197f0 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
19800 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
19810 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
19820 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
19830 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c   */....cackey_sl
19840 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
19850 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63  ll();.....for (c
19860 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
19870 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
19880 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
19890 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
198a0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
198b0 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  ot++) {.....if (
198c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
198d0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
198e0 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65   {......continue
198f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
19900 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
19910 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
19920 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65  der) {......free
19930 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
19940 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
19950 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b  der);.......cack
19960 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
19970 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
19980 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
19990 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
199a0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
199b0 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  el) {......free(
199c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
199d0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a  rslot].label);..
199e0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
199f0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
19a00 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  l = NULL;.....}.
19a10 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
19a20 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
19a30 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  ve = 0;....}...}
19a40 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a   else {.......}.
19a50 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
19a60 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
19a70 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
19a80 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
19a90 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
19aa0 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
19ab0 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
19ac0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
19ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19ae0 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
19af0 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20  o PC/SC failed, 
19b00 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74  assuming no slot
19b10 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75  s");....slot_cou
19b20 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  nt = 0;..} else 
19b30 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  {...pcsc_readers
19b40 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61  _len = 0;....sca
19b50 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19b60 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
19b70 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
19b80 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
19b90 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61   NULL, &pcsc_rea
19ba0 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  ders_len);....if
19bb0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
19bc0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
19bd0 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b  _F_COMM_ERROR) {
19be0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19bf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19c00 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
19c10 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
19c20 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20  D_F_COMM_ERROR, 
19c30 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74  assuming Connect
19c40 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e  ion to PC/SC wen
19c50 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63  t away. Reconnec
19c60 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63  ting.");.....cac
19c70 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
19c80 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79  ect();....cackey
19c90 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
19ca0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19cb0 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67  G_PRINTF("Trying
19cc0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
19cd0 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09  s() again");....
19ce0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
19cf0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
19d00 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
19d10 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
19d20 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
19d30 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
19d40 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  }....if (scard_l
19d50 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
19d60 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
19d70 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72  S && pcsc_reader
19d80 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  s_len != 0) {...
19d90 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20  .pcsc_readers = 
19da0 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64  malloc(pcsc_read
19db0 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73  ers_len);....pcs
19dc0 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63  c_readers_s = pc
19dd0 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09  sc_readers;.....
19de0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
19df0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
19e00 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
19e10 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
19e20 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  LL, pcsc_readers
19e30 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
19e40 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61  len);....if (sca
19e50 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19e60 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
19e70 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73  CCESS) {.....pcs
19e80 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63  c_readers_e = pc
19e90 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73  sc_readers + pcs
19ea0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a  c_readers_len;..
19eb0 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74  ..../* Start wit
19ec0 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20  h Slot ID 1, to 
19ed0 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47  avoid a bug in G
19ee0 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09  DM on RHEL */...
19ef0 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
19f00 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
19f10 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
19f20 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
19f30 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73  911 */.....currs
19f40 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f  lot = 1;.....slo
19f50 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  t_count = 0;....
19f60 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61  .while (pcsc_rea
19f70 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64  ders < pcsc_read
19f80 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a  ers_e) {....../*
19f90 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 6c   Find next avail
19fa0 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09  able slot */....
19fb0 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f  ..for (; currslo
19fc0 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
19fd0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
19fe0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
19ff0 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
1a000 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63  ) {.......if (!c
1a010 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1a020 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1a030 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1a040 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09  ....}......}....
1a050 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  ...curr_reader_l
1a060 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63  en = strlen(pcsc
1a070 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09  _readers);......
1a080 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 65  .if ((pcsc_reade
1a090 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72  rs + curr_reader
1a0a0 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61  _len) > pcsc_rea
1a0b0 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09  ders_e) {.......
1a0c0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
1a0d0 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 61  ....if (curr_rea
1a0e0 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  der_len == 0) {.
1a0f0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1a100 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
1a110 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f  rrslot >= (sizeo
1a120 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1a130 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1a140 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1a150 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a160 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d  _PRINTF("Found m
1a170 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61 6e  ore readers than
1a180 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c   slots are avail
1a190 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09  able!");........
1a1a0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
1a1b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a1c0 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72  _PRINTF("Found r
1a1d0 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63 73 63  eader: %s", pcsc
1a1e0 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09  _readers);......
1a1f0 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
1a200 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
1a210 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
1a220 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64  ally being asked
1a230 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
1a240 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1a250 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
1a260 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  st) {.......if (
1a270 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1a280 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1a290 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1a2a0 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63  ve = 1;........c
1a2b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1a2c0 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  slot].internal =
1a2d0 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
1a2e0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1a2f0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1a300 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64  strdup(pcsc_read
1a310 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63  ers);........cac
1a320 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1a330 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot].pcsc_card_co
1a340 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09  nnected = 0;....
1a350 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1a360 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73  [currslot].trans
1a370 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
1a380 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1a390 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1a3a0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
1a3b0 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
1a3c0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1a3d0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65  s[currslot].toke
1a3e0 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
1a3f0 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09  GIN_REQUIRED;...
1a400 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1a410 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1a420 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  l = NULL;.......
1a430 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
1a440 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79  ot_reset(&cackey
1a450 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1a460 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  );.......}......
1a470 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 2f  } else {......./
1a480 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69  * Artificially i
1a490 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62  ncrease the numb
1a4a0 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f  er of active slo
1a4b0 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20  ts by what will 
1a4c0 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f  become active */
1a4d0 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e  .......slot_coun
1a4e0 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  t++;......}.....
1a4f0 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09  .currslot++;....
1a500 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
1a510 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
1a520 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  en + 1;.....}...
1a530 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
1a540 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
1a550 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1a560 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1a570 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1a580 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1a590 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
1a5a0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1a5b0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
1a5c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a5d0 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69  INTF("Found acti
1a5e0 76 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75  ve slot %lu", (u
1a5f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1a600 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09  rrslot);........
1a610 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09  slot_count++;...
1a620 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20  ...}.....}....} 
1a630 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
1a640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a650 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
1a660 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
1a670 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
1a680 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
1a690 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
1a6a0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
1a6b0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
1a6c0 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
1a6d0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
1a6e0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
1a6f0 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
1a700 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
1a710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a720 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
1a730 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1a740 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
1a750 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
1a760 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
1a770 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
1a780 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1a790 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
1a7a0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1a7b0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
1a7c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1a7d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1a7e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1a7f0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1a800 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1a810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a820 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1a830 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1a840 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1a850 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1a860 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
1a870 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
1a880 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
1a890 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
1a8a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1a8b0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1a8c0 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65  ).  Found %lu re
1a8d0 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73  aders, but not s
1a8e0 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f  toring IDs (pSlo
1a8f0 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c  tList == NULL)",
1a900 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e   CKR_OK, (unsign
1a910 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f  ed long) slot_co
1a920 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
1a930 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f  CKR_OK);..}...co
1a940 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b  unt = *pulCount;
1a950 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c  ..if (count < sl
1a960 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41  ot_count) {...CA
1a970 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a980 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61  F("Error. User a
1a990 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74  llocated %lu ent
1a9a0 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76  ries, but we hav
1a9b0 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c  e %lu entries.",
1a9c0 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75   count, slot_cou
1a9d0 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  nt);....CACKEY_D
1a9e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1a9f0 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
1aa00 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a  R_TOO_SMALL");..
1aa10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
1aa20 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09  FER_TOO_SMALL);.
1aa30 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1aa40 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1aa50 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1aa60 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1aa70 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1aa80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1aa90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1aaa0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1aab0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1aac0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1aad0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20  ;..}...slot_idx 
1aae0 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73  = 0;..for (currs
1aaf0 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c  lot = 0; (currsl
1ab00 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
1ab10 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1ab20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ab30 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74  [0]))); currslot
1ab40 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63  ++) {...if (!cac
1ab50 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1ab60 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  ot].active) {...
1ab70 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1ab80 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e  ..if (slot_idx >
1ab90 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  = count) {....CA
1aba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1abb0 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61  F("Error. User a
1abc0 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74  llocated %lu ent
1abd0 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73  ries, but we jus
1abe0 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 74 65  t tried to write
1abf0 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65   to the %lu inde
1ac00 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20  x -- ignoring", 
1ac10 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29  count, slot_idx)
1ac20 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
1ac30 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74  ..}....pSlotList
1ac40 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72  [slot_idx] = cur
1ac50 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64  rslot;...slot_id
1ac60 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  x++;..}...mutex_
1ac70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1ac80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ac90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1aca0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1acb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1acc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1acd0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1ace0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1acf0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1ad00 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a  L_ERROR);..}...*
1ad10 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
1ad20 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  count;...CACKEY_
1ad30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ad40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1ad50 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
1ad60 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f  readers.", CKR_O
1ad70 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  K, (unsigned lon
1ad80 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a  g) slot_count);.
1ad90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1ada0 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74  ;...tokenPresent
1adb0 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b   = tokenPresent;
1adc0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
1add0 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
1ade0 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
1adf0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ae00 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66  RV, C_GetSlotInf
1ae10 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
1ae20 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e  otID, CK_SLOT_IN
1ae30 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1ae40 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1ae50 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74  HAR slotDescript
1ae60 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20  ion[] = "CACKey 
1ae70 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65  Slot";..int mute
1ae80 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62  x_retval;..int b
1ae90 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09  ytes_to_copy;...
1aea0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1aeb0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1aec0 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
1aed0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1aee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1aef0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
1af00 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1af10 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1af20 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1af30 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1af40 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1af50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1af60 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1af70 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1af80 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1af90 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1afa0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
1afb0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1afc0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1afd0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1afe0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1aff0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1b000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b010 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1b020 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1b030 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1b040 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1b050 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1b060 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1b070 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1b080 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1b090 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1b0a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1b0b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1b0c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1b0d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b0e0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1b0f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b100 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1b110 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1b120 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1b130 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1b140 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b150 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b160 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1b170 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1b180 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1b190 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1b1a0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1b1b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1b1c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1b1d0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1b1e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1b1f0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1b200 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66  KF_HW_SLOT;...if
1b210 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
1b220 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c  slotID].internal
1b230 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
1b240 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41  gs |= CKF_REMOVA
1b250 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a  BLE_DEVICE;..}..
1b260 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
1b270 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
1b280 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
1b290 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
1b2a0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
1b2b0 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
1b2c0 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52   |= CKF_TOKEN_PR
1b2d0 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65  ESENT;..}...byte
1b2e0 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c  s_to_copy = strl
1b2f0 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  en(cackey_slots[
1b300 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61  slotID].pcsc_rea
1b310 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f  der);..if (sizeo
1b320 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1b330 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73  turerID) < bytes
1b340 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79  _to_copy) {...by
1b350 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69  tes_to_copy = si
1b360 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1b370 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a  facturerID);..}.
1b380 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1b390 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63  anufacturerID, c
1b3a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1b3b0 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c  ID].pcsc_reader,
1b3c0 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
1b3d0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1b3e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1b3f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1b400 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1b410 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1b420 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b430 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1b440 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1b450 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b460 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1b470 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
1b480 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
1b490 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
1b4a0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
1b4b0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
1b4c0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
1b4d0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
1b4e0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
1b4f0 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
1b500 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
1b510 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
1b520 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
1b530 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1b540 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
1b550 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
1b560 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1b570 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
1b580 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
1b590 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
1b5a0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
1b5b0 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
1b5c0 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
1b5d0 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
1b5e0 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
1b5f0 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
1b600 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1b610 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1b620 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0x00;...CACKEY_D
1b630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1b640 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1b650 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1b660 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1b670 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1b680 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1b690 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f  etTokenInfo)(CK_
1b6a0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
1b6b0 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54  CK_TOKEN_INFO_PT
1b6c0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1b6d0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1b6e0 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
1b6f0 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
1b700 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
1b710 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74  UTF8CHAR default
1b720 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f  Label[] = "Unkno
1b730 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74  wn Token";..stat
1b740 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1b750 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f  odel[] = "CAC To
1b760 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61  ken";..struct ca
1b770 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
1b780 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
1b790 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
1b7a0 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
1b7b0 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65  ssize_t label_re
1b7c0 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
1b7d0 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64  tval;..int use_d
1b7e0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09  efault_label;...
1b7f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b800 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1b810 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
1b820 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1b830 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b840 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
1b850 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1b860 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1b870 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1b880 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1b890 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1b8a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b8b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1b8c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1b8d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1b8e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1b8f0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
1b900 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1b910 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1b920 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1b930 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1b940 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1b950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b960 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1b970 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1b980 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1b990 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1b9a0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1b9b0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1b9c0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1b9d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1b9e0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1b9f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ba00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ba10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ba20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ba30 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1ba40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ba50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1ba60 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1ba70 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1ba80 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1ba90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1baa0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bab0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1bac0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1bad0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1bae0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1baf0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1bb00 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1bb10 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1bb20 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1bb30 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1bb40 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
1bb50 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
1bb60 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
1bb70 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
1bb80 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
1bb90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bba0 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e  PRINTF("No token
1bbb0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73   is present in s
1bbc0 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c  lotID = %lu", sl
1bbd0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1bbe0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1bbf0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1bc00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
1bc10 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b  EN_NOT_PRESENT);
1bc20 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1bc30 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1bc40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1bc50 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1bc60 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1bc70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1bc80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1bc90 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1bca0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1bcb0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1bcc0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  ROR);..}.../* De
1bcd0 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61  termine token la
1bce0 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69  bel from certifi
1bcf0 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74  cates */..memset
1bd00 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27  (pInfo->label, '
1bd10 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1bd20 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f  ->label));..use_
1bd30 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
1bd40 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  1;...if (cackey_
1bd50 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1bd60 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel == NULL) {..
1bd70 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  .pcsc_identities
1bd80 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63   = cackey_read_c
1bd90 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  erts(&cackey_slo
1bda0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c  ts[slotID], NULL
1bdb0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
1bdc0 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
1bdd0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
1bde0 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ...if (num_certs
1bdf0 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65   > 0) {.....labe
1be00 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  l_ret = cackey_p
1be10 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
1be20 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74  label(pcsc_ident
1be30 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61  ities, pInfo->la
1be40 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
1be50 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  o->label));.....
1be60 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20  if (label_ret > 
1be70 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65  0) {......use_de
1be80 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b  fault_label = 0;
1be90 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1bea0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1beb0 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
1bec0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
1bed0 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63  ;.......memcpy(c
1bee0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1bef0 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f  ID].label, pInfo
1bf00 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ->label, sizeof(
1bf10 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
1bf20 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63  ....}....}.....c
1bf30 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1bf40 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1bf50 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
1bf60 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
1bf70 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
1bf80 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  abel, cackey_slo
1bf90 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1bfa0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1bfb0 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f  label));....use_
1bfc0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
1bfd0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f  0;..}...if (use_
1bfe0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b  default_label) {
1bff0 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ...memcpy(pInfo-
1c000 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c  >label, defaultL
1c010 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66  abel, sizeof(def
1c020 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b  aultLabel) - 1);
1c030 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
1c040 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1c050 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1c060 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1c070 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
1c080 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1c090 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
1c0a0 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
1c0b0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
1c0c0 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
1c0d0 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c  nfo->model, ' ',
1c0e0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1c0f0 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28  odel));..memcpy(
1c100 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f  pInfo->model, mo
1c110 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65  del, sizeof(mode
1c120 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  l) - 1);...memse
1c130 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  t(pInfo->serialN
1c140 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65  umber, ' ', size
1c150 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  of(pInfo->serial
1c160 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73  Number));...mems
1c170 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  et(pInfo->utcTim
1c180 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  e, ' ', sizeof(p
1c190 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b  Info->utcTime));
1c1a0 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
1c1b0 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1c1c0 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
1c1d0 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
1c1e0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
1c1f0 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
1c200 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
1c210 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
1c220 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
1c230 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
1c240 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
1c250 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1c260 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1c270 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0x00;...pInfo->f
1c280 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45  lags = CKF_WRITE
1c290 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46  _PROTECTED | CKF
1c2a0 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41  _USER_PIN_INITIA
1c2b0 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45  LIZED | CKF_TOKE
1c2c0 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
1c2d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1c2e0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1c2f0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ;...pInfo->ulMax
1c300 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28  SessionCount = (
1c310 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1c320 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1c330 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1c340 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66  [0])) - 1;..pInf
1c350 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e  o->ulSessionCoun
1c360 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
1c370 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1c380 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53  .pInfo->ulMaxRwS
1c390 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b  essionCount = 0;
1c3a0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73  ..pInfo->ulRwSes
1c3b0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
1c3c0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1c3d0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1c3e0 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32  ulMaxPinLen = 12
1c3f0 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  8;..pInfo->ulMin
1c400 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e  PinLen = 0;..pIn
1c410 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69  fo->ulTotalPubli
1c420 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  cMemory = CK_UNA
1c430 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1c440 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
1c450 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79  FreePublicMemory
1c460 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1c470 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1c480 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72  pInfo->ulTotalPr
1c490 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b  ivateMemory = CK
1c4a0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1c4b0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
1c4c0 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d  ->ulFreePrivateM
1c4d0 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
1c4e0 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
1c4f0 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ON;...CACKEY_DEB
1c500 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c510 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1c520 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1c530 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1c540 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c550 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69  ION(CK_RV, C_Wai
1c560 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43  tForSlotEvent)(C
1c570 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
1c580 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
1c590 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50  lotID, CK_VOID_P
1c5a0 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a  TR pReserved) {.
1c5b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c5c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c5d0 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64  ...if (pReserved
1c5e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1c5f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c600 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72  F("Error. pReser
1c610 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ved is not NULL.
1c620 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c630 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1c640 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1c650 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1c660 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c670 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c680 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1c690 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c6a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1c6b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1c6c0 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a  .../* XXX: TODO:
1c6d0 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e   Implement this.
1c6e0 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45  .. */..CACKEY_DE
1c6f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1c700 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1c710 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1c720 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1c730 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1c740 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1c750 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1c760 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1c770 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c780 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63  (CK_RV, C_GetMec
1c790 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53  hanismList)(CK_S
1c7a0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1c7b0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45  K_MECHANISM_TYPE
1c7c0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c  _PTR pMechanismL
1c7d0 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ist, CK_ULONG_PT
1c7e0 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  R pulCount) {..C
1c7f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c800 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c810 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c820 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c840 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c850 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c860 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c870 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c880 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1c890 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  (pulCount == NUL
1c8a0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1c8b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c8c0 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  r.  pulCount is 
1c8d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1c8e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1c8f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1c900 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d  pMechanismList =
1c910 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
1c920 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41  Count = 1;....CA
1c930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c940 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c950 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1c960 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
1c970 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
1c980 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b  *pulCount < 1) {
1c990 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c9a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c9b0 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c  Buffer too small
1c9c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c9d0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1c9e0 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68  ALL);..}...pMech
1c9f0 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43  anismList[0] = C
1ca00 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70  KM_RSA_PKCS;..*p
1ca10 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43  ulCount = 1;...C
1ca20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ca30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ca40 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1ca50 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1ca60 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1ca70 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ca80 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  RV, C_GetMechani
1ca90 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  smInfo)(CK_SLOT_
1caa0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45  ID slotID, CK_ME
1cab0 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70  CHANISM_TYPE typ
1cac0 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  e, CK_MECHANISM_
1cad0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
1cae0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
1caf0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
1cb00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1cb10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
1cb20 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
1cb30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cb40 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
1cb50 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
1cb60 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1cb70 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1cb80 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1cb90 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1cba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cbb0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1cbc0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1cbd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1cbe0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1cbf0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1cc00 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
1cc10 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
1cc20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1cc30 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1cc40 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
1cc50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cc60 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1cc70 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1cc80 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
1cc90 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
1cca0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
1ccb0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1ccc0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1ccd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1cce0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1ccf0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1cd00 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1cd10 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1cd20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cd30 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1cd40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1cd50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1cd60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1cd70 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1cd80 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
1cd90 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1cda0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cdb0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1cdc0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1cdd0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
1cde0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
1cdf0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1ce00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1ce10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1ce20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ce30 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
1ce40 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1ce50 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1ce60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ce70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ce80 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ce90 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1cea0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ceb0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1cec0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ced0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1cee0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
1cef0 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61  ch (type) {...ca
1cf00 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
1cf10 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e  ....pInfo->ulMin
1cf20 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09  KeySize = 512;..
1cf30 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65  ..pInfo->ulMaxKe
1cf40 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09  ySize = 8192;...
1cf50 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1cf60 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43  CKF_HW | CKF_ENC
1cf70 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59  RYPT | CKF_DECRY
1cf80 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20  PT | CKF_SIGN | 
1cf90 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62  CKF_VERIFY;....b
1cfa0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  reak;..}...CACKE
1cfb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cfc0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1cfd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1cfe0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1cff0 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
1d000 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
1d010 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
1d020 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1d030 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29  RV, C_InitToken)
1d040 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
1d050 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  ID, CK_UTF8CHAR_
1d060 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
1d070 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f  NG ulPinLen, CK_
1d080 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61  UTF8CHAR_PTR pLa
1d090 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  bel) {..CACKEY_D
1d0a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d0b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1d0c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1d0d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1d0e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d0f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1d100 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1d110 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1d120 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1d130 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1d140 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d150 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
1d160 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
1d170 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
1d180 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
1d190 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
1d1a0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1d1b0 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  CTED);.}../* We 
1d1c0 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
1d1d0 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
1d1e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1d1f0 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49  (CK_RV, C_InitPI
1d200 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  N)(CK_SESSION_HA
1d210 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1d220 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
1d230 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
1d240 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
1d250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d260 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1d270 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1d280 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1d290 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d2a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1d2b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1d2c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1d2d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1d2e0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1d2f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1d300 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45  turning CKR_TOKE
1d310 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
1d320 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b  D (%i)", CKR_TOK
1d330 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
1d340 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1d350 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1d360 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  OTECTED);.}../* 
1d370 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
1d380 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
1d390 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1d3a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
1d3b0 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  PIN)(CK_SESSION_
1d3c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1d3d0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
1d3e0 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f   pOldPin, CK_ULO
1d3f0 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20  NG ulOldPinLen, 
1d400 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
1d410 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  pNewPin, CK_ULON
1d420 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b  G ulNewPinLen) {
1d430 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d440 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1d450 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1d460 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1d470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d480 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1d490 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1d4a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d4b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1d4c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1d4d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d4e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1d4f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1d500 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1d510 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1d520 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1d530 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1d540 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1d550 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1d560 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1d570 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28   C_OpenSession)(
1d580 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1d590 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  D, CK_FLAGS flag
1d5a0 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  s, CK_VOID_PTR p
1d5b0 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f  Application, CK_
1d5c0 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43  NOTIFY notify, C
1d5d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1d5e0 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20  _PTR phSession) 
1d5f0 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
1d600 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
1d610 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f  _retval;..int fo
1d620 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b  und_session = 0;
1d630 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d640 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d650 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20  );...if ((flags 
1d660 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  & CKF_SERIAL_SES
1d670 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52  SION) != CKF_SER
1d680 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09  IAL_SESSION) {..
1d690 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1d6a0 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54  ION_PARALLEL_NOT
1d6b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a  _SUPPORTED);..}.
1d6c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1d6d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1d6e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d6f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1d700 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1d710 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1d720 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1d730 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1d740 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1d750 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1d760 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1d770 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1d780 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1d790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d7a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1d7b0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1d7c0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1d7d0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1d7e0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1d7f0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1d800 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1d810 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1d820 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1d830 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d840 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1d850 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1d860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d870 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1d880 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1d890 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1d8a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1d8b0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1d8c0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1d8d0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1d8e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d8f0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1d900 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1d910 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1d920 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1d930 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1d940 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d950 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d960 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d970 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1d980 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
1d990 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20  y that the card 
1d9a0 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74  is actually in t
1d9b0 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20  he slot. */../* 
1d9c0 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61  XXX: Check to ma
1d9d0 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
1d9e0 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73  in the PKCS#11 s
1d9f0 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a  pecification */.
1da00 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
1da10 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
1da20 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
1da30 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1da40 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
1da50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1da60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1da70 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e   Card not presen
1da80 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b  t.  Returning CK
1da90 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
1daa0 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
1dab0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1dac0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1dad0 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45  eturn(CKR_DEVICE
1dae0 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09  _REMOVED);..}...
1daf0 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64  for (idx = 1; id
1db00 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1db10 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1db20 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1db30 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
1db40 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
1db50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1db60 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f  .active) {....fo
1db70 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b  und_session = 1;
1db80 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20  .....*phSession 
1db90 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65  = idx;.....cacke
1dba0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1dbb0 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63  active = 1;....c
1dbc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1dbd0 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f  dx].slotID = slo
1dbe0 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  tID;....cackey_s
1dbf0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61  essions[idx].sta
1dc00 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
1dc10 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63  IC_SESSION;....c
1dc20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1dc30 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67  dx].flags = flag
1dc40 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  s;....cackey_ses
1dc50 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76  sions[idx].ulDev
1dc60 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09  iceError = 0;...
1dc70 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1dc80 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69  [idx].pApplicati
1dc90 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f  on = pApplicatio
1dca0 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  n;....cackey_ses
1dcb0 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66  sions[idx].Notif
1dcc0 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09  y = notify;.....
1dcd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1dce0 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
1dcf0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
1dd00 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1dd10 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1dd20 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
1dd30 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
1dd40 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30  earch_active = 0
1dd50 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
1dd60 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f  sions[idx].sign_
1dd70 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
1dd80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1dd90 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  idx].decrypt_act
1dda0 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
1ddb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1ddc0 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
1ddd0 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
1dde0 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
1ddf0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
1de00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1de10 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
1de20 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b  unt);......break
1de30 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
1de40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1de50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1de60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1de70 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1de80 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1de90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1dea0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1deb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1dec0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1ded0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1dee0 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69  if (!found_sessi
1def0 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  on) {...CACKEY_D
1df00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1df10 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49  urning CKR_SESSI
1df20 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20  ON_COUNT (%i)", 
1df30 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
1df40 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  T);....return(CK
1df50 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
1df60 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1df70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1df80 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1df90 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1dfa0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1dfb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1dfc0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
1dfd0 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  oseSession)(CK_S
1dfe0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1dff0 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d  ession) {..int m
1e000 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1e010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e020 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e030 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1e040 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1e050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e060 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1e070 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1e080 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1e090 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1e0a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1e0b0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
1e0c0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
1e0d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1e0e0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1e0f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e100 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1e110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e120 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
1e130 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
1e140 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1e150 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1e160 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1e170 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1e180 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1e190 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1e1a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1e1b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1e1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e1d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1e1e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1e1f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e200 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1e210 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1e220 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1e230 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1e240 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e250 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1e260 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e270 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1e280 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1e290 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1e2a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1e2b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1e2c0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
1e2d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1e2e0 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tive = 0;..cacke
1e2f0 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
1e300 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s(cackey_session
1e310 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
1e320 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73  tities, cackey_s
1e330 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e340 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
1e350 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  nt);...mutex_ret
1e360 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1e370 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1e380 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1e390 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1e3a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e3b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e3c0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1e3d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e3e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e3f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1e400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e410 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e420 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1e430 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1e440 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1e450 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1e460 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
1e470 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ons)(CK_SLOT_ID 
1e480 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33  slotID) {..uint3
1e490 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  2_t idx;..int mu
1e4a0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
1e4b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e4c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1e4d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e4e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e4f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e500 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e510 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e520 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e530 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e540 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1e550 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1e560 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1e570 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1e580 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1e590 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1e5a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e5b0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1e5c0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1e5d0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1e5e0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1e5f0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1e600 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1e610 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1e620 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e630 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1e640 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e650 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1e660 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1e670 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e680 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1e690 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e6a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e6b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e6c0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1e6d0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1e6e0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1e6f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e700 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1e710 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1e720 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1e730 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1e740 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1e750 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1e760 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e770 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1e780 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1e790 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1e7a0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
1e7b0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1e7c0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e7d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1e7e0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1e7f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1e800 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
1e810 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1e820 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
1e830 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a  ID != slotID) {.
1e840 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1e850 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  .}.....cackey_mu
1e860 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1e870 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43  y_biglock);....C
1e880 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
1e890 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  x);....cackey_mu
1e8a0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1e8b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d  biglock);...}..}
1e8c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1e8d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1e8e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1e8f0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1e900 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1e910 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e920 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e930 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1e940 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e950 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1e960 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1e970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1e980 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1e990 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1e9a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1e9b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1e9c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1e9d0 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43  etSessionInfo)(C
1e9e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1e9f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45   hSession, CK_SE
1ea00 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  SSION_INFO_PTR p
1ea10 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
1ea20 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1ea30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1ea50 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1ea60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ea70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ea80 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1ea90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1eaa0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1eab0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1eac0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1ead0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1eae0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1eaf0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1eb00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1eb10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1eb20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1eb30 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1eb40 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1eb50 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1eb60 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1eb70 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1eb80 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1eb90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1eba0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ebb0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1ebc0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1ebd0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1ebe0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1ebf0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1ec00 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1ec10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1ec20 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1ec30 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1ec40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ec50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1ec60 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1ec70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ec80 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1ec90 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1eca0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ecb0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1ecc0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1ecd0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1ece0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1ecf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ed00 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1ed10 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1ed20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1ed30 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1ed40 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ID);..}...pInfo-
1ed50 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  >slotID = cackey
1ed60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ed70 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e  on].slotID;..pIn
1ed80 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b  fo->state = cack
1ed90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1eda0 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49  sion].state;..pI
1edb0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63  nfo->flags = cac
1edc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1edd0 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70  ssion].flags;..p
1ede0 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72  Info->ulDeviceEr
1edf0 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ror = cackey_ses
1ee00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ee10 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a  ulDeviceError;..
1ee20 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1ee30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1ee40 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1ee50 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1ee60 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1ee70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ee80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1ee90 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1eea0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1eeb0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1eec0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1eed0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1eee0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1eef0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1ef00 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1ef10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1ef20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1ef30 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
1ef40 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1ef50 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1ef60 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
1ef70 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
1ef80 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69  G_PTR pulOperati
1ef90 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43  onStateLen) {..C
1efa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1efb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1efc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1efd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...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 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1f000 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1f010 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1f020 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1f030 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1f040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f050 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1f060 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f070 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1f080 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f090 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1f0a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1f0b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1f0c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1f0d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f0e0 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
1f0f0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1f100 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1f110 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
1f120 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
1f130 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e  LONG ulOperation
1f140 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a  StateLen, CK_OBJ
1f150 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72  ECT_HANDLE hEncr
1f160 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42  yptionKey, CK_OB
1f170 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74  JECT_HANDLE hAut
1f180 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20  henticationKey) 
1f190 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1f1a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f1b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1f1c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1f1d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f1e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1f1f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1f200 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f210 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1f220 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f240 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1f250 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f260 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1f270 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1f280 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1f290 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1f2a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1f2b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1f2c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f2d0 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45  , C_Login)(CK_SE
1f2e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1f2f0 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54  ssion, CK_USER_T
1f300 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b  YPE userType, CK
1f310 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
1f320 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
1f330 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f  inLen) {..CK_SLO
1f340 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e  T_ID slotID;..in
1f350 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1f360 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
1f370 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e  ning;..int login
1f380 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
1f390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1f3a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1f3b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f3c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1f3d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f3e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1f3f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1f400 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1f410 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f420 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1f430 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1f440 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1f450 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1f460 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1f470 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
1f480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f490 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f4a0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
1f4b0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
1f4c0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1f4d0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1f4e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
1f4f0 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
1f500 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f510 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f520 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
1f530 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
1f540 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
1f550 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1f560 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
1f570 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
1f580 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
1f590 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1f5a0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1f5b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f5c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1f5d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f5e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f5f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1f600 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f610 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f620 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f630 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1f640 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1f650 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
1f660 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1f670 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1f680 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
1f690 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f6a0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
1f6b0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
1f6c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1f6d0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1f6e0 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ID);..}...slotID
1f6f0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1f700 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1f710 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
1f720 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
1f730 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1f740 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1f750 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1f760 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1f770 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f780 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1f790 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1f7a0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
1f7b0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
1f7c0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
1f7d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1f7e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1f7f0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f800 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1f810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f820 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1f830 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1f840 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1f850 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1f860 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1f870 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1f880 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1f890 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1f8a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1f8b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  RROR);..}...logi
1f8c0 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
1f8d0 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
1f8e0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e  ts[slotID], pPin
1f8f0 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69  , ulPinLen, &tri
1f900 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09  es_remaining);..
1f910 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d  if (login_ret !=
1f920 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
1f930 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  K) {...cackey_mu
1f940 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f950 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
1f960 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
1f970 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
1f980 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CKED) {....CACKE
1f990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f9a0 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73  Error.  Token is
1f9b0 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09   locked.");.....
1f9c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f9d0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1f9e0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
1f9f0 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74  _LOCKED;.....ret
1fa00 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  urn(CKR_PIN_LOCK
1fa10 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  ED);...} else if
1fa20 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
1fa30 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
1fa40 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  PIN) {....CACKEY
1fa50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fa60 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50  rror.  Invalid P
1fa70 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  IN.");.....cacke
1fa80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1fa90 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
1faa0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
1fab0 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74  T_LOW;.....if (t
1fac0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
1fad0 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  = 1) {.....cacke
1fae0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1faf0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
1fb00 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
1fb10 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
1fb20 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
1fb30 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a  NCORRECT);...}..
1fb40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fb50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1fb60 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74  nknown error ret
1fb70 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65  urned from cacke
1fb80 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c  y_login() (%i)",
1fb90 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09   login_ret);....
1fba0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1fbb0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1fbc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1fbd0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
1fbe0 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50   &= ~(CKF_USER_P
1fbf0 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f  IN_LOCKED | CKF_
1fc00 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
1fc10 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  OW | CKF_LOGIN_R
1fc20 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53  EQUIRED | CKF_US
1fc30 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59  ER_PIN_FINAL_TRY
1fc40 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  );...cackey_sess
1fc50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1fc60 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53  tate = CKS_RO_US
1fc70 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09  ER_FUNCTIONS;...
1fc80 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1fc90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1fca0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1fcb0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1fcc0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1fcd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fce0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1fcf0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1fd00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1fd10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1fd20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1fd30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1fd40 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1fd50 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1fd60 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1fd70 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1fd80 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f  ON(CK_RV, C_Logo
1fd90 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ut)(CK_SESSION_H
1fda0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
1fdb0 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
1fdc0 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78  otID;..int mutex
1fdd0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1fde0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fdf0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1fe00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1fe10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1fe20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fe30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1fe40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1fe50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1fe60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1fe70 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1fe80 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1fe90 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1fea0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1feb0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1fec0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1fed0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fee0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fef0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1ff00 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1ff10 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1ff20 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1ff30 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1ff40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1ff50 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1ff60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ff70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1ff80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1ff90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ffa0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1ffb0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1ffc0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1ffd0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1ffe0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1fff0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
20000 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
20010 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20020 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
20030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20040 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
20050 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
20060 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
20070 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
20080 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
20090 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
200a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
200b0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
200c0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
200d0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
200e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
200f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
20100 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
20110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20120 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
20130 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
20140 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
20150 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
20160 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
20170 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
20180 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
20190 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
201a0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
201b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
201c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
201d0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
201e0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
201f0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
20200 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
20210 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
20220 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20230 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
20240 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20250 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20260 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20270 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
20280 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
20290 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b  C_SESSION;..cack
202a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
202b0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  .token_flags = C
202c0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
202d0 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  D;...mutex_retva
202e0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
202f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
20300 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20310 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
20320 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20330 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20340 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
20350 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20360 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
20370 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
20380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
20390 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
203a0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
203b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
203c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
203d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
203e0 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43  _CreateObject)(C
203f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20400 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
20410 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
20420 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
20430 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
20440 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
20450 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
20460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20470 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20480 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20490 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
204a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
204b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
204c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
204d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
204e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
204f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
20500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20510 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20520 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20530 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20540 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20550 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20560 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20570 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20580 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20590 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79  ON(CK_RV, C_Copy
205a0 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
205b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
205c0 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
205d0 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
205e0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
205f0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
20600 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
20610 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
20620 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a   phNewObject) {.
20630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20640 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20650 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20660 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20680 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20690 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
206a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
206b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
206c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
206d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
206e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
206f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20700 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20710 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20720 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
20730 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
20740 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20750 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20760 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20770 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29  C_DestroyObject)
20780 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
20790 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
207a0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
207b0 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
207c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
207d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
207e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
207f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20810 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20820 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20830 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20840 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20850 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
20860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20870 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
20880 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20890 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
208a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
208b0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
208c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
208d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
208e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
208f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62  N(CK_RV, C_GetOb
20900 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53  jectSize)(CK_SES
20910 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
20920 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
20930 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
20940 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
20950 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f  Size) {..CACKEY_
20960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
20970 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
20980 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
20990 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
209a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
209b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
209c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
209d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
209e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
209f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
20a00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20a10 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
20a20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20a30 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
20a40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20a50 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
20a60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20a70 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
20a80 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
20a90 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74  (CK_RV, C_GetAtt
20aa0 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
20ab0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
20ac0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
20ad0 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
20ae0 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
20af0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
20b00 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
20b10 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
20b20 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74   *curr_attr;..st
20b30 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
20b40 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a  tity *identity;.
20b50 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
20b60 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74  dentity_idx, att
20b70 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
20b80 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09  _idx, num_ids;..
20b90 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
20ba0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
20bb0 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f  = CKR_OK;..CK_VO
20bc0 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
20bd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
20be0 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  Len;...CACKEY_DE
20bf0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
20c00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
20c10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
20c20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20c30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20c40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
20c50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20c60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
20c70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
20c80 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
20c90 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
20ca0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
20cb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
20cc0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
20cd0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
20ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20cf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
20d00 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
20d10 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
20d20 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
20d30 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
20d40 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63  ..}...if (hObjec
20d50 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
20d60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20d70 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
20d80 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
20d90 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
20da0 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
20db0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
20dc0 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74  .}...if (ulCount
20dd0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
20de0 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
20df0 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
20e00 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
20e10 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
20e20 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43  mediately */...C
20e30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20e40 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20e50 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
20e60 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
20e70 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
20e80 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
20e90 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55  (pTemplate == NU
20ea0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
20eb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20ec0 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  or.  pTemplate i
20ed0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
20ee0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
20ef0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64  TS_BAD);..}...id
20f00 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62  entity_idx = hOb
20f10 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65  ject - 1;...mute
20f20 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
20f30 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
20f40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20f50 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20f60 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20f70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20f80 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
20f90 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
20fa0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
20fb0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
20fc0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
20fd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
20fe0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
20ff0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21000 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21020 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
21030 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
21040 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21050 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21060 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
21070 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b  ..num_ids = cack
21080 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21090 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
210a0 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64  _count;...if (id
210b0 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75  entity_idx >= nu
210c0 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65  m_ids) {...cacke
210d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
210e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
210f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21100 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21110 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75  Object handle ou
21120 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65  t of range.  ide
21130 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c  ntity_idx = %lu,
21140 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22   num_ids = %lu."
21150 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
21160 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  ) identity_idx, 
21170 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21180 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74  num_ids);....ret
21190 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
211a0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
211b0 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20  .}...identity = 
211c0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
211d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
211e0 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69  ities[identity_i
211f0 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72  dx];...for (attr
21200 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69  _idx = 0; attr_i
21210 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74  dx < ulCount; at
21220 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  tr_idx++) {...cu
21230 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70  rr_attr = &pTemp
21240 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  late[attr_idx];.
21250 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
21260 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ;...ulValueLen =
21270 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
21280 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21290 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66  RINTF("Looking f
212a0 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25  or attribute 0x%
212b0 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25  08lx (identity:%
212c0 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lu) ...", (unsig
212d0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
212e0 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69  ttr->type, (unsi
212f0 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
21300 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72  ity_idx);....for
21310 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
21320 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
21330 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61  dx < identity->a
21340 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
21350 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
21360 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74  ) {....if (ident
21370 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
21380 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74  sess_attr_idx].t
21390 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72  ype == curr_attr
213a0 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41  ->type) {.....CA
213b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
213c0 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74  F(" ... found it
213d0 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75  , pValue = %p, u
213e0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22  lValueLen = %lu"
213f0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
21400 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
21410 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64  _idx].pValue, id
21420 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
21430 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
21440 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
21450 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  ........pValue =
21460 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
21470 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
21480 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09  idx].pValue;....
21490 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64  .ulValueLen = id
214a0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
214b0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
214c0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ].ulValueLen;...
214d0 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75  .}...}....if (cu
214e0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20  rr_attr->pValue 
214f0 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
21500 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75  if (curr_attr->u
21510 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56  lValueLen >= ulV
21520 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d  alueLen) {.....m
21530 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d  emcpy(curr_attr-
21540 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  >pValue, pValue,
21550 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09   ulValueLen);...
21560 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c  .} else {.....ul
21570 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
21580 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65  ONG) -1;......re
21590 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
215a0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
215b0 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74  }...}....curr_at
215c0 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  tr->ulValueLen =
215d0 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a   ulValueLen;..}.
215e0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
215f0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
21600 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21610 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21620 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21630 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21640 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
21650 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
21660 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21670 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21680 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61  ;..}...if (retva
21690 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55  l == CKR_ATTRIBU
216a0 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  TE_TYPE_INVALID)
216b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
216c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
216d0 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54  ing CKR_ATTRIBUT
216e0 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28  E_TYPE_INVALID (
216f0 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
21700 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
21710 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42  (retval == CKR_B
21720 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
21730 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21740 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21750 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
21760 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20  OO_SMALL (%i)", 
21770 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
21780 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61  } else if (retva
21790 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l == CKR_OK) {..
217a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
217b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
217c0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69  CKR_OK (%i)", (i
217d0 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
217e0 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f  else {...CACKEY_
217f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21800 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
21810 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  t) retval);..}..
21820 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
21830 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
21840 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21850 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
21860 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
21870 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
21880 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
21890 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
218a0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
218b0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
218c0 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
218d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
218e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
218f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21900 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
21910 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21920 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
21930 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
21940 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
21950 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
21960 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21980 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
21990 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
219a0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
219b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
219c0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
219d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
219e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
219f0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21a00 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
21a10 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53  bjectsInit)(CK_S
21a20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21a30 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49  ession, CK_ATTRI
21a40 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
21a50 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
21a60 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  ount) {..CK_SLOT
21a70 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
21a80 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
21a90 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
21aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21ab0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21ac0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21ad0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21ae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21af0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21b00 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21b10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21b20 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21b30 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21b40 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
21b50 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
21b60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
21b70 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
21b80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21b90 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21ba0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21bb0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21bc0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
21bd0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
21be0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
21bf0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
21c00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21c10 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
21c20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21c30 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
21c40 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21c60 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
21c70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
21c80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21c90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21ca0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
21cb0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
21cc0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
21cd0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21ce0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21cf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21d00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21d10 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
21d20 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
21d30 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
21d40 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
21d50 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
21d60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21d70 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
21d80 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
21d90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
21da0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
21db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21dc0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
21dd0 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  h already active
21de0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21df0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
21e00 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  CTIVE);..}...slo
21e10 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
21e20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21e30 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
21e40 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
21e50 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
21e60 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
21e70 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
21e80 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
21e90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21ea0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
21eb0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
21ec0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
21ed0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
21ee0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
21ef0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21f00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21f10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21f20 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21f30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21f40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21f50 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21f60 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21f70 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
21f80 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
21f90 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21fa0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21fb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21fc0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21fd0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
21fe0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
21ff0 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73  slotID].slot_res
22000 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  et) {...CACKEY_D
22010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65  EBUG_PRINTF("The
22020 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72   slot has been r
22030 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61  eset since we la
22040 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64  st looked for id
22050 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63  entities -- resc
22060 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20  anning");....if 
22070 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22080 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
22090 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
220a0 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
220b0 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
220c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
220d0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
220e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
220f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
22100 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
22110 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
22120 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
22130 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09  tities = NULL;..
22140 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
22150 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
22160 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
22170 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
22180 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22190 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29  ].label != NULL)
221a0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
221b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
221c0 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65  label);....cacke
221d0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
221e0 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
221f0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  }....cackey_mark
22200 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63  _slot_reset(&cac
22210 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22220 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ]);...cackey_slo
22230 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
22240 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  reset = 0;..}...
22250 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
22260 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
22270 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
22280 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
22290 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
222a0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
222b0 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
222c0 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
222d0 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
222e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
222f0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
22300 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66  _count);..}...if
22310 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e   (pTemplate != N
22320 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43  ULL) {...if (ulC
22330 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
22340 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22350 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
22360 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75  _query_count = u
22370 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65  lCount;....cacke
22380 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22390 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
223a0 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75  y = malloc(ulCou
223b0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
223c0 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65  mplate));.....me
223d0 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
223e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
223f0 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65  earch_query, pTe
22400 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20  mplate, ulCount 
22410 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c  * sizeof(*pTempl
22420 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69  ate));....for (i
22430 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c  dx = 0; idx < ul
22440 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  Count; idx++) {.
22450 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74  ....if (pTemplat
22460 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  e[idx].ulValueLe
22470 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63  n == 0) {......c
22480 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22490 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
224a0 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
224b0 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
224c0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
224d0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
224e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
224f0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
22500 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
22510 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e  (pTemplate[idx].
22520 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
22530 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
22540 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
22550 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
22560 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  ].pValue) {.....
22570 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
22580 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22590 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
225a0 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d  dx].pValue, pTem
225b0 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75  plate[idx].pValu
225c0 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  e, pTemplate[idx
225d0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
225e0 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  ...}....}...} el
225f0 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  se {....cackey_s
22600 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22610 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
22620 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63  ount = 0;....cac
22630 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22640 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
22650 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ery = NULL;...}.
22660 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
22670 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
22680 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22690 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
226a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
226b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
226c0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
226d0 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20  query specified 
226e0 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d  as NULL, but num
226f0 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72  ber of query ter
22700 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ms not specified
22710 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65   as 0.");.....re
22720 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
22730 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09  TS_BAD);...}....
22740 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22750 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
22760 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
22770 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
22780 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
22790 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c  arch_query = NUL
227a0 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  L;..}...cackey_s
227b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
227c0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
227d0 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 1;..cackey_ses
227e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
227f0 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
22800 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   0;...mutex_retv
22810 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
22820 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22830 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22840 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22850 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22860 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22870 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
22880 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
22890 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
228a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
228b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
228c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
228d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
228e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
228f0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
22900 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63   cackey_pkcs11_c
22910 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
22920 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  s(CK_ATTRIBUTE *
22930 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20  a, CK_ATTRIBUTE 
22940 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  *b) {..unsigned 
22950 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20  char *smallbuf, 
22960 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65  *largebuf;..size
22970 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c  _t smallbuf_len,
22980 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a   largebuf_len;..
22990 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20  .if (a->type != 
229a0 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74  b->type) {...ret
229b0 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43  urn(0);..}...CAC
229c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
229d0 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20  ("    ... found 
229e0 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e  matching type ..
229f0 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
22a00 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
22a10 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a    ... our value:
22a20 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d  ", a->pValue, a-
22a30 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  >ulValueLen);...
22a40 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d  if (b->pValue ==
22a50 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22a60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22a70 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
22a80 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22   wildcard match"
22a90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
22aa0 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61  ..}...if (a->pVa
22ab0 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lue == NULL) {..
22ac0 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
22ad0 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65   .if (b->ulValue
22ae0 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75  Len == a->ulValu
22af0 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61  eLen && memcmp(a
22b00 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61  ->pValue, b->pVa
22b10 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  lue, b->ulValueL
22b20 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  en) == 0) {...CA
22b30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22b40 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
22b50 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22  und exact match"
22b60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
22b70 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d  ..}...switch (a-
22b80 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  >type) {...case 
22b90 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
22ba0 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (a->ulValueLe
22bb0 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  n == b->ulValueL
22bc0 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
22bd0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d  ....}.....if (a-
22be0 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d  >ulValueLen > b-
22bf0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09  >ulValueLen) {..
22c00 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d  ...smallbuf = b-
22c10 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61  >pValue;.....sma
22c20 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75  llbuf_len = b->u
22c30 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
22c40 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56  largebuf = a->pV
22c50 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62  alue;.....largeb
22c60 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
22c70 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73  lueLen;....} els
22c80 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  e {.....smallbuf
22c90 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
22ca0 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d  ..smallbuf_len =
22cb0 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
22cc0 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20  .....largebuf = 
22cd0 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c  b->pValue;.....l
22ce0 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  argebuf_len = b-
22cf0 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  >ulValueLen;....
22d00 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72  }.....for (; lar
22d10 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61  gebuf_len != sma
22d20 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65  llbuf_len; large
22d30 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c  buf++,largebuf_l
22d40 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28  en--) {.....if (
22d50 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30  largebuf[0] != 0
22d60 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
22d70 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
22d80 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  f (largebuf_len 
22d90 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29  != smallbuf_len)
22da0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
22db0 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d  .}.....if (memcm
22dc0 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c  p(largebuf, smal
22dd0 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c  lbuf, smallbuf_l
22de0 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  en) == 0) {.....
22df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22e00 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
22e10 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74  found approximat
22e20 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  e match");......
22e30 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a  return(1);....}.
22e40 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
22e50 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b  return(0);.}..CK
22e60 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22e70 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
22e80 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f  jects)(CK_SESSIO
22e90 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
22ea0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
22eb0 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
22ec0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78  , CK_ULONG ulMax
22ed0 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f  ObjectCount, CK_
22ee0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a  ULONG_PTR pulObj
22ef0 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72  ectCount) {..str
22f00 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
22f10 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43  ity *curr_id;..C
22f20 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
22f30 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e  r_attr;..CK_ULON
22f40 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63  G curr_id_idx, c
22f50 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20  urr_out_id_idx, 
22f60 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73  curr_attr_idx, s
22f70 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43  ess_attr_idx;..C
22f80 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f  K_ULONG matched_
22f90 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63  count, prev_matc
22fa0 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  hed_count;..int 
22fb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69  mutex_retval;.#i
22fc0 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
22fd0 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
22fe0 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76  ST..struct timev
22ff0 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09  al start, end;..
23000 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69  uint64_t start_i
23010 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e  nt, end_int;.#en
23020 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
23030 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23040 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23050 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23060 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23070 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23080 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23090 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
230a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
230b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
230c0 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
230d0 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
230e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
230f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23100 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
23110 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
23120 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
23130 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
23140 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
23150 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
23160 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
23170 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
23180 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
23190 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
231a0 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
231b0 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
231c0 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
231d0 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
231e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
231f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23200 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
23210 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
23220 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
23230 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
23240 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
23250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23270 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
23280 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
23290 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
232a0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
232b0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
232c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
232d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
232e0 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
232f0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
23300 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
23310 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
23320 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
23330 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
23340 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
23350 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
23360 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
23370 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
23380 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
23390 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
233a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
233b0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
233c0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
233d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
233e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
233f0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
23400 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23410 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
23420 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
23430 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
23440 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
23450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23460 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
23470 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23480 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23490 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
234a0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
234b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
234c0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
234d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
234e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
234f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23500 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
23510 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
23520 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
23530 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
23540 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
23550 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
23560 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23570 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
23580 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23590 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
235a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
235b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
235c0 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
235d0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
235e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
235f0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
23600 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69  IALIZED);..}..#i
23610 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
23620 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
23630 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
23640 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a  (&start, NULL);.
23650 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75  #endif...curr_ou
23660 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66  t_id_idx = 0;..f
23670 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20  or (curr_id_idx 
23680 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
23690 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
236a0 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72  ch_curr_id; curr
236b0 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  _id_idx < cackey
236c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
236d0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
236e0 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a  ount && ulMaxObj
236f0 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69  ectCount; curr_i
23700 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  d_idx++) {...cur
23710 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73  r_id = &cackey_s
23720 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23730 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72  ].identities[cur
23740 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41  r_id_idx];....CA
23750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23760 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64  F("Processing id
23770 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e  entity:%lu", (un
23780 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
23790 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61  r_id_idx);....ma
237a0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b  tched_count = 0;
237b0 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ....for (curr_at
237c0 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72  tr_idx = 0; curr
237d0 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b  _attr_idx < cack
237e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
237f0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
23800 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61  ry_count; curr_a
23810 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
23820 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
23830 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  nt = matched_cou
23840 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  nt;.....curr_att
23850 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  r = &cackey_sess
23860 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23870 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72  earch_query[curr
23880 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
23890 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
238a0 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20  NTF("  Checking 
238b0 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73  for attribute %s
238c0 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64   (0x%08lx) in id
238d0 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43  entity:%i...", C
238e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
238f0 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
23900 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  R(curr_attr->typ
23910 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  e), (unsigned lo
23920 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
23930 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  ype, (int) curr_
23940 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b  id_idx);....CACK
23950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
23960 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f  F("    Value loo
23970 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72  king for:", curr
23980 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
23990 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
239a0 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28  eLen);.....for (
239b0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
239c0 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
239d0 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72   < curr_id->attr
239e0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
239f0 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
23a00 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
23a10 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
23a20 74 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f  ttributes(&curr_
23a30 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
23a40 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63  ess_attr_idx], c
23a50 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09  urr_attr)) {....
23a60 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
23a70 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  +;.......break;.
23a80 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
23a90 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75  * If the attribu
23aa0 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  te could not be 
23ab0 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20  matched, do not 
23ac0 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64  try to match add
23ad0 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74  itional attribut
23ae0 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65  es */....if (pre
23af0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  v_matched_count 
23b00 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  == matched_count
23b10 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
23b20 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d  ..}...}....if (m
23b30 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20  atched_count == 
23b40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23b50 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
23b60 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a  _query_count) {.
23b70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23b80 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c  PRINTF("  ... Al
23b90 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20  l %i attributes 
23ba0 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
23bb0 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  d, adding identi
23bc0 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65  ty:%i to returne
23bd0 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63  d list", (int) c
23be0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23bf0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
23c00 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e  query_count, (in
23c10 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
23c20 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75  .....phObject[cu
23c30 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d  rr_out_id_idx] =
23c40 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31   curr_id_idx + 1
23c50 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63  ;.....ulMaxObjec
23c60 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75  tCount--;.....cu
23c70 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b  rr_out_id_idx++;
23c80 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
23c90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23ca0 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c  TF("  ... Not al
23cb0 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64  l %i (only found
23cc0 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20   %i) attributes 
23cd0 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
23ce0 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64  d, not adding id
23cf0 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74  entity:%i", (int
23d00 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
23d10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
23d20 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
23d30 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f  (int) matched_co
23d40 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
23d50 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  id_idx);...}..}.
23d60 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23d70 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
23d80 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72  h_curr_id = curr
23d90 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62  _id_idx;..*pulOb
23da0 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72  jectCount = curr
23db0 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69  _out_id_idx;..#i
23dc0 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
23dd0 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
23de0 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
23df0 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73  (&end, NULL);..s
23e00 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72  tart_int = (star
23e10 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30  t.tv_sec * 10000
23e20 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75  00) + start.tv_u
23e30 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20  sec;..end_int = 
23e40 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30  (end.tv_sec * 10
23e50 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f  00000) + end.tv_
23e60 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73  usec;..fprintf(s
23e70 74 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74  tderr, "Search t
23e80 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63  ook %lu microsec
23e90 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  onds\n", (unsign
23ea0 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e  ed long) (end_in
23eb0 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b  t - start_int));
23ec0 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f  .#endif...mutex_
23ed0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23ee0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23ef0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
23f00 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
23f10 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
23f20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23f30 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
23f40 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
23f50 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
23f60 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
23f70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23f80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
23f90 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f  R_OK (%i), num o
23fa0 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43  bjects = %lu", C
23fb0 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63  KR_OK, *pulObjec
23fc0 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  tCount);...retur
23fd0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
23fe0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23ff0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
24000 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53  jectsFinal)(CK_S
24010 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24020 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ession) {..CK_UL
24030 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ONG idx;..int mu
24040 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
24050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24060 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24070 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24080 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
240a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
240b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
240c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
240d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
240e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
240f0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
24100 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
24110 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
24120 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
24130 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
24140 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
24150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24160 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
24170 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
24180 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
24190 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
241a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
241b0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
241c0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
241d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
241e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
241f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
24200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24210 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
24220 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
24230 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24240 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
24250 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
24260 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
24270 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
24280 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
24290 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
242a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
242b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
242c0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
242d0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
242e0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
242f0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
24300 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
24310 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24320 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
24330 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
24340 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
24350 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
24360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24370 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
24380 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
24390 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
243a0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
243b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
243c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
243d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
243e0 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
243f0 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
24400 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
24410 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
24420 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
24430 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
24440 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
24450 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
24460 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
24470 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63  lue) {....free(c
24480 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24490 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
244a0 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
244b0 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  e);...}..}...if 
244c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
244d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
244e0 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65  h_query) {...fre
244f0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
24500 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
24510 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09  ch_query);..}...
24520 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
24530 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24540 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24550 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
24560 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
24570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24580 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
24590 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
245a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
245b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
245c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
245d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
245e0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
245f0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
24600 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
24610 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24620 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
24630 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
24640 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24650 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
24660 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
24670 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
24680 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
24690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
246a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
246b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
246c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
246d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
246e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
246f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24700 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24710 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24720 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
24730 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24740 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
24750 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24760 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
24770 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24780 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
24790 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
247a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
247b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
247c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
247d0 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
247e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
247f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
24800 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
24810 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
24820 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
24830 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
24840 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61  R pulEncryptedDa
24850 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
24860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24870 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24880 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
24890 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
248a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
248b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
248c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
248d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
248e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
248f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
24900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24910 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
24920 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24930 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
24940 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24950 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
24960 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24970 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
24980 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24990 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
249a0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
249b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
249c0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
249d0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
249e0 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
249f0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
24a00 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
24a10 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
24a20 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
24a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24a40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24a50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24a60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24a80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24a90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24aa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24ab0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24ac0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
24ad0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24ae0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
24af0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24b00 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
24b10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24b20 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
24b30 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
24b40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
24b50 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
24b60 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
24b70 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ncryptFinal)(CK_
24b80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24b90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
24ba0 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70  _PTR pLastEncryp
24bb0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
24bc0 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63  G_PTR pulLastEnc
24bd0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
24be0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24bf0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24c00 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24c10 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24c30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
24c40 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
24c50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24c60 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24c70 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24c80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24c90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24ca0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24cb0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
24cc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24cd0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
24ce0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
24cf0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24d00 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
24d10 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24d20 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28   C_DecryptInit)(
24d30 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
24d40 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
24d50 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
24d60 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
24d70 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
24d80 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
24d90 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
24da0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24db0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24dc0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24dd0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24de0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24df0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
24e00 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
24e10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
24e20 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
24e30 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
24e40 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
24e50 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
24e60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24e70 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
24e80 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
24e90 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
24ea0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
24eb0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
24ec0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
24ed0 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
24ee0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ef0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
24f00 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
24f10 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
24f20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
24f30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24f40 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
24f50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
24f60 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
24f70 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
24f80 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
24f90 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
24fa0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
24fb0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
24fc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24fd0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
24fe0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
24ff0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
25000 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
25010 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
25020 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
25030 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
25040 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25050 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25060 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
25070 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25080 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
25090 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
250a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
250b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
250c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
250d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
250e0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
250f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25100 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25110 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
25120 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25130 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
25140 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
25150 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
25160 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25170 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
25180 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25190 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
251a0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
251b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
251c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
251d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
251e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
251f0 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e  crypt already in
25200 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
25210 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
25220 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
25230 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
25240 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
25250 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
25260 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
25270 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25280 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25290 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
252a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
252b0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
252c0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
252d0 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
252e0 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
252f0 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
25300 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
25310 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
25320 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
25330 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25340 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
25350 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
25360 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
25370 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
25380 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25390 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
253a0 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  t_active = 1;...
253b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
253c0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
253d0 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  t_mechanism = pM
253e0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
253f0 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ism;..cackey_ses
25400 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25410 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
25420 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
25430 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63  pParameter;..cac
25440 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25450 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
25460 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d  ech_parmlen = pM
25470 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61  echanism->ulPara
25480 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65  meterLen;..cacke
25490 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
254a0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
254b0 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
254c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
254d0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
254e0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
254f0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
25500 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25510 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
25520 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
25530 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25550 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
25560 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
25570 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25580 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
25590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
255a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
255b0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
255c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
255d0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
255e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
255f0 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53   C_Decrypt)(CK_S
25600 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25610 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
25620 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
25630 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  ta, CK_ULONG ulE
25640 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
25650 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
25660 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
25670 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
25680 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e  CK_ULONG datalen
25690 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e  _update, datalen
256a0 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64  _final;..CK_RV d
256b0 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74  ecrypt_ret;..int
256c0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
256d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
256e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
256f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
25700 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
25710 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25720 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
25730 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
25740 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
25750 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
25760 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
25770 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
25780 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
25790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
257a0 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
257b0 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
257c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
257d0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
257e0 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
257f0 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
25800 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
25810 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
25820 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
25830 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
25840 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
25850 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
25860 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
25870 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
25880 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25890 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
258a0 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
258b0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
258c0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
258d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
258e0 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
258f0 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ...if (decrypt_r
25900 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
25910 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
25920 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65  ./* Terminate de
25930 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69  cryption operati
25940 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f  on */.....mutex_
25950 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25960 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
25970 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
25980 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25990 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
259a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
259b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
259c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
259d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
259e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
259f0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
25a00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25a10 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
25a20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25a30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25a40 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
25a50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25a60 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
25a70 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
25a80 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
25a90 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
25aa0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a  _INVALID);....}.
25ab0 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
25ac0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25ad0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
25ae0 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
25af0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25b00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25b10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25b20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25b30 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
25b40 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
25b50 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
25b60 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
25b70 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ED);....}.....ca
25b80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25b90 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
25ba0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
25bb0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
25bc0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
25bd0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25be0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
25bf0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
25c00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25c10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25c20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
25c30 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
25c40 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25c50 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ROR);....}...}..
25c60 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
25c70 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
25c80 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61  pData) {...pData
25c90 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61   += datalen_upda
25ca0 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f  te;..}..datalen_
25cb0 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61  final = *pulData
25cc0 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70  Len - datalen_up
25cd0 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f  date;...decrypt_
25ce0 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46  ret = C_DecryptF
25cf0 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
25d00 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66  Data, &datalen_f
25d10 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72  inal);..if (decr
25d20 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
25d30 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
25d40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25d50 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c  r.  DecryptFinal
25d60 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
25d70 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
25d80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25d90 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
25da0 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
25db0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75  t_ret);..}...*pu
25dc0 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c  lDataLen = datal
25dd0 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61  en_update + data
25de0 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43  len_final;...CAC
25df0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25e00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25e10 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
25e20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25e30 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
25e40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
25e50 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  , C_DecryptUpdat
25e60 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
25e70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25e80 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
25e90 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
25ea0 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
25eb0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
25ec0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
25ed0 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
25ee0 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
25ef0 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d  _BYTE buf[16384]
25f00 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65  ;..ssize_t bufle
25f10 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  n;..CK_SLOT_ID s
25f20 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65  lotID;..CK_RV re
25f30 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
25f40 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d  AL_ERROR;..int m
25f50 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
25f60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25f70 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25f80 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
25f90 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25fa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25fb0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25fc0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
25fd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
25fe0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
25ff0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
26000 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
26010 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
26020 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
26030 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
26040 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26050 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
26060 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26070 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
26080 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
26090 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
260a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
260b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
260c0 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
260d0 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e   == NULL && ulEn
260e0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
260f0 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
26100 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
26110 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63  are asked to dec
26120 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20  rypt nothing... 
26130 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
26140 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26150 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
26160 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
26170 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
26180 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
26190 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65  ...if (pEncrypte
261a0 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dPart == NULL) {
261b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
261c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
261d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73  EncryptedPart is
261e0 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63   NULL, but ulEnc
261f0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
26200 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
26210 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
26220 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
26230 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   (ulEncryptedPar
26240 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
26250 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26260 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63  TF("Error. ulEnc
26270 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
26280 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
26290 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
262a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
262b0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
262c0 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20  .if (pulPartLen 
262d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
262e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
262f0 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74  ("Error. pulPart
26300 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
26310 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
26320 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
26330 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
26340 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
26350 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26360 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
26370 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
26380 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26390 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
263a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
263b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
263c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
263d0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
263e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
263f0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
26400 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26410 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26420 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
26430 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26440 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
26450 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
26460 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
26470 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
26480 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
26490 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
264a0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
264b0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
264c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
264d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
264e0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
264f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26500 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
26510 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
26520 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
26530 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
26540 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
26550 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
26560 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
26570 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
26580 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
26590 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
265a0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
265b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
265c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
265d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
265e0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
265f0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
26600 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
26610 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
26620 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
26630 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
26640 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
26650 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
26660 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
26670 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26680 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
26690 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
266a0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
266b0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
266c0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
266d0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
266e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
266f0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
26700 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26710 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
26720 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
26730 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
26740 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20  rypt_mechanism) 
26750 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
26760 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
26770 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74   card to decrypt
26780 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20   */....buflen = 
26790 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
267a0 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
267b0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
267c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
267d0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
267e0 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
267f0 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
26800 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
26810 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
26820 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  );.....if (bufle
26830 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
26840 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65  Decryption faile
26850 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75  d. */.....if (bu
26860 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
26870 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
26880 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
26890 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
268a0 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
268b0 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d  lse if (buflen =
268c0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
268d0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
268e0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
268f0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
26900 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
26910 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
26920 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
26930 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
26940 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
26950 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70  ng) buflen) > *p
26960 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61  ulPartLen && pPa
26970 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63  rt) {...../* Dec
26980 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20  rypted data too 
26990 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74  large */.....ret
269a0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
269b0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
269c0 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
269d0 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65  pPart) {......me
269e0 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c  mcpy(pPart, buf,
269f0 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a   buflen);.....}.
26a00 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e  .....*pulPartLen
26a10 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09   = buflen;......
26a20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
26a30 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
26a40 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26a50 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26a60 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26a70 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
26a80 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
26a90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26aa0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26ab0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
26ac0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
26ad0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26ae0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
26af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26b00 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
26b10 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
26b20 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
26b30 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
26b40 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
26b50 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ecryptFinal)(CK_
26b60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
26b70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
26b80 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20  _PTR pLastPart, 
26b90 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
26ba0 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09  LastPartLen) {..
26bb0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
26bc0 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
26bd0 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09  _decrypt = 1;...
26be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26bf0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
26c00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26c10 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26c20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26c30 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26c40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26c50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26c60 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26c70 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
26c80 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
26c90 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
26ca0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
26cb0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
26cc0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26cd0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
26ce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26cf0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
26d00 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
26d10 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26d20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26d30 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
26d40 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  f (pulLastPartLe
26d50 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
26d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26d70 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61  TF("Error. pulLa
26d80 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  stPartLen is NUL
26d90 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
26da0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
26db0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
26dc0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
26dd0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
26de0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
26df0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
26e00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26e10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26e20 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
26e30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26e40 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26e50 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
26e60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26e70 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
26e80 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
26e90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26ea0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
26eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ec0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26ed0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
26ee0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26ef0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26f00 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
26f10 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
26f20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
26f30 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
26f40 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26f50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26f60 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
26f70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26f80 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
26f90 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
26fa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
26fb0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
26fc0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a  IALIZED);..}...*
26fd0 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
26fe0 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50   0;...if (pLastP
26ff0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
27000 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  .terminate_decry
27010 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  pt = 0;..}...if 
27020 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  (terminate_decry
27030 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  pt) {...cackey_s
27040 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27050 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
27060 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
27070 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
27080 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
27090 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
270a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
270b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
270c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
270d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
270e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
270f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
27100 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
27110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27120 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27130 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
27140 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
27150 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
27160 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
27170 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69  _RV, C_DigestIni
27180 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
27190 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
271a0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
271b0 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43  pMechanism) {..C
271c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
271d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
271e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
271f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27210 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27220 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27230 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27240 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27250 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
27260 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27270 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27280 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27290 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
272a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
272b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
272c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
272d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
272e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
272f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27300 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49  Digest)(CK_SESSI
27310 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27320 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
27330 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
27340 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
27350 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
27360 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
27370 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
27380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27390 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
273a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
273b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
273c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
273d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
273e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
273f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27400 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27410 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
27420 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27430 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27440 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27450 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
27460 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27470 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
27480 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
27490 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
274a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
274b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
274c0 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
274d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
274e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
274f0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
27500 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
27510 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
27520 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
27530 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
27540 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
27550 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27560 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
27570 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
27580 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27590 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
275a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
275b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
275c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
275d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
275e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
275f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
27600 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
27610 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
27620 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27630 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
27640 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27650 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43  , C_DigestKey)(C
27660 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27670 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
27680 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
27690 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
276a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
276b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
276c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
276d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
276e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
276f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
27700 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27710 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
27720 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
27730 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27740 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
27750 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
27760 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
27770 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
27780 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27790 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
277a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
277b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
277c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
277d0 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61  RV, C_DigestFina
277e0 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
277f0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
27800 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
27810 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
27820 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
27830 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27840 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27850 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27860 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27880 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27890 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
278a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
278b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
278c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
278d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
278e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
278f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27900 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
27910 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27920 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
27930 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
27940 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27950 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
27960 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27970 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f   C_SignInit)(CK_
27980 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27990 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
279a0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
279b0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
279c0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
279d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
279e0 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
279f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27a00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27a10 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
27a20 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
27a30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27a40 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27a50 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27a60 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27a70 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27a80 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
27a90 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
27aa0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
27ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27ac0 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
27ad0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
27ae0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
27af0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
27b00 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
27b10 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
27b20 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
27b30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27b40 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
27b50 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
27b60 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
27b70 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
27b80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
27b90 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
27ba0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
27bb0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
27bc0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
27bd0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27be0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
27bf0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27c00 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
27c10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27c20 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
27c30 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
27c40 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
27c50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
27c60 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
27c70 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27c80 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
27c90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27ca0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27cb0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27cd0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
27ce0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
27cf0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
27d00 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
27d10 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27d20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
27d30 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
27d40 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
27d50 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
27d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27d70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27d80 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
27d90 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
27da0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
27db0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
27dc0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
27dd0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27de0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
27df0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
27e00 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27e10 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
27e20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27e30 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72  Error.  Sign alr
27e40 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73  eady in progress
27e50 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27e60 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
27e70 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20  CTIVE);..}...if 
27e80 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f  (hKey >= cackey_
27e90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27ea0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
27eb0 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  unt) {...cackey_
27ec0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27ed0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
27ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27ef0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65  INTF("Error.  Ke
27f00 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  y handle out of 
27f10 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64  range (requested
27f20 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25   key %lu, only %
27f30 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76  lu identities av
27f40 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73  ailable).", (uns
27f50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
27f60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
27f70 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
27f80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
27f90 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
27fa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59  ..return(CKR_KEY
27fb0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
27fc0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
27fd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27fe0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31  .sign_active = 1
27ff0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
28000 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
28010 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  gn_mechanism = p
28020 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
28030 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  nism;...cackey_s
28040 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28050 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
28060 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  128;..cackey_ses
28070 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28080 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30  sign_bufused = 0
28090 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
280a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
280b0 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73  n_buf = malloc(s
280c0 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
280d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
280e0 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
280f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28100 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
28110 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  en);...CACKEY_DE
28120 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73  BUG_PRINTF("Sess
28130 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65  ion %lu sign_ide
28140 6e 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65  ntity is %p (ide
28150 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75  ntity #%lu)", (u
28160 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
28170 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29  ession, (void *)
28180 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
28190 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
281a0 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75  tities[hKey], (u
281b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
281c0 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ey);..cackey_ses
281d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
281e0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20  sign_identity = 
281f0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
28200 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
28210 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
28220 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28230 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28240 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28250 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
28260 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
28270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28280 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
28290 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
282a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
282b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
282c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
282d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
282e0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
282f0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
28300 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
28310 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
28320 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29  N(CK_RV, C_Sign)
28330 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
28340 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
28350 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
28360 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
28370 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
28380 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
28390 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
283a0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73  atureLen) {..uns
283b0 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74  igned long start
283c0 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09  _sign_bufused;..
283d0 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a  CK_RV sign_ret;.
283e0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
283f0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
28400 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28410 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
28420 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
28430 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28440 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28450 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
28460 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
28470 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
28480 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
28490 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
284a0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
284b0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
284c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
284d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
284e0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
284f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28500 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
28510 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
28520 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
28530 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
28540 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28550 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62  }...start_sign_b
28560 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f  ufused = cackey_
28570 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28580 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  n].sign_bufused;
28590 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f  ...sign_ret = C_
285a0 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73  SignUpdate(hSess
285b0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61  ion, pData, ulDa
285c0 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  taLen);..if (sig
285d0 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
285e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
285f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28600 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72    SignUpdate() r
28610 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
28620 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
28630 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
28640 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  gn_ret);....if (
28650 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
28660 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
28670 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  ) {....mutex_ret
28680 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
28690 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
286a0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
286b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
286c0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
286d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
286e0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
286f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
28700 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28710 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
28720 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
28730 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28740 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
28750 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
28760 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28770 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
28780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28790 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
287a0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
287b0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
287c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
287d0 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  VALID);....}....
287e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
287f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28800 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
28810 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28820 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28830 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
28840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28850 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
28860 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
28870 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28880 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
28890 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d  ITIALIZED);....}
288a0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
288b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
288c0 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
288d0 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
288e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
288f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28900 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
28910 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
28920 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
28930 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28940 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
28950 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
28960 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28970 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09  L_ERROR);....}..
28980 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  .}....return(sig
28990 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67  n_ret);..}...sig
289a0 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69  n_ret = C_SignFi
289b0 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53  nal(hSession, pS
289c0 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67  ignature, pulSig
289d0 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20  natureLen);..if 
289e0 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52  (sign_ret != CKR
289f0 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67  _OK) {...if (sig
28a00 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46  n_ret == CKR_BUF
28a10 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
28a20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28a30 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e  _PRINTF("SignFin
28a40 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b  al() returned CK
28a50 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
28a60 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75  LL (rv = %lu), u
28a70 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
28a80 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65  ate()", (unsigne
28a90 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
28aa0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
28ab0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28ac0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
28ad0 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
28ae0 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73  ed;.....return(s
28af0 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09  ign_ret);...}...
28b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28b10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
28b20 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
28b30 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
28b40 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
28b50 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
28b60 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
28b70 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  gn_ret);..}...if
28b80 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20   (pSignature == 
28b90 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
28ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
28bb0 53 69 67 6e 61 74 75 72 65 20 73 70 65 63 69 66  Signature specif
28bc0 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64  ied as NULL, und
28bd0 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
28be0 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  e()");....cackey
28bf0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28c00 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
28c10 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75   = start_sign_bu
28c20 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e  fused;....return
28c30 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
28c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28c50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28c60 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
28c70 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
28c80 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
28c90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
28ca0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61  K_RV, C_SignUpda
28cb0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
28cc0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28cd0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
28ce0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
28cf0 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
28d00 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
28d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28d20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
28d30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
28d40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...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 4e 6f 74 20 69 6e  ("Error.  Not in
28d70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
28d80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
28d90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
28da0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
28db0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
28dc0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
28dd0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
28de0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
28df0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
28e00 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
28e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28e20 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
28e30 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
28e40 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
28e50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
28e60 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
28e70 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26  (pPart == NULL &
28e80 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30  & ulPartLen == 0
28e90 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
28ea0 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
28eb0 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e   asked to sign n
28ec0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
28ed0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28ee0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
28ef0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
28f00 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
28f10 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
28f20 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
28f30 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (pPart == NULL) 
28f40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28f50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28f60 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  pPart is NULL, b
28f70 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  ut ulPartLen is 
28f80 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
28f90 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
28fa0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
28fb0 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  (ulPartLen == 0)
28fc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28fd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28fe0 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c   ulPartLen is 0,
28ff0 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
29000 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
29010 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
29020 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
29030 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29040 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
29050 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29060 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
29070 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
29080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29090 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
290a0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
290b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
290c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
290d0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
290e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
290f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
29100 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29110 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29120 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29130 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
29140 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
29150 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29160 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
29170 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29180 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
29190 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
291a0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
291b0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
291c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
291d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
291e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
291f0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
29200 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
29210 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
29220 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
29230 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77  ALIZED);..}...sw
29240 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
29250 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29260 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
29270 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
29280 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63  _PKCS:..../* Acc
29290 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79  umulate directly
292a0 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b   */....if ((cack
292b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
292c0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
292d0 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20  ed + ulPartLen) 
292e0 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  > cackey_session
292f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
29300 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63  _buflen) {.....c
29310 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29320 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
29330 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09  flen *= 2;......
29340 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29350 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
29360 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63  uf = realloc(cac
29370 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29380 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
29390 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f   sizeof(*cackey_
293a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
293b0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
293c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
293d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
293e0 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  flen);....}.....
293f0 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
29400 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29410 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b  .sign_buf + cack
29420 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29430 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
29440 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72  ed, pPart, ulPar
29450 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65  tLen);.....cacke
29460 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29470 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
29480 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a  d += ulPartLen;.
29490 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
294a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
294b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
294c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
294d0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
294e0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
294f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29500 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
29510 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
29520 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29530 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
29540 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29550 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29560 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
29570 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
29580 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
29590 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
295a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
295b0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
295c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
295d0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
295e0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
295f0 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
29600 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74  tureLen) {..stat
29610 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75  ic CK_BYTE sigbu
29620 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f  f[1024];..ssize_
29630 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b  t sigbuflen;..CK
29640 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
29650 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
29660 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
29670 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  OR;..int termina
29680 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e  te_sign = 1;..in
29690 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
296a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
296b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
296c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
296d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
296e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
296f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29700 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29710 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29720 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29730 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29740 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65  if (pulSignature
29750 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
29760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
29780 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20  SignatureLen is 
29790 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
297a0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
297b0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
297c0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
297d0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
297e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
297f0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
29800 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
29810 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
29820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29830 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
29840 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
29850 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
29860 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
29870 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
29880 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
29890 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
298a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
298b0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
298c0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
298d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
298e0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
298f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
29900 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29910 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
29920 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
29930 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
29940 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
29950 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29960 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29980 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
29990 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
299a0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
299b0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
299c0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
299d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
299e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
299f0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
29a00 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
29a10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
29a20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
29a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29a40 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
29a50 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
29a60 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
29a70 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
29a80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  LIZED);..}...slo
29a90 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
29aa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29ab0 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
29ac0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
29ad0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
29ae0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
29af0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
29b00 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
29b10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29b20 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
29b30 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
29b40 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
29b50 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
29b60 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
29b70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
29b80 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
29b90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
29ba0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
29bb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29bd0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
29be0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
29bf0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
29c00 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
29c10 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
29c20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29c30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
29c40 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
29c50 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
29c60 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
29c70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29c80 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
29c90 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
29ca0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
29cb0 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a  k card to sign *
29cc0 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  /....CACKEY_DEBU
29cd0 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67  G_PRINTF("Asking
29ce0 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64   to sign from id
29cf0 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73  entity %p in ses
29d00 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64  sion %lu", (void
29d10 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69   *) cackey_sessi
29d20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
29d30 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e  gn_identity, (un
29d40 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
29d50 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75  ssion);....sigbu
29d60 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69  flen = cackey_si
29d70 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65  gndecrypt(&cacke
29d80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
29d90 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
29da0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
29db0 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79  identity, cackey
29dc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29dd0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61  on].sign_buf, ca
29de0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29df0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
29e00 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69  used, sigbuf, si
29e10 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c  zeof(sigbuf), 1,
29e20 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67   0);.....if (sig
29e30 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
29e40 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69  ../* Signing fai
29e50 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28  led. */.....if (
29e60 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  sigbuflen == CAC
29e70 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
29e80 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74  OGIN) {......ret
29e90 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e  val = CKR_USER_N
29ea0 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09  OT_LOGGED_IN;...
29eb0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67  ..} else if (sig
29ec0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
29ed0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
29ee0 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
29ef0 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
29f00 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
29f10 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61  lse {......retva
29f20 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
29f30 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09  ERROR;.....}....
29f40 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73  } else if (((uns
29f50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
29f60 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67  uflen) > *pulSig
29f70 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69  natureLen && pSi
29f80 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f  gnature) {...../
29f90 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f  * Signed data to
29fa0 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43  o large */.....C
29fb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29fc0 54 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52  TF("retval = CKR
29fd0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
29fe0 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20  L;  sigbuflen = 
29ff0 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72  %lu, pulSignatur
2a000 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e  eLen = %lu", (un
2a010 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
2a020 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  buflen, (unsigne
2a030 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e  d long) *pulSign
2a040 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  atureLen);......
2a050 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
2a060 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a  FER_TOO_SMALL;..
2a070 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2a080 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73  gn = 0;....} els
2a090 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74  e {.....terminat
2a0a0 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09  e_sign = 0;.....
2a0b0 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29  .if (pSignature)
2a0c0 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
2a0d0 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75  Signature, sigbu
2a0e0 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a  f, sigbuflen);..
2a0f0 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
2a100 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a  ign = 1;.....}..
2a110 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72  ....*pulSignatur
2a120 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e  eLen = sigbuflen
2a130 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
2a140 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09  CKR_OK;....}....
2a150 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20  .break;..}...if 
2a160 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29  (terminate_sign)
2a170 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
2a180 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a190 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09  n].sign_buf) {..
2a1a0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65  ..free(cackey_se
2a1b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a1c0 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a  .sign_buf);...}.
2a1d0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2a1e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2a1f0 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  n_active = 0;..}
2a200 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2a210 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2a220 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a230 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2a240 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2a250 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a260 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a270 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2a280 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2a290 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2a2a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a2b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a2c0 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
2a2d0 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
2a2e0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
2a2f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2a300 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2a310 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f  RecoverInit)(CK_
2a320 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2a330 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2a340 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2a350 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2a360 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2a370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a380 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2a390 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2a3a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2a3b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a3c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2a3d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2a3e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2a3f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2a400 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2a410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a420 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2a430 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a440 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2a450 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a460 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2a470 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2a480 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2a490 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2a4a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2a4b0 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b  _SignRecover)(CK
2a4c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a4d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2a4e0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2a4f0 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
2a500 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2a510 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2a520 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
2a530 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2a540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a550 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a560 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a570 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a590 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a5a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a5b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a5c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a5d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a5e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a5f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a600 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a610 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a620 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a630 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a640 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a650 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a660 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a670 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2a680 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  yInit)(CK_SESSIO
2a690 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2a6a0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2a6b0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2a6c0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2a6d0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
2a6e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a6f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a700 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a710 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a730 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a740 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a750 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a760 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a770 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a790 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a7a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a7b0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a7c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a7d0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a7e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a7f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a800 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a810 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2a820 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2a830 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2a840 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2a850 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2a860 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2a870 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2a880 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
2a890 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2a8a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a8b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a8c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a8d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a8e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a8f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a900 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a910 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a920 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a930 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a940 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a950 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a960 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a970 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a980 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a990 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a9a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a9b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a9c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a9d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2a9e0 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  yUpdate)(CK_SESS
2a9f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2aa00 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2aa10 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2aa20 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43   ulPartLen) {..C
2aa30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2aa40 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2aa50 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2aa60 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2aa70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2aa80 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2aa90 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2aaa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2aab0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2aac0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2aad0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2aae0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2aaf0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ab00 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2ab10 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ab20 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2ab30 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2ab40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ab50 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ab60 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ab70 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f  VerifyFinal)(CK_
2ab80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ab90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2aba0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2abb0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
2abc0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
2abd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2abe0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2abf0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2ac00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ac10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ac20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2ac30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2ac40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2ac50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ac60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2ac70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ac80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2ac90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2aca0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2acb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2acc0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2acd0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2ace0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2acf0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2ad00 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2ad10 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29  rifyRecoverInit)
2ad20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ad30 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ad40 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2ad50 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2ad60 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
2ad70 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2ad80 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2ad90 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2ada0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2adb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2adc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2add0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2ade0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2adf0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2ae00 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ae10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ae20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2ae30 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ae40 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2ae50 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2ae60 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2ae70 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2ae80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ae90 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2aea0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2aeb0 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76  V, C_VerifyRecov
2aec0 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
2aed0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2aee0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2aef0 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2af00 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c   ulSignatureLen,
2af10 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2af20 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
2af30 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
2af40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2af50 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2af60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2af70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2af80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2af90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2afa0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2afb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2afc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2afd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2afe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2aff0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2b000 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b010 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2b020 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b030 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2b040 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2b050 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2b060 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2b070 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2b080 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
2b090 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2b0a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2b0b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2b0c0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2b0d0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2b0e0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2b0f0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2b100 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
2b110 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2b120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2b130 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2b140 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2b150 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2b160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b170 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2b180 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2b190 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2b1a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2b1b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b1c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b1d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2b1e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b1f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2b200 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b210 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2b220 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b230 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2b240 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b250 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
2b260 70 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28  ptDigestUpdate)(
2b270 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2b280 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2b290 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2b2a0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2b2b0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
2b2c0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2b2d0 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2b2e0 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
2b2f0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2b300 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2b310 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2b320 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2b330 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b340 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b350 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2b360 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b370 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2b380 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2b390 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b3a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2b3b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2b3c0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2b3d0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2b3e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b3f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2b400 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b410 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2b420 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2b430 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  V, C_SignEncrypt
2b440 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2b450 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2b460 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2b470 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2b480 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
2b490 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2b4a0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
2b4b0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
2b4c0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2b4d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b4e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2b4f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2b500 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2b510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b520 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2b530 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2b540 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2b550 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2b560 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2b570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b580 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2b590 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b5a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2b5b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b5c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2b5d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2b5e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2b5f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b600 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
2b610 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
2b620 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2b630 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2b640 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2b650 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2b660 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
2b670 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
2b680 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2b690 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
2b6a0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2b6b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2b6c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2b6d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2b6e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b6f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b700 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2b710 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b720 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2b730 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2b740 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2b750 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2b760 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2b770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2b780 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2b790 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2b7a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2b7b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b7c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2b7d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2b7e0 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b  _RV, C_GenerateK
2b7f0 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
2b800 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2b810 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2b820 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2b830 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
2b840 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2b850 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
2b860 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2b870 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
2b880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2b890 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2b8a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2b8b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2b8c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b8d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2b8e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2b8f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2b900 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2b910 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b930 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2b940 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b950 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2b960 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b970 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2b980 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b990 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2b9a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2b9b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
2b9c0 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53  ateKeyPair)(CK_S
2b9d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2b9e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2b9f0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2ba00 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
2ba10 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79  E_PTR pPublicKey
2ba20 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
2ba30 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74  NG ulPublicKeyAt
2ba40 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
2ba50 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
2ba60 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61  PrivateKeyTempla
2ba70 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  te, CK_ULONG ulP
2ba80 72 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75  rivateKeyAttribu
2ba90 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
2baa0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
2bab0 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42  PublicKey, CK_OB
2bac0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2bad0 70 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a  phPrivateKey) {.
2bae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2baf0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2bb00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2bb10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2bb20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bb30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2bb40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2bb50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2bb60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2bb70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2bb80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bb90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2bba0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bbb0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2bbc0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bbd0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2bbe0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2bbf0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2bc00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2bc10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2bc20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45  C_WrapKey)(CK_SE
2bc30 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2bc40 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2bc50 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2bc60 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2bc70 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65  NDLE hWrappingKe
2bc80 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
2bc90 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54  DLE hKey, CK_BYT
2bca0 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
2bcb0 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  y, CK_ULONG_PTR 
2bcc0 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e  pulWrappedKeyLen
2bcd0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2bce0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2bcf0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2bd00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2bd10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2bd20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2bd30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2bd40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2bd50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2bd60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2bd70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bd80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2bd90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2bda0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2bdb0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2bdc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2bdd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2bde0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2bdf0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2be00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2be10 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29  RV, C_UnwrapKey)
2be20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2be30 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2be40 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2be50 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2be60 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72  ECT_HANDLE hUnwr
2be70 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59  appingKey, CK_BY
2be80 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b  TE_PTR pWrappedK
2be90 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57  ey, CK_ULONG ulW
2bea0 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b  rappedKeyLen, CK
2beb0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
2bec0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
2bed0 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f  NG ulAttributeCo
2bee0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
2bef0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
2bf00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2bf10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2bf20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2bf30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2bf40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bf50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2bf60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2bf70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2bf80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2bf90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2bfa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bfb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2bfc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2bfd0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2bfe0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2bff0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2c000 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2c010 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c020 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2c030 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2c040 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28  V, C_DeriveKey)(
2c050 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c060 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2c070 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2c080 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2c090 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b  CT_HANDLE hBaseK
2c0a0 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ey, CK_ATTRIBUTE
2c0b0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
2c0c0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
2c0d0 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
2c0e0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2c0f0 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
2c100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c110 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c120 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c130 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c140 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c150 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c160 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c170 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c180 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c190 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2c1a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c1b0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2c1c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c1d0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2c1e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c1f0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2c200 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c210 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2c220 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c230 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52  N(CK_RV, C_SeedR
2c240 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f  andom)(CK_SESSIO
2c250 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2c260 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2c270 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Seed, CK_ULONG u
2c280 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43  lSeedLen) {..CAC
2c290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c2a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2c2b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2c2c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2c2d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c2e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2c2f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2c300 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2c310 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2c320 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2c330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c340 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2c350 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c360 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2c370 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c380 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2c390 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2c3a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2c3b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2c3c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
2c3d0 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b  nerateRandom)(CK
2c3e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c3f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2c400 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74  E_PTR pRandomDat
2c410 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61  a, CK_ULONG ulRa
2c420 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  ndomLen) {..CACK
2c430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c440 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2c450 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2c460 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2c470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c480 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2c490 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2c4a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2c4b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2c4c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2c4d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2c4e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2c4f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c500 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2c510 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c520 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2c530 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2c540 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2c550 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46  ./* Deprecated F
2c560 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45  unction */.CK_DE
2c570 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2c580 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69  _RV, C_GetFuncti
2c590 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53  onStatus)(CK_SES
2c5a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2c5b0 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
2c5c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2c5d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
2c5e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c5f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2c600 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2c610 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
2c620 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2c630 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
2c640 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c650 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
2c660 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
2c670 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
2c680 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
2c690 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44  rning */.}../* D
2c6a0 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
2c6b0 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
2c6c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2c6d0 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
2c6e0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2c6f0 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
2c700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c710 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2c720 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c730 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2c740 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2c750 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%i)
2c760 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2c770 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
2c780 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2c790 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2c7a0 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
2c7b0 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
2c7c0 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
2c7d0 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
2c7e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2c7f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2c800 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29  GetFunctionList)
2c810 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  (CK_FUNCTION_LIS
2c820 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63  T_PTR_PTR ppFunc
2c830 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f  tionList) {..CK_
2c840 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
2c850 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  R pFunctionList;
2c860 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c870 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2c880 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74  );...if (ppFunct
2c890 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ionList == NULL)
2c8a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c8b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c8c0 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20   ppFunctionList 
2c8d0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2c8e0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2c8f0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70  NTS_BAD);..}...p
2c900 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d  FunctionList = m
2c910 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46  alloc(sizeof(*pF
2c920 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a  unctionList));..
2c930 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2c940 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  version.major = 
2c950 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
2c960 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
2c970 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
2c980 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
2c990 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
2c9a0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
2c9b0 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
2c9c0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
2c9d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2c9e0 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49  Initialize = C_I
2c9f0 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e  nitialize;..pFun
2ca00 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
2ca10 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69  alize = C_Finali
2ca20 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
2ca30 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20  st->C_GetInfo = 
2ca40 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  C_GetInfo;..pFun
2ca50 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2ca60 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74  SlotList = C_Get
2ca70 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63  SlotList;..pFunc
2ca80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
2ca90 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  lotInfo = C_GetS
2caa0 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  lotInfo;..pFunct
2cab0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f  ionList->C_GetTo
2cac0 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54  kenInfo = C_GetT
2cad0 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  okenInfo;..pFunc
2cae0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74  tionList->C_Wait
2caf0 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43  ForSlotEvent = C
2cb00 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
2cb10 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2cb20 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  t->C_GetMechanis
2cb30 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63  mList = C_GetMec
2cb40 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75  hanismList;..pFu
2cb50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2cb60 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d  tMechanismInfo =
2cb70 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
2cb80 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
2cb90 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e  ist->C_InitToken
2cba0 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a   = C_InitToken;.
2cbb0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2cbc0 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e  C_InitPIN = C_In
2cbd0 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  itPIN;..pFunctio
2cbe0 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20  nList->C_SetPIN 
2cbf0 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75  = C_SetPIN;..pFu
2cc00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70  nctionList->C_Op
2cc10 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70  enSession = C_Op
2cc20 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  enSession;..pFun
2cc30 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
2cc40 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c  seSession = C_Cl
2cc50 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75  oseSession;..pFu
2cc60 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c  nctionList->C_Cl
2cc70 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d  oseAllSessions =
2cc80 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
2cc90 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ons;..pFunctionL
2cca0 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f  ist->C_GetSessio
2ccb0 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73  nInfo = C_GetSes
2ccc0 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  sionInfo;..pFunc
2ccd0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f  tionList->C_GetO
2cce0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
2ccf0 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
2cd00 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2cd10 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74  ist->C_SetOperat
2cd20 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74  ionState = C_Set
2cd30 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
2cd40 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2cd50 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69  C_Login = C_Logi
2cd60 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
2cd70 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f  t->C_Logout = C_
2cd80 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69  Logout;..pFuncti
2cd90 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65  onList->C_Create
2cda0 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74  Object = C_Creat
2cdb0 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  eObject;..pFunct
2cdc0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f  ionList->C_CopyO
2cdd0 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62  bject = C_CopyOb
2cde0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2cdf0 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f  List->C_DestroyO
2ce00 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f  bject = C_Destro
2ce10 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  yObject;..pFunct
2ce20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62  ionList->C_GetOb
2ce30 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74  jectSize = C_Get
2ce40 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75  ObjectSize;..pFu
2ce50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2ce60 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
2ce70 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  = C_GetAttribute
2ce80 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
2ce90 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72  nList->C_SetAttr
2cea0 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53  ibuteValue = C_S
2ceb0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
2cec0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2ced0 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  ->C_FindObjectsI
2cee0 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  nit = C_FindObje
2cef0 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ctsInit;..pFunct
2cf00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
2cf10 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f  bjects = C_FindO
2cf20 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69  bjects;..pFuncti
2cf30 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
2cf40 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46  jectsFinal = C_F
2cf50 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b  indObjectsFinal;
2cf60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2cf70 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d  >C_EncryptInit =
2cf80 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a   C_EncryptInit;.
2cf90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2cfa0 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e  C_Encrypt = C_En
2cfb0 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f  crypt;..pFunctio
2cfc0 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
2cfd0 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79  Update = C_Encry
2cfe0 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
2cff0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
2d000 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63  yptFinal = C_Enc
2d010 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ryptFinal;..pFun
2d020 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
2d030 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63  ryptInit = C_Dec
2d040 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ryptInit;..pFunc
2d050 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
2d060 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b  ypt = C_Decrypt;
2d070 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2d080 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65  >C_DecryptUpdate
2d090 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61   = C_DecryptUpda
2d0a0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2d0b0 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e  st->C_DecryptFin
2d0c0 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  al = C_DecryptFi
2d0d0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
2d0e0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69  ist->C_DigestIni
2d0f0 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74  t = C_DigestInit
2d100 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2d110 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44  ->C_Digest = C_D
2d120 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  igest;..pFunctio
2d130 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55  nList->C_DigestU
2d140 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74  pdate = C_Digest
2d150 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2d160 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
2d170 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65  Key = C_DigestKe
2d180 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
2d190 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c  t->C_DigestFinal
2d1a0 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c   = C_DigestFinal
2d1b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2d1c0 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43  ->C_SignInit = C
2d1d0 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e  _SignInit;..pFun
2d1e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2d1f0 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75  n = C_Sign;..pFu
2d200 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
2d210 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  gnUpdate = C_Sig
2d220 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  nUpdate;..pFunct
2d230 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46  ionList->C_SignF
2d240 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e  inal = C_SignFin
2d250 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2d260 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65  st->C_SignRecove
2d270 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65  rInit = C_SignRe
2d280 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e  coverInit;..pFun
2d290 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2d2a0 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67  nRecover = C_Sig
2d2b0 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63  nRecover;..pFunc
2d2c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
2d2d0 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66  fyInit = C_Verif
2d2e0 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  yInit;..pFunctio
2d2f0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20  nList->C_Verify 
2d300 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75  = C_Verify;..pFu
2d310 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2d320 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56  rifyUpdate = C_V
2d330 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
2d340 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
2d350 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56  erifyFinal = C_V
2d360 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75  erifyFinal;..pFu
2d370 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2d380 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20  rifyRecoverInit 
2d390 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  = C_VerifyRecove
2d3a0 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  rInit;..pFunctio
2d3b0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
2d3c0 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66  ecover = C_Verif
2d3d0 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63  yRecover;..pFunc
2d3e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
2d3f0 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  stEncryptUpdate 
2d400 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  = C_DigestEncryp
2d410 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
2d420 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2d430 70 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d  ptDigestUpdate =
2d440 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
2d450 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2d460 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e  onList->C_SignEn
2d470 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
2d480 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
2d490 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2d4a0 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69  t->C_DecryptVeri
2d4b0 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  fyUpdate = C_Dec
2d4c0 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
2d4d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2d4e0 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20  ->C_GenerateKey 
2d4f0 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b  = C_GenerateKey;
2d500 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2d510 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61  >C_GenerateKeyPa
2d520 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b  ir = C_GenerateK
2d530 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69  eyPair;..pFuncti
2d540 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65  onList->C_WrapKe
2d550 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09  y = C_WrapKey;..
2d560 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2d570 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55  _UnwrapKey = C_U
2d580 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  nwrapKey;..pFunc
2d590 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69  tionList->C_Deri
2d5a0 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65  veKey = C_Derive
2d5b0 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
2d5c0 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f  ist->C_SeedRando
2d5d0 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  m = C_SeedRandom
2d5e0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2d5f0 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  ->C_GenerateRand
2d600 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52  om = C_GenerateR
2d610 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f  andom;..pFunctio
2d620 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63  nList->C_GetFunc
2d630 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47  tionStatus = C_G
2d640 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
2d650 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2d660 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  ->C_CancelFuncti
2d670 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e  on = C_CancelFun
2d680 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ction;..pFunctio
2d690 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63  nList->C_GetFunc
2d6a0 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74  tionList = C_Get
2d6b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2d6c0 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  *ppFunctionList 
2d6d0 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  = pFunctionList;
2d6e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d6f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d700 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2d710 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2d720 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a        n(CKR_OK);.}..