Hex Artifact Content

Artifact 6307d2f89c232348ae8f0a6b08f96d2121671e99:


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 73 74 61 74 69 63 20 75 6e 73 69  = 0;.static unsi
1400: 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59  gned long CACKEY
1410: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 76  _DEBUG_GETTIME(v
1420: 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63 6b  oid) {..if (cack
1430: 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74  ey_debug_start_t
1440: 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63 61  ime == 0) {...ca
1450: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
1460: 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  _time = time(NUL
1470: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  L);..}...return(
1480: 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63  time(NULL) - cac
1490: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
14a0: 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73 65  time);.}.#  else
14b0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
14c0: 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 42   long CACKEY_DEB
14d0: 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 29  UG_GETTIME(void)
14e0: 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d   {..return(0);.}
14f0: 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64 65  .#  endif..#  de
1500: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
1510: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b  G_PRINTF(x...) {
1520: 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72 20   \..static char 
1530: 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20 3d  buf_user[4096] =
1540: 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e 74   {0}; \..snprint
1550: 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a 65  f(buf_user, size
1560: 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78 29  of(buf_user), x)
1570: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1580: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1590: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
15a0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
15b0: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
15c0: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e 22  : %s():%i: %s\n"
15d0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47  , CACKEY_DEBUG_G
15e0: 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e 63  ETTIME(), __func
15f0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62 75  __, __LINE__, bu
1600: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c 75  f_user); \..fflu
1610: 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  sh(cackey_debug_
1620: 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64 65  fd()); \.}.#  de
1630: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
1640: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
1650: 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20   y) { \..static 
1660: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 30  char buf_user[40
1670: 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66 5f  96] = {0}, *buf_
1680: 75 73 65 72 5f 70 3b 20 5c 0a 09 75 6e 73 69 67  user_p; \..unsig
1690: 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 73 65  ned long buf_use
16a0: 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 69 67  r_size; \..unsig
16b0: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46  ned char *TMPBUF
16c0: 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ; \..unsigned lo
16d0: 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 20 73  ng idx; \..int s
16e0: 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09  nprintf_ret; \..
16f0: 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67 6e  TMPBUF = (unsign
1700: 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b 20  ed char *) (x); 
1710: 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 20 3d 20  \..buf_user_p = 
1720: 62 75 66 5f 75 73 65 72 3b 20 5c 0a 09 62 75 66  buf_user; \..buf
1730: 5f 75 73 65 72 5f 73 69 7a 65 20 3d 20 73 69 7a  _user_size = siz
1740: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 3b 20 5c  eof(buf_user); \
1750: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20  ..for (idx = 1; 
1760: 69 64 78 20 3c 20 28 79 29 3b 20 69 64 78 2b 2b  idx < (y); idx++
1770: 29 20 7b 20 5c 0a 09 09 69 66 20 28 62 75 66 5f  ) { \...if (buf_
1780: 75 73 65 72 5f 73 69 7a 65 20 3c 3d 20 30 29 20  user_size <= 0) 
1790: 7b 20 5c 0a 09 09 09 62 72 65 61 6b 3b 20 5c 0a  { \....break; \.
17a0: 09 09 7d 3b 20 5c 0a 09 09 73 6e 70 72 69 6e 74  ..}; \...snprint
17b0: 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74 66  f_ret = snprintf
17c0: 28 62 75 66 5f 75 73 65 72 5f 70 2c 20 62 75 66  (buf_user_p, buf
17d0: 5f 75 73 65 72 5f 73 69 7a 65 2c 20 22 2c 20 25  _user_size, ", %
17e0: 30 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78  02x", TMPBUF[idx
17f0: 5d 29 3b 20 5c 0a 09 09 69 66 20 28 73 6e 70 72  ]); \...if (snpr
1800: 69 6e 74 66 5f 72 65 74 20 3c 3d 20 30 29 20 7b  intf_ret <= 0) {
1810: 20 5c 0a 09 09 09 62 72 65 61 6b 3b 20 5c 0a 09   \....break; \..
1820: 09 7d 3b 20 5c 0a 09 09 62 75 66 5f 75 73 65 72  .}; \...buf_user
1830: 5f 70 20 2b 3d 20 73 6e 70 72 69 6e 74 66 5f 72  _p += snprintf_r
1840: 65 74 3b 20 5c 0a 09 09 62 75 66 5f 75 73 65 72  et; \...buf_user
1850: 5f 73 69 7a 65 20 2d 3d 20 73 6e 70 72 69 6e 74  _size -= snprint
1860: 66 5f 72 65 74 3b 20 5c 0a 09 7d 3b 20 5c 0a 09  f_ret; \..}; \..
1870: 62 75 66 5f 75 73 65 72 5b 73 69 7a 65 6f 66 28  buf_user[sizeof(
1880: 62 75 66 5f 75 73 65 72 29 20 2d 20 31 5d 20 3d  buf_user) - 1] =
1890: 20 27 5c 30 27 3b 20 5c 0a 09 66 70 72 69 6e 74   '\0'; \..fprint
18a0: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
18b0: 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28  d(), "[%lu]: %s(
18c0: 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f 25 6c  ):%i: %s  (%s/%l
18d0: 75 20 3d 20 7b 25 30 32 78 25 73 7d 29 5c 6e 22  u = {%02x%s})\n"
18e0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47  , CACKEY_DEBUG_G
18f0: 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e 63  ETTIME(), __func
1900: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c  __, __LINE__, f,
1910: 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c   #x, (unsigned l
1920: 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46  ong) (y), TMPBUF
1930: 5b 30 5d 2c 20 62 75 66 5f 75 73 65 72 29 3b 20  [0], buf_user); 
1940: 5c 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  \..fflush(cackey
1950: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a  _debug_fd()); \.
1960: 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72 65 65  }.#  define free
1970: 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42  (x) { CACKEY_DEB
1980: 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28  UG_PRINTF("FREE(
1990: 25 70 29 20 28 25 73 29 22 2c 20 28 76 6f 69 64  %p) (%s)", (void
19a0: 20 2a 29 20 78 2c 20 23 78 29 3b 20 66 72 65 65   *) x, #x); free
19b0: 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 46  (x); }..static F
19c0: 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64 65 62 75  ILE *cackey_debu
19d0: 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a 09 73 74  g_fd(void) {..st
19e0: 61 74 69 63 20 46 49 4c 45 20 2a 66 64 20 3d 20  atic FILE *fd = 
19f0: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c 6f 67  NULL;..char *log
1a00: 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66 64 20 21  file;...if (fd !
1a10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1a20: 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a  rn(fd);..}.../*.
1a30: 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74 64 65 72  . * Log to stder
1a40: 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 6f 20 77  r initially so w
1a50: 65 20 63 61 6e 20 75 73 65 20 64 65 62 75 67 67  e can use debugg
1a60: 69 6e 67 20 77 69 74 68 69 6e 0a 09 20 2a 20 74  ing within.. * t
1a70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  his function wit
1a80: 68 6f 75 74 20 67 65 74 74 69 6e 67 20 69 6e 74  hout getting int
1a90: 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f  o an infinite lo
1aa0: 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d 20 73 74  op.. */..fd = st
1ab0: 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c 65 20  derr;...logfile 
1ac0: 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59  = getenv("CACKEY
1ad0: 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29  _DEBUG_LOGFILE")
1ae0: 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21  ;..if (logfile !
1af0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1b00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b10: 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f 6e 6d 65  "Found environme
1b20: 6e 74 20 76 61 72 69 61 62 6c 65 3a 20 25 73 22  nt variable: %s"
1b30: 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 6c  , logfile);....l
1b40: 6f 67 66 69 6c 65 20 3d 20 73 74 72 63 68 72 28  ogfile = strchr(
1b50: 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29 3b 0a 09  logfile, '=');..
1b60: 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d 20  .if (logfile == 
1b70: 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 66 69  NULL) {....logfi
1b80: 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43  le = getenv("CAC
1b90: 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c  KEY_DEBUG_LOGFIL
1ba0: 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  E");...} else {.
1bb0: 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a 09 09  ...logfile++;...
1bc0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 67 66 69  }..}...if (logfi
1bd0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le != NULL) {...
1be0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bf0: 4e 54 46 28 22 46 6f 75 6e 64 20 6c 6f 67 20 66  NTF("Found log f
1c00: 69 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c  ile: %s", logfil
1c10: 65 29 3b 0a 0a 09 09 66 64 20 3d 20 66 6f 70 65  e);....fd = fope
1c20: 6e 28 6c 6f 67 66 69 6c 65 2c 20 22 61 22 29 3b  n(logfile, "a");
1c30: 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20  ..}...if (fd == 
1c40: 4e 55 4c 4c 29 20 7b 0a 09 09 66 64 20 3d 20 73  NULL) {...fd = s
1c50: 74 64 65 72 72 3b 0a 09 7d 0a 0a 09 69 66 20 28  tderr;..}...if (
1c60: 66 64 20 3d 3d 20 73 74 64 65 72 72 29 20 7b 0a  fd == stderr) {.
1c70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c80: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1c90: 20 73 74 64 65 72 72 22 29 3b 0a 09 7d 20 65 6c   stderr");..} el
1ca0: 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
1cb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1cc0: 72 6e 69 6e 67 20 25 70 22 2c 20 28 76 6f 69 64  rning %p", (void
1cd0: 20 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a 09 72 65   *) fd);..}...re
1ce0: 74 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 73 74 61  turn(fd);.}..sta
1cf0: 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59  tic void *CACKEY
1d00: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c  _DEBUG_FUNC_MALL
1d10: 4f 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  OC(size_t size, 
1d20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
1d30: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
1d40: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
1d50: 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73  etval = malloc(s
1d60: 69 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ize);...fprintf(
1d70: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1d80: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
1d90: 25 69 3a 20 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  %i: MALLOC() = %
1da0: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
1db0: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
1dc0: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
1dd0: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
1de0: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
1df0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1e00: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1e10: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
1e20: 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20  NC_REALLOC(void 
1e30: 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a  *ptr, size_t siz
1e40: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
1e50: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
1e60: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
1e70: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1e80: 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a  oc(ptr, size);..
1e90: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70  .if (retval != p
1ea0: 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  tr) {...fprintf(
1eb0: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1ec0: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
1ed0: 25 69 3a 20 52 45 41 4c 4c 4f 43 28 25 70 29 20  %i: REALLOC(%p) 
1ee0: 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f  = %p\n", CACKEY_
1ef0: 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c  DEBUG_GETTIME(),
1f00: 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 70 74 72   func, line, ptr
1f10: 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 66 6c  , retval);...ffl
1f20: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1f30: 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20  _fd());..}...if 
1f40: 28 72 65 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29  (retval == NULL)
1f50: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f60: 47 5f 50 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45  G_PRINTF(" *** E
1f70: 52 52 4f 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63  RROR *** realloc
1f80: 20 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28   returned NULL (
1f90: 73 69 7a 65 20 3d 20 25 6c 75 29 22 2c 20 28 75  size = %lu)", (u
1fa0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
1fb0: 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ze);..}...return
1fc0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
1fd0: 74 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59  tic char *CACKEY
1fe0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44  _DEBUG_FUNC_STRD
1ff0: 55 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  UP(const char *p
2000: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
2010: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
2020: 7b 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b  {..char *retval;
2030: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64  ...retval = strd
2040: 75 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e  up(ptr);...fprin
2050: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
2060: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73  fd(), "[%lu]: %s
2070: 28 29 3a 25 69 3a 20 53 54 52 44 55 50 5f 4d 41  ():%i: STRDUP_MA
2080: 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e 22 2c 20  LLOC() = %p\n", 
2090: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
20a0: 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69  TIME(), func, li
20b0: 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 66  ne, retval);..ff
20c0: 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75  lush(cackey_debu
20d0: 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 75 72  g_fd());...retur
20e0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
20f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2100: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
2110: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e  NC_TAG_TO_STR(un
2120: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29  signed char tag)
2130: 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29   {..switch (tag)
2140: 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f   {...case GSCIS_
2150: 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72  TAG_CARDID:....r
2160: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2170: 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73  _CARDID");...cas
2180: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
2190: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
21a0: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
21b0: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
21c0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09  S_TAG_CCG_VER:..
21d0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
21e0: 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09  TAG_CCG_VER");..
21f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2200: 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75  CARDURL:....retu
2210: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2220: 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20  RDURL");...case 
2230: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
2240: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2250: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b  IS_TAG_PKCS15");
2260: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2270: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
2280: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2290: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
22a0: 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  MODEL");...case 
22b0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
22c0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
22d0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
22e0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  BLE");...case GS
22f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
2300: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
2310: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
2320: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
2330: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
2340: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
2350: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2360: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ION");...case GS
2370: 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72  CIS_TAG_CT:....r
2380: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2390: 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _CT");...case GS
23a0: 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72  CIS_TAG_ST:....r
23b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
23c0: 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _ST");...case GS
23d0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a  CIS_TAG_NEXTCCC:
23e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
23f0: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b  S_TAG_NEXTCCC");
2400: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2410: 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_FNAME:....retu
2420: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e  rn("GSCIS_TAG_FN
2430: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
2440: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09  CIS_TAG_MNAME:..
2450: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2460: 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_MNAME");...c
2470: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e  ase GSCIS_TAG_LN
2480: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
2490: 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22  GSCIS_TAG_LNAME"
24a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
24b0: 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72  TAG_SUFFIX:....r
24c0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
24d0: 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73  _SUFFIX");...cas
24e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  e GSCIS_TAG_GOVT
24f0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
2500: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f  rn("GSCIS_TAG_GO
2510: 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  VT_AGENCY");...c
2520: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
2530: 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  REAU:....return(
2540: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
2550: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
2560: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
2570: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2580: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2590: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
25a0: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
25b0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
25c0: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
25d0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
25e0: 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09  S_TAG_TITLE:....
25f0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2600: 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73  G_TITLE");...cas
2610: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
2620: 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28  DING:....return(
2630: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44  "GSCIS_TAG_BUILD
2640: 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ING");...case GS
2650: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
2660: 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  DDR1:....return(
2670: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2680: 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73  E_ADDR1");...cas
2690: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
26a0: 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74  CE_ADDR2:....ret
26b0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
26c0: 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09  FFICE_ADDR2");..
26d0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
26e0: 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09  OFFICE_CITY:....
26f0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2700: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b  G_OFFICE_CITY");
2710: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2720: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a  G_OFFICE_STATE:.
2730: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2740: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
2750: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2760: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
2770: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2780: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
2790: 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  P");...case GSCI
27a0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
27b0: 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  NTRY:....return(
27c0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
27d0: 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63  E_COUNTRY");...c
27e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
27f0: 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72  FICE_PHONE:....r
2800: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2810: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b  _OFFICE_PHONE");
2820: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2830: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
2840: 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  XT:....return("G
2850: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2860: 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63  PHONE_EXT");...c
2870: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2880: 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74  FICE_FAX:....ret
2890: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
28a0: 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63  FFICE_FAX");...c
28b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
28c0: 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72  FICE_EMAIL:....r
28d0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
28e0: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b  _OFFICE_EMAIL");
28f0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2900: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09  G_OFFICE_ROOM:..
2910: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2920: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22  TAG_OFFICE_ROOM"
2930: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2940: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
2950: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2960: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2970: 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20  GENCY");...case 
2980: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
2990: 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74  SIGNATOR:....ret
29a0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
29b0: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b  SN_DESIGNATOR");
29c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29d0: 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e  G_SSN:....return
29e0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22  ("GSCIS_TAG_SSN"
29f0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2a00: 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75  TAG_DOB:....retu
2a10: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2a20: 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  B");...case GSCI
2a30: 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09  S_TAG_GENDER:...
2a40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2a50: 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63  AG_GENDER");...c
2a60: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53  ase GSCIS_TAG_US
2a70: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2a80: 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49  "GSCIS_TAG_USERI
2a90: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2aa0: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09  S_TAG_DOMAIN:...
2ab0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ac0: 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63  AG_DOMAIN");...c
2ad0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41  ase GSCIS_TAG_PA
2ae0: 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72  SSWORD:....retur
2af0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53  n("GSCIS_TAG_PAS
2b00: 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20  SWORD");...case 
2b10: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2b20: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2b30: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2b40: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2b50: 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09  S_TAG_SERNO:....
2b60: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2b70: 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73  G_SERNO");...cas
2b80: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2b90: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
2ba0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2bb0: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
2bc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
2bd0: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
2be0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58  rn("GSCIS_TAG_EX
2bf0: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  PIRE_DATE");...c
2c00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2c10: 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  RD_TYPE:....retu
2c20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2c30: 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  RD_TYPE");...cas
2c40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55  e GSCIS_TAG_SECU
2c50: 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65  RITY_CODE:....re
2c60: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2c70: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b  SECURITY_CODE");
2c80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c90: 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09  G_CARDID_AID:...
2ca0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2cb0: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b  AG_CARDID_AID");
2cc0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2cd0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
2ce0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2cf0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22  TAG_CERTIFICATE"
2d00: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2d10: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2d20: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2d30: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2d40: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2d50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
2d60: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  RT_EXPIRE_DATE:.
2d70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d80: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
2d90: 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  _DATE");..}...re
2da0: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
2db0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
2dc0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
2dd0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
2de0: 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65  R_TO_STR(LONG re
2df0: 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68  tcode) {..switch
2e00: 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63   (retcode) {...c
2e10: 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43  ase SCARD_S_SUCC
2e20: 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ESS:....return("
2e30: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22  SCARD_S_SUCCESS"
2e40: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2e50: 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  E_CANCELLED:....
2e60: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2e70: 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63  CANCELLED");...c
2e80: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54  ase SCARD_E_CANT
2e90: 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74  _DISPOSE:....ret
2ea0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
2eb0: 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63  T_DISPOSE");...c
2ec0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ase SCARD_E_INSU
2ed0: 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a  FFICIENT_BUFFER:
2ee0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2ef0: 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
2f00: 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73  _BUFFER");...cas
2f10: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2f20: 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e  D_ATR:....return
2f30: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
2f40: 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20  D_ATR");...case 
2f50: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2f60: 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72  HANDLE:....retur
2f70: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2f80: 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63  ID_HANDLE");...c
2f90: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2fa0: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09  LID_PARAMETER:..
2fb0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2fc0: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
2fd0: 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TER");...case SC
2fe0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
2ff0: 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RGET:....return(
3000: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
3010: 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73  _TARGET");...cas
3020: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
3030: 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  D_VALUE:....retu
3040: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
3050: 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63  LID_VALUE");...c
3060: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  ase SCARD_E_NO_M
3070: 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  EMORY:....return
3080: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  ("SCARD_E_NO_MEM
3090: 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ORY");...case SC
30a0: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
30b0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
30c0: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
30d0: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
30e0: 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  e SCARD_E_TIMEOU
30f0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
3100: 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b  ARD_E_TIMEOUT");
3110: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3120: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
3130: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  N:....return("SC
3140: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
3150: 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  OLATION");...cas
3160: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  e SCARD_E_NO_SMA
3170: 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  RTCARD:....retur
3180: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  n("SCARD_E_NO_SM
3190: 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ARTCARD");...cas
31a0: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
31b0: 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  N_CARD:....retur
31c0: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
31d0: 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  WN_CARD");...cas
31e0: 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  e SCARD_E_PROTO_
31f0: 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74  MISMATCH:....ret
3200: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f  urn("SCARD_E_PRO
3210: 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09  TO_MISMATCH");..
3220: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3230: 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75  T_READY:....retu
3240: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
3250: 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20  READY");...case 
3260: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
3270: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
3280: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53  urn("SCARD_E_SYS
3290: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  TEM_CANCELLED");
32a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
32b0: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a  NOT_TRANSACTED:.
32c0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
32d0: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
32e0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
32f0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
3300: 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  ILABLE:....retur
3310: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
3320: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b  R_UNAVAILABLE");
3330: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
3340: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
3350: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3360: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
3370: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3380: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
3390: 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65  SIVE_CARD:....re
33a0: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
33b0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22  RESPONSIVE_CARD"
33c0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33d0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
33e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
33f0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
3400: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3410: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
3420: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3430: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22  RD_W_RESET_CARD"
3440: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3450: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a  W_REMOVED_CARD:.
3460: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3470: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22  _W_REMOVED_CARD"
3480: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3490: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a  E_PCI_TOO_SMALL:
34a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
34b0: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
34c0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  L");...case SCAR
34d0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
34e0: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
34f0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
3500: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  R_UNSUPPORTED");
3510: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3520: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
3530: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3540: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
3550: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
3560: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
3570: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
3580: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52  urn("SCARD_E_CAR
3590: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  D_UNSUPPORTED");
35a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
35b0: 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72  NO_SERVICE:....r
35c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
35d0: 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63  O_SERVICE");...c
35e0: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56  ase SCARD_E_SERV
35f0: 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09  ICE_STOPPED:....
3600: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3610: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22  SERVICE_STOPPED"
3620: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3630: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
3640: 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e  ATURE:....return
3650: 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  ("SCARD_E_UNSUPP
3660: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b  ORTED_FEATURE");
3670: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f  .#ifdef SCARD_W_
3680: 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09  INSERTED_CARD...
3690: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53  case SCARD_W_INS
36a0: 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ERTED_CARD:....r
36b0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49  eturn("SCARD_W_I
36c0: 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a  NSERTED_CARD");.
36d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43  #endif.#ifdef SC
36e0: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
36f0: 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73  _AVAILABLE...cas
3700: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  e SCARD_E_NO_REA
3710: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a  DERS_AVAILABLE:.
3720: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3730: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3740: 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69  AILABLE");.#endi
3750: 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  f..}...return("U
3760: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
3770: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3780: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3790: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75  C_OBJID_TO_STR(u
37a0: 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b  int16_t objid) {
37b0: 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29  ..switch (objid)
37c0: 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30 30   {...case 0x2000
37d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
37e0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
37f0: 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  NERALINFO");...c
3800: 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72  ase 0x2100:....r
3810: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3820: 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f  V_OBJID_PROPERSO
3830: 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  NALINFO");...cas
3840: 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74  e 0x3000:....ret
3850: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3860: 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54  OBJID_ACCESSCONT
3870: 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ROL");...case 0x
3880: 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  4000:....return(
3890: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
38a0: 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73  D_LOGIN");...cas
38b0: 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74  e 0x5000:....ret
38c0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
38d0: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29  OBJID_CARDINFO")
38e0: 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30 3a  ;...case 0x6000:
38f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3900: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
3910: 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73  METRICS");...cas
3920: 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74  e 0x7000:....ret
3930: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3940: 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47  OBJID_DIGITALSIG
3950: 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30  CERT");...case 0
3960: 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x0200:....return
3970: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3980: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b  ID_CAC_PERSON");
3990: 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a  ...case 0x0202:.
39a0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
39b0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
39c0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
39d0: 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65  se 0x0203:....re
39e0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
39f0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
3a00: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3a10: 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65  se 0x0201:....re
3a20: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3a30: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3a40: 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  NNEL");...case 0
3a50: 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e  x02FE:....return
3a60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3a70: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29  ID_CAC_PKICERT")
3a80: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22  ;..}....return("
3a90: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
3aa0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3ab0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
3ac0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
3ad0: 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70  R(uint8_t apptyp
3ae0: 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70  e) {..switch (ap
3af0: 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  ptype) {...case 
3b00: 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x00:....return(
3b10: 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20  "NONE");...case 
3b20: 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x01:....return(
3b30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3b40: 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73  GENERIC");...cas
3b50: 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72  e 0x02:....retur
3b60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3b70: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3b80: 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x03:....return(
3b90: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3ba0: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
3bb0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
3bc0: 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09  ..case 0x04:....
3bd0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3be0: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
3bf0: 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65  case 0x05:....re
3c00: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3c10: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3c20: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3c30: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36  I");...case 0x06
3c40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3c50: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
3c60: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
3c70: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
3c80: 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x07:....return("
3c90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
3ca0: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
3cb0: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41  TLV_APP_SKI | CA
3cc0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3cd0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
3ce0: 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 73  "INVALID");.}..s
3cf0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3d00: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3d10: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
3d20: 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42 55 54  _STR(CK_ATTRIBUT
3d30: 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b 0a 09  E_TYPE attr) {..
3d40: 73 77 69 74 63 68 20 28 61 74 74 72 29 20 7b 0a  switch (attr) {.
3d50: 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53  ..case CKA_CLASS
3d60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
3d70: 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61 73 65  _CLASS");...case
3d80: 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72   CKA_TOKEN:....r
3d90: 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e  eturn("CKA_TOKEN
3da0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
3db0: 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74 75 72  RIVATE:....retur
3dc0: 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45 22 29  n("CKA_PRIVATE")
3dd0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42  ;...case CKA_LAB
3de0: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  EL:....return("C
3df0: 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61  KA_LABEL");...ca
3e00: 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41 54 49  se CKA_APPLICATI
3e10: 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ON:....return("C
3e20: 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 22 29  KA_APPLICATION")
3e30: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
3e40: 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  UE:....return("C
3e50: 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61  KA_VALUE");...ca
3e60: 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  se CKA_OBJECT_ID
3e70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
3e80: 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09  _OBJECT_ID");...
3e90: 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49  case CKA_CERTIFI
3ea0: 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 72 65  CATE_TYPE:....re
3eb0: 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54 49 46  turn("CKA_CERTIF
3ec0: 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a 09 09  ICATE_TYPE");...
3ed0: 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a  case CKA_ISSUER:
3ee0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
3ef0: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65  ISSUER");...case
3f00: 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
3f10: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
3f20: 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
3f30: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
3f40: 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74  C_ISSUER:....ret
3f50: 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53 53 55  urn("CKA_AC_ISSU
3f60: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
3f70: 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74 75 72  _OWNER:....retur
3f80: 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a  n("CKA_OWNER");.
3f90: 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54 52 5f  ..case CKA_ATTR_
3fa0: 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75 72 6e  TYPES:....return
3fb0: 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53  ("CKA_ATTR_TYPES
3fc0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54  ");...case CKA_T
3fd0: 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74 75 72  RUSTED:....retur
3fe0: 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44 22 29  n("CKA_TRUSTED")
3ff0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59  ;...case CKA_KEY
4000: 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e  _TYPE:....return
4010: 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29  ("CKA_KEY_TYPE")
4020: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ;...case CKA_SUB
4030: 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  JECT:....return(
4040: 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a  "CKA_SUBJECT");.
4050: 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09  ..case CKA_ID:..
4060: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 44  ..return("CKA_ID
4070: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4080: 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74  ENSITIVE:....ret
4090: 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49 54 49  urn("CKA_SENSITI
40a0: 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  VE");...case CKA
40b0: 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _ENCRYPT:....ret
40c0: 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59 50 54  urn("CKA_ENCRYPT
40d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
40e0: 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72  ECRYPT:....retur
40f0: 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54 22 29  n("CKA_DECRYPT")
4100: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57 52 41  ;...case CKA_WRA
4110: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
4120: 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65  A_WRAP");...case
4130: 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09   CKA_UNWRAP:....
4140: 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52  return("CKA_UNWR
4150: 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AP");...case CKA
4160: 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e  _SIGN:....return
4170: 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09  ("CKA_SIGN");...
4180: 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45  case CKA_SIGN_RE
4190: 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  COVER:....return
41a0: 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  ("CKA_SIGN_RECOV
41b0: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
41c0: 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65 74 75  _VERIFY:....retu
41d0: 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 22 29  rn("CKA_VERIFY")
41e0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52  ;...case CKA_VER
41f0: 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IFY_RECOVER:....
4200: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49  return("CKA_VERI
4210: 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09  FY_RECOVER");...
4220: 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56 45 3a  case CKA_DERIVE:
4230: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4240: 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61 73 65  DERIVE");...case
4250: 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 3a   CKA_START_DATE:
4260: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4270: 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a 09 09  START_DATE");...
4280: 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54  case CKA_END_DAT
4290: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
42a0: 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09  A_END_DATE");...
42b0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
42c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
42d0: 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09 63 61  _MODULUS");...ca
42e0: 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42  se CKA_MODULUS_B
42f0: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
4300: 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53  CKA_MODULUS_BITS
4310: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4320: 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a  UBLIC_EXPONENT:.
4330: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4340: 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29  UBLIC_EXPONENT")
4350: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4360: 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09  VATE_EXPONENT:..
4370: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
4380: 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29  IVATE_EXPONENT")
4390: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
43a0: 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_1:....return(
43b0: 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a  "CKA_PRIME_1");.
43c0: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
43d0: 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  _2:....return("C
43e0: 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09  KA_PRIME_2");...
43f0: 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e  case CKA_EXPONEN
4400: 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  T_1:....return("
4410: 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29  CKA_EXPONENT_1")
4420: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50  ;...case CKA_EXP
4430: 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75  ONENT_2:....retu
4440: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  rn("CKA_EXPONENT
4450: 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _2");...case CKA
4460: 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a 09 09  _COEFFICIENT:...
4470: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45  .return("CKA_COE
4480: 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09 63 61  FFICIENT");...ca
4490: 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09  se CKA_PRIME:...
44a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
44b0: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ME");...case CKA
44c0: 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09 72 65  _SUBPRIME:....re
44d0: 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50 52 49  turn("CKA_SUBPRI
44e0: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ME");...case CKA
44f0: 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  _BASE:....return
4500: 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09  ("CKA_BASE");...
4510: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42  case CKA_PRIME_B
4520: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
4530: 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 22 29  CKA_PRIME_BITS")
4540: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ;...case CKA_SUB
4550: 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09  _PRIME_BITS:....
4560: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f  return("CKA_SUB_
4570: 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09  PRIME_BITS");...
4580: 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42  case CKA_VALUE_B
4590: 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ITS:....return("
45a0: 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 22 29  CKA_VALUE_BITS")
45b0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
45c0: 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72  UE_LEN:....retur
45d0: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e  n("CKA_VALUE_LEN
45e0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
45f0: 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72  XTRACTABLE:....r
4600: 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54 52 41  eturn("CKA_EXTRA
4610: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  CTABLE");...case
4620: 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72   CKA_LOCAL:....r
4630: 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c  eturn("CKA_LOCAL
4640: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e  ");...case CKA_N
4650: 45 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45  EVER_EXTRACTABLE
4660: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4670: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4680: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  LE");...case CKA
4690: 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56  _ALWAYS_SENSITIV
46a0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
46b0: 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49  A_ALWAYS_SENSITI
46c0: 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  VE");...case CKA
46d0: 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49  _KEY_GEN_MECHANI
46e0: 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SM:....return("C
46f0: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
4700: 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65 20 43  NISM");...case C
4710: 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09  KA_MODIFIABLE:..
4720: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f  ..return("CKA_MO
4730: 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09 63 61  DIFIABLE");...ca
4740: 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50 41 52  se CKA_ECDSA_PAR
4750: 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AMS:....return("
4760: 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53  CKA_ECDSA_PARAMS
4770: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4780: 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75  C_POINT:....retu
4790: 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54  rn("CKA_EC_POINT
47a0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
47b0: 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09  ECONDARY_AUTH:..
47c0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
47d0: 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29 3b 0a  CONDARY_AUTH");.
47e0: 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54 48 5f  ..case CKA_AUTH_
47f0: 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65  PIN_FLAGS:....re
4800: 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50  turn("CKA_AUTH_P
4810: 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09 63 61  IN_FLAGS");...ca
4820: 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54 55 52  se CKA_HW_FEATUR
4830: 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72  E_TYPE:....retur
4840: 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54 55 52  n("CKA_HW_FEATUR
4850: 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65  E_TYPE");...case
4860: 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e   CKA_RESET_ON_IN
4870: 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  IT:....return("C
4880: 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54  KA_RESET_ON_INIT
4890: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48  ");...case CKA_H
48a0: 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72 65 74  AS_RESET:....ret
48b0: 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52 45 53  urn("CKA_HAS_RES
48c0: 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ET");...case CKA
48d0: 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a  _VENDOR_DEFINED:
48e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
48f0: 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 22 29  VENDOR_DEFINED")
4900: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  ;..}...return("U
4910: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20  NKNOWN");.}..#  
4920: 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29  define malloc(x)
4930: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4940: 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66  NC_MALLOC(x, __f
4950: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4960: 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c  .#  define reall
4970: 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f  oc(x, y) CACKEY_
4980: 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c  DEBUG_FUNC_REALL
4990: 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f  OC(x, y, __func_
49a0: 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20  _, __LINE__).#  
49b0: 69 66 64 65 66 20 73 74 72 64 75 70 0a 23 20 20  ifdef strdup.#  
49c0: 20 20 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23    undef strdup.#
49d0: 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e    endif.#  defin
49e0: 65 20 73 74 72 64 75 70 28 78 29 20 43 41 43 4b  e strdup(x) CACK
49f0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54  EY_DEBUG_FUNC_ST
4a00: 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f  RDUP(x, __func__
4a10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73  , __LINE__).#els
4a20: 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  e.#  define CACK
4a30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4a40: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x...) /**/.#  de
4a50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4a60: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
4a70: 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69   y) /**/.#  defi
4a80: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4a90: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
4aa0: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4ab0: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4ac0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4ad0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
4ae0: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4af0: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4b00: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4b10: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20  OBJID_TO_STR(x) 
4b20: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4b30: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4b40: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50  Y_DEBUG_FUNC_APP
4b50: 54 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22  TYPE_TO_STR(x) "
4b60: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4b70: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4b80: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52  _DEBUG_FUNC_ATTR
4b90: 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 78 29 20  IBUTE_TO_STR(x) 
4ba0: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4bb0: 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63 74 20  .#endif..struct 
4bc0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
4bd0: 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e 65 64  tity {..unsigned
4be0: 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b   char applet[7];
4bf0: 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65 3b  ..uint16_t file;
4c00: 0a 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66  ...size_t certif
4c10: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69  icate_len;..unsi
4c20: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69  gned char *certi
4c30: 66 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f  ficate;...ssize_
4c40: 74 20 6b 65 79 73 69 7a 65 3b 0a 7d 3b 0a 0a 73  t keysize;.};..s
4c50: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
4c60: 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20  ntity {..struct 
4c70: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
4c80: 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
4c90: 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42  ity;...CK_ATTRIB
4ca0: 55 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b  UTE *attributes;
4cb0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69  ..CK_ULONG attri
4cc0: 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a  butes_count;.};.
4cd0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  .struct cackey_s
4ce0: 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63  ession {..int ac
4cf0: 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f  tive;...CK_SLOT_
4d00: 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f  ID slotID;...CK_
4d10: 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b  STATE state;..CK
4d20: 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43  _FLAGS flags;..C
4d30: 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65  K_ULONG ulDevice
4d40: 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f  Error;..CK_VOID_
4d50: 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  PTR pApplication
4d60: 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74  ;..CK_NOTIFY Not
4d70: 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61  ify;...struct ca
4d80: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
4d90: 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
4da0: 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
4db0: 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e  ties_count;...in
4dc0: 74 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b  t search_active;
4dd0: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  ..CK_ATTRIBUTE_P
4de0: 54 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b  TR search_query;
4df0: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63  ..CK_ULONG searc
4e00: 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09  h_query_count;..
4e10: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65  unsigned long se
4e20: 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09  arch_curr_id;...
4e30: 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b  int sign_active;
4e40: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  ..CK_MECHANISM_T
4e50: 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69  YPE sign_mechani
4e60: 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52  sm;..CK_BYTE_PTR
4e70: 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69   sign_buf;..unsi
4e80: 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62  gned long sign_b
4e90: 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64  uflen;..unsigned
4ea0: 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73   long sign_bufus
4eb0: 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ed;..struct cack
4ec0: 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67  ey_identity *sig
4ed0: 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e  n_identity;...in
4ee0: 74 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  t decrypt_active
4ef0: 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  ;..CK_MECHANISM_
4f00: 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63  TYPE decrypt_mec
4f10: 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44  hanism;..CK_VOID
4f20: 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63  _PTR decrypt_mec
4f30: 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e  h_parm;..CK_ULON
4f40: 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  G decrypt_mech_p
4f50: 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20  armlen;..struct 
4f60: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
4f70: 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  *decrypt_identit
4f80: 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  y;.};..struct ca
4f90: 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74  ckey_slot {..int
4fa0: 20 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e   active;..int in
4fb0: 74 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a  ternal;...char *
4fc0: 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69  pcsc_reader;...i
4fd0: 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  nt pcsc_card_con
4fe0: 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41  nected;..SCARDHA
4ff0: 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a  NDLE pcsc_card;.
5000: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
5010: 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72  n_depth;..int tr
5020: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
5030: 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c  w_lock;...int sl
5040: 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46  ot_reset;...CK_F
5050: 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73  LAGS token_flags
5060: 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ;...unsigned cha
5070: 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52  r *label;...DWOR
5080: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e  D protocol;...un
5090: 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65  signed int cache
50a0: 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09  d_certs_count;..
50b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
50c0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  sc_identity *cac
50d0: 68 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a 74  hed_certs;.};..t
50e0: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
50f0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
5100: 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43  NERIC = 0x01,..C
5110: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
5120: 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43  I     = 0x02,..C
5130: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
5140: 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63  I     = 0x04.} c
5150: 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70  ackey_tlv_apptyp
5160: 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  e;..typedef enum
5170: 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f   {..CACKEY_TLV_O
5180: 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f  BJID_GENERALINFO
5190: 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c         = 0x2000,
51a0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
51b0: 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e  ID_PROPERSONALIN
51c0: 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09  FO   = 0x2100,..
51d0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
51e0: 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20  _ACCESSCONTROL  
51f0: 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41     = 0x3000,..CA
5200: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c  CKEY_TLV_OBJID_L
5210: 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20 20  OGIN            
5220: 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b   = 0x4000,..CACK
5230: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52  EY_TLV_OBJID_CAR
5240: 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d  DINFO          =
5250: 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x5000,..CACKEY
5260: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45  _TLV_OBJID_BIOME
5270: 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20 30  TRICS        = 0
5280: 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x6000,..CACKEY_T
5290: 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c  LV_OBJID_DIGITAL
52a0: 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78 37  SIGCERT    = 0x7
52b0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
52c0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
52d0: 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32 30  N        = 0x020
52e0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
52f0: 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54  BJID_CAC_BENEFIT
5300: 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c  S      = 0x0202,
5310: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5320: 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45  ID_CAC_OTHERBENE
5330: 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09  FITS = 0x0203,..
5340: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5350: 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20  _CAC_PERSONNEL  
5360: 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41     = 0x0201,..CA
5370: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
5380: 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20  AC_PKICERT      
5390: 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b   = 0x02FE.} cack
53a0: 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b  ey_tlv_objectid;
53b0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
53c0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  ..CACKEY_PCSC_S_
53d0: 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20  TOKENPRESENT    
53e0: 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53  = 1,..CACKEY_PCS
53f0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  C_S_OK          
5400: 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59      = 0,..CACKEY
5410: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
5420: 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43          = -1,..C
5430: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
5440: 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d  PIN          = -
5450: 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  2,..CACKEY_PCSC_
5460: 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20  E_LOCKED        
5470: 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f    = -3,..CACKEY_
5480: 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
5490: 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41         = -4,..CA
54a0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
54b0: 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36  NABSENT     = -6
54c0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
54d0: 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20 20  _RETRY          
54e0: 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f 72   = -7.} cackey_r
54f0: 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b  et;..struct cack
5500: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b  ey_tlv_cardurl {
5510: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5520: 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09         rid[5];..
5530: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
5540: 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63  pe   apptype;..c
5550: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5560: 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63  id  objectid;..c
5570: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5580: 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69  id  appid;..unsi
5590: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
55a0: 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75   pinid;.};..stru
55b0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
55c0: 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63  tity;.struct cac
55d0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b  key_tlv_entity {
55e0: 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09  ..uint8_t tag;..
55f0: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a  size_t length;..
5600: 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20  .union {...void 
5610: 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74  *value;...struct
5620: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64   cackey_tlv_card
5630: 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75  url *value_cardu
5640: 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61  rl;...uint8_t va
5650: 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09  lue_byte;..};...
5660: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5670: 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b  v_entity *_next;
5680: 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47  .};../* CACKEY G
5690: 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f  lobal Handles */
56a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61  .static void *ca
56b0: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e  ckey_biglock = N
56c0: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75  ULL;.static stru
56d0: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
56e0: 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  n cackey_session
56f0: 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73  s[128];.static s
5700: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5710: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31  t cackey_slots[1
5720: 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  28];.static int 
5730: 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
5740: 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69  ed = 0;.static i
5750: 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  nt cackey_bigloc
5760: 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43  k_init = 0;.CK_C
5770: 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
5780: 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f   cackey_args;../
5790: 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66 69  ** Extra certifi
57a0: 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64 65  cates to include
57b0: 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73 74   in token **/.st
57c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
57d0: 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61 5f  _identity extra_
57e0: 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e 63  certs[] = {.#inc
57f0: 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75 69  lude "cackey_bui
5800: 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d 3b  ltin_certs.h".};
5810: 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c  ../* PCSC Global
5820: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5830: 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58  ic LPSCARDCONTEX
5840: 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  T cackey_pcsc_ha
5850: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74  ndle = NULL;..st
5860: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
5870: 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72  ng cackey_getver
5880: 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74  sion(void) {..st
5890: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
58a0: 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b  ng retval = 255;
58b0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
58c0: 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69  major = 0;..unsi
58d0: 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20  gned long minor 
58e0: 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f  = 0;..char *majo
58f0: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63  r_str = NULL;..c
5900: 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d  har *minor_str =
5910: 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f   NULL;...CACKEY_
5920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5930: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72  lled.");...if (r
5940: 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a  etval != 255) {.
5950: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5960: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
5970: 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e   0x%lx (cached).
5980: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ", retval);....r
5990: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
59a0: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a  }...retval = 0;.
59b0: 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f  .#ifdef PACKAGE_
59c0: 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  VERSION.        
59d0: 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b  major_str = PACK
59e0: 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66  AGE_VERSION;..if
59f0: 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09   (major_str) {..
5a00: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20          major = 
5a10: 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74  strtoul(major_st
5a20: 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31  r, &minor_str, 1
5a30: 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72  0);....if (minor
5a40: 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  _str) {....minor
5a50: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72   = strtoul(minor
5a60: 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20  _str + 1, NULL, 
5a70: 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  10);...}..}...re
5a80: 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c  tval = (major <<
5a90: 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c   16) | (minor <<
5aa0: 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41   8);.#endif...CA
5ab0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
5ac0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
5ad0: 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  lx", retval);...
5ae0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
5af0: 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61  }../* PC/SC Rela
5b00: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
5b10: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
5b20: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
5b30: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
5b40: 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20  ect_all(void);. 
5b50: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5b60: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5b70: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
5b80: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
5b90: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
5ba0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
5bb0: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20  nnects from all 
5bc0: 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  cards.. *. */.st
5bd0: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
5be0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
5bf0: 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75  t_all(void) {..u
5c00: 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
5c10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5c20: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5c30: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
5c40: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
5c50: 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
5c60: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
5c70: 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
5c80: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
5c90: 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
5ca0: 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69  ) {..../* Skip i
5cb0: 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f  nternal slots */
5cc0: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
5cd0: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
5ce0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
5cf0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
5d00: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
5d10: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44  G_PRINTF("SCardD
5d20: 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63  isconnect(%lu) c
5d30: 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65  alled", (unsigne
5d40: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
5d50: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
5d60: 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  t(cackey_slots[i
5d70: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53  dx].pcsc_card, S
5d80: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
5d90: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
5da0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
5db0: 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28  abel) {....free(
5dc0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
5dd0: 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61  ].label);.....ca
5de0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5df0: 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
5e00: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
5e10: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
5e20: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
5e30: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
5e40: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
5e50: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
5e60: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
5e70: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
5e80: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09  hw_lock = 0;....
5e90: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
5ea0: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
5eb0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5ec0: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
5ed0: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20  active slot %lu 
5ee0: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c  as being reset",
5ef0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
5f00: 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61   idx);...}....ca
5f10: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5f20: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
5f30: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
5f40: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
5f50: 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ing");...return;
5f60: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
5f70: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
5f80: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
5f90: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  _connect(void);.
5fa0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
5fb0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
5fc0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
5fd0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5fe0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
5ff0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
6000: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
6010: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
6020: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
6030: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
6040: 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20  ion connects to 
6050: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
6060: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64  tion Manager and
6070: 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20   updates the. * 
6080: 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c      global handl
6090: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
60a0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
60b0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
60c0: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
60d0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
60e0: 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45  ret;.#ifdef HAVE
60f0: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
6100: 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64  TEXT..LONG scard
6110: 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65  _isvalid_ret;.#e
6120: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
6130: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6140: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6150: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6160: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  == NULL) {...cac
6170: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6180: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
6190: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
61a0: 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63  dle));...if (cac
61b0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
61c0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41  == NULL) {....CA
61d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
61e0: 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f  F("Call to mallo
61f0: 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  c() failed, retu
6200: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6210: 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
6220: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
6230: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
6240: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6250: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
6260: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6270: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
6280: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
6290: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
62a0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
62b0: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
62c0: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
62d0: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
62e0: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
62f0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
6300: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
6310: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
6320: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
6330: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6340: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
6350: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6360: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
6370: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
6380: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
6390: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
63a0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
63b0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
63c0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
63d0: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
63e0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
63f0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
6400: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
6410: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6420: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
6430: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6440: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6450: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6460: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6470: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
6480: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49  HAVE_SCARDISVALI
6490: 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59  DCONTEXT..CACKEY
64a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
64b0: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
64c0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
64d0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
64e0: 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64  t = SCardIsValid
64f0: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
6500: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69  pcsc_handle);..i
6510: 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  f (scard_isvalid
6520: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6530: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
6540: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6550: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63  ("Handle has bec
6560: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61  ome invalid (SCa
6570: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
6580: 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69   = %s/%li), tryi
6590: 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ng to re-establi
65a0: 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  sh...", CACKEY_D
65b0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
65c0: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
65d0: 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c  isvalid_ret), (l
65e0: 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c  ong) scard_isval
65f0: 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b  id_ret);....CACK
6600: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6610: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6620: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6630: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6640: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6650: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6660: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
6670: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
6680: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
6690: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
66a0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
66b0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
66c0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
66d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
66e0: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
66f0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6700: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6710: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6720: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6730: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6740: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6750: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6760: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6770: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
6780: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
6790: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
67a0: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
67b0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
67c0: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
67d0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
67e0: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
67f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6800: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6810: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6820: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
6830: 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62  as been re-estab
6840: 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e  lished");..}.#en
6850: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6860: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
6870: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
6880: 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72   to PC/SC, retur
6890: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22  ning in success"
68a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
68b0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
68c0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
68d0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
68e0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
68f0: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  isconnect(void);
6900: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6910: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6920: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6930: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6940: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6950: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6960: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6970: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6980: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6990: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
69a0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
69b0: 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20   from the PC/SC 
69c0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  Connection manag
69d0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20  er and updates. 
69e0: 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c  *     the global
69f0: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
6a00: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
6a10: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
6a20: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  sconnect(void) {
6a30: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c  ..LONG scard_rel
6a40: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09  _context_ret;...
6a50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6a60: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6a70: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
6a80: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
6a90: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
6aa0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
6ab0: 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63  .}...scard_rel_c
6ac0: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6ad0: 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74  rdReleaseContext
6ae0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
6af0: 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63  ndle);...if (cac
6b00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6b10: 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
6b20: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6b30: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6b40: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  andle = NULL;..}
6b50: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c  ...if (scard_rel
6b60: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
6b70: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6b80: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
6b90: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6ba0: 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  C);..}...return(
6bb0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6bc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
6bd0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
6be0: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
6bf0: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
6c00: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6c10: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
6c20: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
6c30: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
6c40: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
6c50: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
6c60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
6c70: 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20  arks a slot has 
6c80: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
6c90: 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63  t, to later be c
6ca0: 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20  leaned up.. *   
6cb0: 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68    Cleanup only h
6cc0: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b  appens when a PK
6cd0: 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c  CS#11 client cal
6ce0: 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  ls C_FindObjects
6cf0: 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Init.. *. */.sta
6d00: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
6d10: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
6d20: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6d30: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20  ot *slot) {..if 
6d40: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
6d50: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
6d60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6d70: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6d80: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63  ..if (slot->pcsc
6d90: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
6da0: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e   {...SCardDiscon
6db0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
6dc0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
6dd0: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c  E_CARD);..}...sl
6de0: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
6df0: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f   1;..slot->pcsc_
6e00: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
6e10: 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   0;..slot->token
6e20: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
6e30: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 43  IN_REQUIRED;...C
6e40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6e50: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29  TF("Returning.")
6e60: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
6e70: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6e80: 20 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79       LONG cackey
6e90: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
6ea0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6eb0: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
6ec0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
6ed0: 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74  , LPDWORD select
6ee0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a  ed_protocol);. *
6ef0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6f00: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
6f10: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
6f20: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
6f30: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
6f40: 20 20 20 20 20 44 57 4f 52 44 20 64 65 66 61 75       DWORD defau
6f50: 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20  lt_protocol. *  
6f60: 20 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20         Protocol 
6f70: 74 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73 74  to attempt first
6f80: 0a 20 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f  . *. *     LPDWO
6f90: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
6fa0: 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  ocol. *         
6fb0: 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73  [OUT] Protocol s
6fc0: 65 6c 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45  elected. *. * RE
6fd0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6fe0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
6ff0: 75 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63  ue from SCardRec
7000: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e  onnect(). *. * N
7010: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
7020: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
7030: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43  rapper around SC
7040: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20  ardReconnect(). 
7050: 2a 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61  *. *     The SCa
7060: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75  rdReconnect() fu
7070: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c  nction call will
7080: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
7090: 20 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20   with the. *    
70a0: 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74   dwPreferredProt
70b0: 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c  ocols of "defaul
70c0: 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66  t_protocol".  If
70d0: 20 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72   that call retur
70e0: 6e 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f  ns. *     SCARD_
70f0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
7100: 20 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20   try again with 
7110: 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d  a protocol of T=
7120: 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20  0, and failing. 
7130: 2a 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a  *     that T=1..
7140: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f   *. */.static LO
7150: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  NG cackey_reconn
7160: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
7170: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7180: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74  t, DWORD default
7190: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f  _protocol, LPDWO
71a0: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
71b0: 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  ocol) {..LONG sc
71c0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
71d0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
71e0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
71f0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7200: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7210: 52 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f  RED, default_pro
7220: 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53  tocol, SCARD_RES
7230: 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65  ET_CARD, selecte
7240: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69  d_protocol);...i
7250: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7260: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7270: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7280: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7290: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
72a0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
72b0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
72c0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
72d0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
72e0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
72f0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
7300: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7310: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7320: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7330: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52  OCOL_T0, SCARD_R
7340: 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63  ESET_CARD, selec
7350: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  ted_protocol);..
7360: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7370: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7380: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7390: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
73a0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52  G_PRINTF("SCardR
73b0: 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  econnect() retur
73c0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
73d0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
73e0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
73f0: 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ")....scard_conn
7400: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f  _ret = SCardReco
7410: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7420: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41  _card, SCARD_SHA
7430: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7440: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43  _PROTOCOL_T1, SC
7450: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7460: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7470: 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  l);...}..}...ret
7480: 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  urn(scard_conn_r
7490: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
74a0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
74b0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
74c0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
74d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
74e0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
74f0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7500: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7510: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7520: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7530: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
7540: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
7550: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
7560: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
7570: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
7580: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
7590: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
75a0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
75b0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
75c0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
75d0: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
75e0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
75f0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
7600: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
7610: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
7620: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  D protocol;..LON
7630: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
7640: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
7650: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
7660: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
7670: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7680: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
7690: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
76a0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
76b0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
76c0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
76d0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
76e0: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
76f0: 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
7700: 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
7710: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7720: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
7730: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
7740: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7750: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
7760: 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  SC failed, retur
7770: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7780: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7790: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
77a0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e  IC);..}.../* Con
77b0: 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20  nect to reader, 
77c0: 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66  if needed */..if
77d0: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
77e0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
77f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7800: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7810: 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c  ect(%s) called",
7820: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7830: 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e  er);...scard_con
7840: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
7850: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
7860: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
7870: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
7880: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7890: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
78a0: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
78b0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
78c0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
78d0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
78e0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
78f0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7900: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
7910: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7920: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
7930: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
7940: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
7950: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
7960: 74 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64  t T=0")....scard
7970: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7980: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7990: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
79a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
79b0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
79c0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
79d0: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
79e0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
79f0: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
7a00: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7a10: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7a20: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
7a30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7a40: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
7a50: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
7a60: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7a70: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
7a80: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63  ust T=1").....sc
7a90: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7aa0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
7ab0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
7ac0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7ad0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
7ae0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7af0: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
7b00: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
7b10: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09  otocol);....}...
7b20: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
7b30: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7b40: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
7b50: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
7b60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7b70: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7b80: 72 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50  rned SCARD_W_UNP
7b90: 4f 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79  OWERED_CARD, try
7ba0: 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63  ing to re-connec
7bb0: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  t...");.....scar
7bc0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7bd0: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
7be0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
7bf0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
7c00: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49  , SCARD_SHARE_DI
7c10: 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54  RECT, SCARD_PROT
7c20: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
7c30: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
7c40: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
7c50: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
7c60: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7c70: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7c80: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7c90: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7ca0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
7cb0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
7cc0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7cd0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
7ce0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
7cf0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7d00: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7d10: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7d20: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7d30: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7d40: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7d50: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7d60: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7d70: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7d80: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
7d90: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
7da0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
7db0: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
7dc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7dd0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7de0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
7df0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
7e00: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
7e10: 31 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63  1")......scard_c
7e20: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
7e30: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
7e40: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
7e50: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
7e60: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7e70: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7e80: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
7e90: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
7ea0: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  l);.....}....}..
7eb0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7ec0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
7ed0: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
7ee0: 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f  protocol, &proto
7ef0: 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  col);...}....if 
7f00: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7f10: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
7f20: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
7f30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
7f40: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
7f50: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
7f60: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
7f70: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
7f80: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
7f90: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
7fa0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
7fb0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
7fc0: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
7fd0: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
7fe0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7ff0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
8000: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
8010: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09  onnected = 1;...
8020: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8030: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
8040: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8050: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
8060: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  0;...slot->proto
8070: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
8080: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  .}...return(CACK
8090: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
80a0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
80b0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
80c0: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
80d0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
80e0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
80f0: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
8100: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
8110: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
8120: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
8130: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
8140: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
8150: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
8160: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
8170: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
8180: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
8190: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
81a0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
81b0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
81c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68  e transaction sh
81d0: 6f 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74  ould be terminat
81e0: 65 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79  ed using "cackey
81f0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8200: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
8210: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8220: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8230: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
8240: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8250: 09 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b  .cackey_ret cack
8260: 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f  ey_conn_ret;..LO
8270: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
8280: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8290: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
82a0: 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63  d.");...cackey_c
82b0: 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  onn_ret = cackey
82c0: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
82d0: 6f 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  ot);..if (cackey
82e0: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43  _conn_ret != CAC
82f0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
8300: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8310: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8320: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
8330: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8340: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
8350: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
8360: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
8370: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8380: 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20  n_depth++;...if 
8390: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
83a0: 6f 6e 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20  on_depth > 1 && 
83b0: 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  !slot->transacti
83c0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29  on_need_hw_lock)
83d0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
83e0: 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64  G_PRINTF("Alread
83f0: 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  y in a transacti
8400: 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e  on, performing n
8410: 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65  o action (new de
8420: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
8430: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8440: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
8450: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8460: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8470: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
8480: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63  w_lock = 0;...sc
8490: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
84a0: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
84b0: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
84c0: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
84d0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
84e0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
84f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8500: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
8510: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
8520: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
8530: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
8540: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8550: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8560: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
8570: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
8580: 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73  ully began trans
8590: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
85a0: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
85b0: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
85c0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
85d0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
85e0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
85f0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8600: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8610: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8620: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
8630: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
8640: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
8650: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
8660: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
8670: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52  mands to. *. * R
8680: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
8690: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
86a0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
86b0: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
86c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
86d0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
86e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
86f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
8700: 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65   requires "cacke
8710: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
8720: 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65  ion" to be calle
8730: 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73  d first. *. */.s
8740: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
8750: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
8760: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8770: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8780: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
8790: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
87a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
87b0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
87c0: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
87d0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
87e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
87f0: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
8800: 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75  not connected, u
8810: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
8820: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64  nsaction on card
8830: 22 29 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d  ");....if (slot-
8840: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8850: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43  th > 0) {....CAC
8860: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8870: 28 22 44 65 63 72 65 61 73 69 6e 67 20 74 72 61  ("Decreasing tra
8880: 6e 73 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61  nsaction depth a
8890: 6e 64 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20  nd asking for a 
88a0: 68 61 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e  hardware lock on
88b0: 20 74 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20   the next begin 
88c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72  transaction (cur
88d0: 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29  rent depth = %i)
88e0: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
88f0: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
8900: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8910: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09  on_depth--;.....
8920: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8930: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
8940: 20 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61   {.....slot->tra
8950: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8960: 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a  _lock = 1;....}.
8970: 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
8980: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
8990: 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  RIC);..}...if (s
89a0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
89b0: 5f 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09  _depth == 0) {..
89c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
89d0: 49 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e  INTF("Terminatin
89e0: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
89f0: 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67  that has not beg
8a00: 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  un!");....return
8a10: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8a20: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
8a30: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8a40: 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73  depth--;...if (s
8a50: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8a60: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
8a70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8a80: 4e 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e  NTF("Transaction
8a90: 73 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72  s still in progr
8aa0: 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61  ess, not termina
8ab0: 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61  ting on-card Tra
8ac0: 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e  nsaction (curren
8ad0: 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  t depth = %i)", 
8ae0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8af0: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74  n_depth);....ret
8b00: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8b10: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  S_OK);..}...scar
8b20: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
8b30: 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  ardEndTransactio
8b40: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
8b50: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
8b60: 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ARD);..if (scard
8b70: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
8b80: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8b90: 0a 09 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 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8bb0: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
8bc0: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
8bd0: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
8be0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
8bf0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
8c00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8c10: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
8c20: 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e   terminated tran
8c30: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
8c40: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
8c50: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
8c60: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8c70: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44  S_OK);.}../* APD
8c80: 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  U Related Functi
8c90: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
8ca0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8cb0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
8cc0: 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20  end_apdu(struct 
8cd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8ce0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
8cf0: 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64   class, unsigned
8d00: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
8d10: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
8d20: 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p1, unsigned ch
8d30: 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20  ar p2, unsigned 
8d40: 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65  char lc, unsigne
8d50: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
8d60: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20  signed char le, 
8d70: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
8d80: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
8d90: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
8da0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
8db0: 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  n);. *. * ARGUME
8dc0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8dd0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8de0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8df0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8e00: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
8e10: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20  ned char class. 
8e20: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43  *         APDU C
8e30: 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53  lass (GSCIS_CLAS
8e40: 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43  S_ISO7816 or GSC
8e50: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
8e60: 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20  PLATFORM. *     
8e70: 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43      usually), (C
8e80: 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  LA). *. *     un
8e90: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
8ea0: 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20  ruction. *      
8eb0: 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74     APDU Instruct
8ec0: 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20  ion (INS). *. * 
8ed0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
8ee0: 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20  r p1. *         
8ef0: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31  APDU Parameter 1
8f00: 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P1). *. *     
8f10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
8f20: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
8f30: 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32   Parameter 2 (P2
8f40: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
8f50: 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20  gned char lc. * 
8f60: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
8f70: 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28  gth of Content (
8f80: 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Lc) -- this is t
8f90: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61  he length of "da
8fa0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70  ta". *         p
8fb0: 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64  arameter.  If "d
8fc0: 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65  ata" is specifie
8fd0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
8fe0: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20  parameter will. 
8ff0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e  *         be ign
9000: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
9010: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9020: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50  ata. *         P
9030: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
9040: 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68   to send.  It sh
9050: 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74  ould be "Lc" byt
9060: 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20  es long.  If. * 
9070: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
9080: 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20  d as NULL, "Lc" 
9090: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74  will not be sent
90a0: 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65  , and this buffe
90b0: 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20  r will be. *    
90c0: 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a       ignored.. *
90d0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
90e0: 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20   char le. *     
90f0: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
9100: 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28  of Expectation (
9110: 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74  Le) -- this is t
9120: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
9130: 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65  . *         expe
9140: 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20  cted reply.  If 
9150: 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65  this is specifie
9160: 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77  d as 0 then it w
9170: 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20  ill not. *      
9180: 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20     be sent.. *. 
9190: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a  *     uint16_t *
91a0: 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20  respcode. *     
91b0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
91c0: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
91d0: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f  APDU response co
91e0: 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  de.  If this is.
91f0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
9200: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
9210: 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20  e response code 
9220: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
9230: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
9240: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
9250: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
9260: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
9270: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
9280: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20   response data. 
9290: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
92a0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
92b0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
92c0: 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c  sponse data will
92d0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20   be discarded.  
92e0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  If. *         th
92f0: 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22  e "respdata_len"
9300: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70   parameter is sp
9310: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9320: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20   this buffer. * 
9330: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74          will not
9340: 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a   be updated.. *.
9350: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72   *     size_t *r
9360: 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20  espdata_len. *  
9370: 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d         [IN, OUT]
9380: 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c   Pointer initial
9390: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
93a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22  he size of the "
93b0: 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20  respdata". *    
93c0: 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65       buffer.  Be
93d0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
93e0: 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76  the pointed to v
93f0: 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20  alue is updated 
9400: 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  to the. *       
9410: 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    number of byte
9420: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
9430: 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69   buffer.  If thi
9440: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
9450: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c  s. *         NUL
9460: 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  L, it will not b
9470: 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22  e updated, and "
9480: 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62  respdata" will b
9490: 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e  e ignored causin
94a0: 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  g. *         the
94b0: 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74   response data t
94c0: 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  o be discarded..
94d0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
94e0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
94f0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
9500: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
9510: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
9520: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
9530: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20    On error. *   
9540: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
9550: 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20  TOKENABSENT  If 
9560: 74 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c  the sending fail
9570: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74  ed because the t
9580: 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20  oken is. *      
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74            absent
95b0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
95c0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
95d0: 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  n will connect t
95e0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
95f0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76  ection Manager v
9600: 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  ia. *     cackey
9610: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20  _pcsc_connect() 
9620: 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a  if needed.. *. *
9630: 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e       It will con
9640: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
9650: 20 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 61   in the reader a
9660: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73  ttached to the s
9670: 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69  lot. *     speci
9680: 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72  fied.  It will r
9690: 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20  econnect to the 
96a0: 63 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e  card if the conn
96b0: 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f  ection. *     go
96c0: 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a  es away.. *. */.
96d0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
96e0: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
96f0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
9700: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
9710: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
9720: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9730: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
9740: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
9750: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
9760: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9770: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
9780: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
9790: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
97a0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
97b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
97c0: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
97d0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
97e0: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63  uint8_t major_rc
97f0: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a  , minor_rc;..siz
9800: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  e_t bytes_to_cop
9810: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  y, tmp_respdata_
9820: 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49  len;..LPCSCARD_I
9830: 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e  O_REQUEST pioSen
9840: 64 50 63 69 3b 0a 09 44 57 4f 52 44 20 70 72 6f  dPci;..DWORD pro
9850: 74 6f 63 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d  tocol;..DWORD xm
9860: 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e  it_len, recv_len
9870: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d  ;..LONG scard_xm
9880: 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65  it_ret, scard_re
9890: 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20  conn_ret;..BYTE 
98a0: 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20  xmit_buf[1024], 
98b0: 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a  recv_buf[1024];.
98c0: 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
98d0: 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72  t_ret, pcsc_getr
98e0: 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64  esp_ret;..int id
98f0: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
9900: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
9910: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
9920: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9930: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
9940: 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65  id slot specifie
9950: 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
9960: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9970: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
9980: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
9990: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
99a0: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
99b0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
99c0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
99d0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
99e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
99f0: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
9a00: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
9a10: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
9a20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9a30: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9a40: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  C);..}.../* Dete
9a50: 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f 74  rmine which prot
9a60: 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73 69  ocol to send usi
9a70: 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 73  ng */..switch (s
9a80: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
9a90: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
9aa0: 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 70 69  OTOCOL_T0:....pi
9ab0: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
9ac0: 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65  _PCI_T0;.....bre
9ad0: 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ak;...case SCARD
9ae0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09  _PROTOCOL_T1:...
9af0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
9b00: 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09  ARD_PCI_T1;.....
9b10: 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
9b20: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
9b30: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
9b40: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
9b50: 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a  , aborting.");..
9b60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9b70: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9b80: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d  ;..}.../* Transm
9b90: 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20  it */..xmit_len 
9ba0: 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  = 0;..xmit_buf[x
9bb0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61  mit_len++] = cla
9bc0: 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ss;..xmit_buf[xm
9bd0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74  it_len++] = inst
9be0: 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62  ruction;..xmit_b
9bf0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9c00: 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78   p1;..xmit_buf[x
9c10: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b  mit_len++] = p2;
9c20: 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09  ..if (data) {...
9c30: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9c40: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66 6f 72  n++] = lc;...for
9c50: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
9c60: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
9c70: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
9c80: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
9c90: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
9ca0: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
9cb0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9cc0: 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a 0a 09  n++] = le;..}...
9cd0: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
9ce0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
9cf0: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
9d00: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
9d10: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
9d20: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
9d30: 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63  O7816 && instruc
9d40: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
9d50: 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31  STR_VERIFY && p1
9d60: 20 3d 3d 20 30 78 30 30 20 26 26 20 70 32 20 3d   == 0x00 && p2 =
9d70: 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43 4b  = 0x00) {...CACK
9d80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9d90: 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c  "Sending APDU: <
9da0: 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09  <censored>>");..
9db0: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
9dc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
9dd0: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22  ("Sending APDU:"
9de0: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
9df0: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76  _len);..}...recv
9e00: 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65  _len = sizeof(re
9e10: 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 5f  cv_buf);..scard_
9e20: 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64  xmit_ret = SCard
9e30: 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70  Transmit(slot->p
9e40: 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e  csc_card, pioSen
9e50: 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20  dPci, xmit_buf, 
9e60: 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20  xmit_len, NULL, 
9e70: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
9e80: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63 61 72  len);...if (scar
9e90: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
9ea0: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
9eb0: 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  CTED) {...CACKEY
9ec0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
9ed0: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
9ee0: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
9ef0: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
9f00: 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20  /%lx), will ask 
9f10: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
9f20: 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72   to retry (not r
9f30: 65 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e  esetting card)..
9f40: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
9f50: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
9f60: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
9f70: 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64  _ret), (unsigned
9f80: 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69   long) scard_xmi
9f90: 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 42 65  t_ret);..../* Be
9fa0: 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72  gin Smartcard Tr
9fb0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
9fc0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
9fd0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
9fe0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9ff0: 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a  SC_E_RETRY);..}.
a000: 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
a010: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
a020: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
a030: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a040: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64  ("Failed to send
a050: 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53   APDU to card (S
a060: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d  CardTransmit() =
a070: 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45   %s/%lx)", CACKE
a080: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
a090: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
a0a0: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
a0b0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
a0c0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
a0d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a0e0: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 73  RINTF("Marking s
a0f0: 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62 65  lot as having be
a100: 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 63 61  en reset");...ca
a110: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
a120: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69  eset(slot);....i
a130: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a140: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
a150: 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
a160: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a170: 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
a180: 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
a190: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
a1a0: 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
a1b0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
a1c0: 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
a1d0: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
a1e0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
a1f0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
a200: 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  f (scard_reconn_
a210: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
a220: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a  UCCESS) {...../*
a230: 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c   Update protocol
a240: 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72   */.....slot->pr
a250: 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f  otocol = protoco
a260: 6c 3b 0a 09 09 09 09 73 77 69 74 63 68 20 28 73  l;.....switch (s
a270: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b  lot->protocol) {
a280: 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44  ......case SCARD
a290: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
a2a0: 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
a2b0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a   SCARD_PCI_T0;..
a2c0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a2d0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
a2e0: 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09  TOCOL_T1:.......
a2f0: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
a300: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09  RD_PCI_T1;......
a310: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65  ..break;......de
a320: 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43  fault:.......CAC
a330: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a340: 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63  ("Invalid protoc
a350: 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f  ol found, but to
a360: 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79  o late to do any
a370: 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e  thing about it n
a380: 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79  ow -- trying any
a390: 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  way.");........b
a3a0: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
a3b0: 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68  ./* Re-establish
a3c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
a3d0: 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20   it was present 
a3e0: 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d  */.....if (slot-
a3f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
a400: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  th > 0) {......s
a410: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
a420: 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73  _depth--;......s
a430: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
a440: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
a450: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  1;......cackey_b
a460: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
a470: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
a480: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a490: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
a4a0: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e  ccessful, retran
a4b0: 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09  smitting");.....
a4c0: 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65  .recv_len = size
a4d0: 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09  of(recv_buf);...
a4e0: 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
a4f0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
a500: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
a510: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
a520: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
a530: 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66  , NULL, recv_buf
a540: 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  , &recv_len);...
a550: 09 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
a560: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
a570: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
a580: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a590: 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74  INTF("Retransmit
a5a0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
a5b0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66  ng in failure af
a5c0: 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e  ter disconnectin
a5d0: 67 20 74 68 65 20 63 61 72 64 20 28 53 43 61 72  g the card (SCar
a5e0: 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25  dTransmit = %s/%
a5f0: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
a600: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
a610: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
a620: 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  it_ret), (long) 
a630: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
a640: 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69 73 63  .......SCardDisc
a650: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
a660: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
a670: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09  AVE_CARD);......
a680: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
a690: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
a6a0: 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
a6b0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a6c0: 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  n */......slot->
a6d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
a6e0: 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b  h = 1;......cack
a6f0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
a700: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09  on(slot);.......
a710: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
a720: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
a730: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  );.....}....} el
a740: 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
a750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69  DEBUG_PRINTF("Di
a760: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64  sconnecting card
a770: 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69  ");......SCardDi
a780: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
a790: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
a7a0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
a7b0: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
a7c0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
a7d0: 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
a7e0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a7f0: 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74  n */.....slot->t
a800: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
a810: 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79   = 1;.....cackey
a820: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
a830: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43  (slot);......CAC
a840: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a850: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  ("Returning in f
a860: 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65  ailure");.....re
a870: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a880: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
a890: 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
a8a0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a8b0: 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e  _PRINTF("Disconn
a8c0: 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a  ecting card");..
a8d0: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
a8e0: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
a8f0: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
a900: 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e  CARD);....slot->
a910: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
a920: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20  ted = 0;...../* 
a930: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
a940: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
a950: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
a960: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
a970: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
a980: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
a990: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a9a0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
a9b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09   in failure");..
a9c0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a9d0: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
a9e0: 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  NT);...}..}...CA
a9f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
aa00: 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 56 61  BUF("Returned Va
aa10: 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c  lue:", recv_buf,
aa20: 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66   recv_len);...if
aa30: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20   (recv_len < 2) 
aa40: 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72  {.../* Minimal r
aa50: 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69  esponse length i
aa60: 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 75 72  s 2 bytes, retur
aa70: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
aa80: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
aa90: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
aaa0: 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  se too small, re
aab0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
aac0: 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25  re (recv_len = %
aad0: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
aae0: 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b  long) recv_len);
aaf0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
ab00: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
ab10: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
ab20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
ab30: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
ab40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
ab50: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RIC);..}.../* De
ab60: 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63  termine result c
ab70: 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63  ode */..major_rc
ab80: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
ab90: 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f  _len - 2];..mino
aba0: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b  r_rc = recv_buf[
abb0: 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09  recv_len - 1];..
abc0: 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a  if (respcode) {.
abd0: 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d  ..*respcode = (m
abe0: 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20  ajor_rc << 8) | 
abf0: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f  minor_rc;..}.../
ac00: 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65  * Adjust message
ac10: 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76   buffer */..recv
ac20: 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20  _len -= 2;.../* 
ac30: 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74  Add bytes to ret
ac40: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d  urn value */..tm
ac50: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  p_respdata_len =
ac60: 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74   0;..if (respdat
ac70: 61 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65  a && respdata_le
ac80: 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64  n) {...tmp_respd
ac90: 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64  ata_len = *respd
aca0: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65  ata_len;....byte
acb0: 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73  s_to_copy = *res
acc0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66  pdata_len;....if
acd0: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74   (recv_len < byt
ace0: 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
acf0: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
ad00: 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a   recv_len;...}..
ad10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ad20: 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25  RINTF("Copying %
ad30: 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20  lu bytes to the 
ad40: 62 75 66 66 65 72 20 28 72 65 63 76 27 64 20 25  buffer (recv'd %
ad50: 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e  lu bytes, but on
ad60: 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66  ly %lu bytes lef
ad70: 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29  t in our buffer)
ad80: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
ad90: 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  g) bytes_to_copy
ada0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
adb0: 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73  ) recv_len, (uns
adc0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73  igned long) *res
add0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d  pdata_len);....m
ade0: 65 6d 63 70 79 28 72 65 73 70 64 61 74 61 2c 20  emcpy(respdata, 
adf0: 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f  recv_buf, bytes_
ae00: 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70  to_copy);...resp
ae10: 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f  data += bytes_to
ae20: 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64  _copy;....*respd
ae30: 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f  ata_len = bytes_
ae40: 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72  to_copy;...tmp_r
ae50: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62  espdata_len -= b
ae60: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d  ytes_to_copy;..}
ae70: 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65   else {...if (re
ae80: 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09  cv_len != 0) {..
ae90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
aea0: 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20  RINTF("Throwing 
aeb0: 61 77 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20  away %lu bytes, 
aec0: 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74 20 74  nowhere to put t
aed0: 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64  hem!", (unsigned
aee0: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29   long) recv_len)
aef0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d  ;...}..}...if (m
af00: 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29  ajor_rc == 0x61)
af10: 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20   {.../* We need 
af20: 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43  to READ */...CAC
af30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
af40: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 72 65  ("Buffer read re
af50: 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20  quired");....if 
af60: 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30  (minor_rc == 0x0
af70: 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63  0) {....minor_rc
af80: 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
af90: 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f  TU;...}....pcsc_
afa0: 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61  getresp_ret = ca
afb0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
afc0: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
afd0: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
afe0: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e  INSTR_GET_RESPON
aff0: 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  SE, 0x00, 0x00, 
b000: 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72  0, NULL, minor_r
b010: 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73  c, respcode, res
b020: 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70  pdata, &tmp_resp
b030: 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66  data_len);....if
b040: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
b050: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
b060: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
b070: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b080: 28 22 42 75 66 66 65 72 20 72 65 61 64 20 66 61  ("Buffer read fa
b090: 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67  iled!  Returning
b0a0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
b0b0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b0c0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b0d0: 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
b0e0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b0f0: 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63  t);.....if (pcsc
b100: 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20  _getresp_ret == 
b110: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
b120: 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72  TRY) {.....retur
b130: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
b140: 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09  RETRY);....}....
b150: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b160: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
b170: 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64  ..}....if (respd
b180: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72  ata_len) {....*r
b190: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74  espdata_len += t
b1a0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
b1b0: 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53  ...}..../* End S
b1c0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b1d0: 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79  tion */...cackey
b1e0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b1f0: 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45  (slot);....CACKE
b200: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b210: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
b220: 63 65 73 73 20 28 62 75 66 66 65 72 20 72 65 61  cess (buffer rea
b230: 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09  d complete)");..
b240: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b250: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
b260: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b270: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b280: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
b290: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
b2a0: 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d  .if (major_rc ==
b2b0: 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75   0x90) {.../* Su
b2c0: 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45  ccess */...CACKE
b2d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b2e0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
b2f0: 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  cess (major_rc =
b300: 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74   0x90)");....ret
b310: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b320: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43  S_OK);..}....CAC
b330: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b340: 28 22 41 50 44 55 20 52 65 74 75 72 6e 65 64 20  ("APDU Returned 
b350: 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  an error, return
b360: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b370: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
b380: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
b390: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
b3a0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
b3b0: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
b3c0: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
b3d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
b3e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b3f0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
b400: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
b410: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
b420: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
b430: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
b440: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
b450: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
b460: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
b470: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
b480: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
b490: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b4a0: 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20  *buffer. *      
b4b0: 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a     [OUT] Buffer.
b4c0: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
b4d0: 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20   count. *       
b4e0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
b4f0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
b500: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
b510: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
b520: 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53  r_v. *         S
b530: 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66  elect the T-buff
b540: 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66  er (01) or V-buf
b550: 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64  fer (02) to read
b560: 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20   from.  . *. *  
b570: 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61     size_t initia
b580: 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20  l_offset. *     
b590: 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20      Specify the 
b5a0: 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20  offset to begin 
b5b0: 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a  the read from. *
b5c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
b5d0: 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20  LUE. *     This 
b5e0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
b5f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b600: 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
b610: 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72  ad, or -1 on err
b620: 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  or.. *. * NOTES.
b630: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
b640: 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
b650: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
b660: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
b670: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
b680: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
b690: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
b6a0: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
b6b0: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
b6c0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
b6d0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
b6e0: 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a  r *init_buffer;.
b6f0: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75  .size_t init_cou
b700: 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  nt;..size_t init
b710: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b  _initial_offset;
b720: 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  ...size_t offset
b730: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74   = 0, max_offset
b740: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e  , max_count;..un
b750: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
b760: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  2];..uint16_t re
b770: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
b780: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
b790: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
b7a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f  lled.");...init_
b7b0: 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b  buffer = buffer;
b7c0: 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63  ..init_count = c
b7d0: 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74  ount;..init_init
b7e0: 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69  ial_offset = ini
b7f0: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d  tial_offset;...m
b800: 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e  ax_offset = coun
b810: 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  t;..max_count = 
b820: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
b830: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d  ...if (t_or_v !=
b840: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20   1 && t_or_v != 
b850: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
b860: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
b870: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d  lid T or V param
b880: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20  eter specified, 
b890: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b8a0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b8b0: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b  n(-1);..}...cmd[
b8c0: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77  0] = t_or_v;...w
b8d0: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20  hile (1) {...if 
b8e0: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f  (offset >= max_o
b8f0: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  ffset) {....CACK
b900: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b910: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c  "Buffer too smal
b920: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61  l, returning wha
b930: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a  t we got...");..
b940: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
b950: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66  .count = max_off
b960: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09  set - offset;...
b970: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  if (count > max_
b980: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e  count) {....coun
b990: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  t = max_count;..
b9a0: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63  .}....cmd[1] = c
b9b0: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  ount;....send_re
b9c0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
b9d0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
b9e0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
b9f0: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
ba00: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c  STR_READ_BUFFER,
ba10: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65   ((initial_offse
ba20: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38  t + offset) >> 8
ba30: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69  ) & 0xff, (initi
ba40: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
ba50: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65  et) & 0xff, size
ba60: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78  of(cmd), cmd, 0x
ba70: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62  00, &respcode, b
ba80: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20  uffer + offset, 
ba90: 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28  &count);....if (
baa0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
bab0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
bac0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
bad0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
bae0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
baf0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
bb00: 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75  ffer");.....retu
bb10: 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  rn(cackey_read_b
bb20: 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74  uffer(slot, init
bb30: 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f  _buffer, init_co
bb40: 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69  unt, t_or_v, ini
bb50: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
bb60: 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ));...}....if (s
bb70: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
bb80: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
bb90: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
bba0: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09  = 0x6A86) {.....
bbb0: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d  if (max_count ==
bbc0: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   1) {......break
bbd0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78  ;.....}......max
bbe0: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  _count = max_cou
bbf0: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e  nt / 2;......con
bc00: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
bc10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc20: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64  NTF("cackey_send
bc30: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20  _apdu() failed, 
bc40: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bc50: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
bc60: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f  rn(-1);...}....o
bc70: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a  ffset += count;.
bc80: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d  ...if (count < m
bc90: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ax_count) {....C
bca0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bcb0: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d  TF("Short read -
bcc0: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d  - count = %i, cm
bcd0: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74  d[1] = %i", (int
bce0: 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  ) count, (int) c
bcf0: 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61  md[1]);.....brea
bd00: 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  k;...}..}..#ifde
bd10: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
bd20: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
bd30: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
bd40: 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58  (offset > _POSIX
bd50: 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
bd60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bd70: 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65  NTF("Offset exce
bd80: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
bd90: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
bda0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
bdb0: 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c  %li, offset = %l
bdc0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
bdd0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
bde0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
bdf0: 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  fset);....return
be00: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
be10: 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  f.#endif...CACKE
be20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
be30: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
be40: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
be50: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
be60: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
be70: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29  ..return(offset)
be80: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
be90: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
bea0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
beb0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
bec0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
bed0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
bee0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
bef0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  aid_len);. *. * 
bf00: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
bf10: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
bf20: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
bf30: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
bf40: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
bf50: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
bf60: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20   char *aid. *   
bf70: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e        Buffer con
bf80: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49  taining Applet I
bf90: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  D to select. *. 
bfa0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64  *     size_t aid
bfb0: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
bfc0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
bfd0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70  in the "aid" (Ap
bfe0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74  plet ID) paramet
bff0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  er. *. * RETURN 
c000: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
c010: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
c020: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
c030: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
c040: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
c050: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
c060: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
c070: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
c080: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
c090: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
c0a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c0b0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c0c0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
c0d0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a  ze_t aid_len) {.
c0e0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
c0f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c100: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
c110: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c120: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74  PRINTBUF("Select
c130: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69  ing applet:", ai
c140: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73  d, aid_len);...s
c150: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
c160: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
c170: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
c180: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
c190: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f  R_SELECT, GSCIS_
c1a0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
c1b0: 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c  LET, 0x00, aid_l
c1c0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e  en, aid, 0x00, N
c1d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
c1e0: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
c1f0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
c200: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
c210: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c220: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
c230: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
c240: 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b  select applet");
c250: 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
c260: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
c270: 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c  slot, aid, aid_l
c280: 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  en));..}...if (s
c290: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
c2a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
c2b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c2c0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
c2d0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
c2e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c2f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
c300: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
c310: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
c320: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c330: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
c340: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
c350: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
c360: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
c370: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
c380: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
c390: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
c3a0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
c3b0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
c3c0: 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20  16_t ef);. *. * 
c3d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
c3e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
c3f0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
c400: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
c410: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
c420: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
c430: 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45   ef. *         E
c440: 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f  lemental File to
c450: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45   select. *. * RE
c460: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
c470: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
c480: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
c490: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
c4a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
c4b0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
c4c0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c4d0: 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61    This selects a
c4e0: 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c  n Elementary Fil
c4f0: 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65  e (EF) under the
c500: 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63   currently selec
c510: 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63  ted. *     Dedic
c520: 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20  ated File (DF). 
c530: 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c  *. *     Typical
c540: 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  ly this is calle
c550: 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e  d after selectin
c560: 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70  g the correct Ap
c570: 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20  plet (using. *  
c580: 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74     cackey_select
c590: 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20  _applet) for VM 
c5a0: 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61  cards. *. */.sta
c5b0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
c5c0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c  ackey_select_fil
c5d0: 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  e(struct cackey_
c5e0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74  slot *slot, uint
c5f0: 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69  16_t ef) {..unsi
c600: 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75  gned char fid_bu
c610: 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  f[2];..int send_
c620: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c630: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c640: 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  ed.");.../* Open
c650: 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20   the elementary 
c660: 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66  file */..fid_buf
c670: 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20  [0] = (ef >> 8) 
c680: 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66  & 0xff;..fid_buf
c690: 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b  [1] = ef & 0xff;
c6a0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c6b0: 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
c6c0: 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20  g file: %04lx", 
c6d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c6e0: 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  ef);...send_ret 
c6f0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
c700: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
c710: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
c720: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
c730: 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69  , 0x02, 0x0C, si
c740: 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66  zeof(fid_buf), f
c750: 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55  id_buf, 0x00, NU
c760: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
c770: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
c780: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
c790: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
c7a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
c7b0: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  led to open file
c7c0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
c7d0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
c7e0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c7f0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
c800: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c810: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
c820: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
c830: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
c840: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
c850: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
c860: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
c870: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
c880: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
c890: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20  entity *root);. 
c8a0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c8b0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c8c0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
c8d0: 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  root. *         
c8e0: 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20  Root of the TLV 
c8f0: 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72  list to start fr
c900: 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55  eeing. *. * RETU
c910: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
c920: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
c930: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
c940: 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20  ction frees the 
c950: 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65  TLV linked liste
c960: 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a  d returned from.
c970: 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72   *     "cackey_r
c980: 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a  ead_tlv". *. */.
c990: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
c9a0: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
c9b0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
c9c0: 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73  tity *root) {..s
c9d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
c9e0: 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a  _entity *curr, *
c9f0: 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74  next;...if (root
ca00: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
ca10: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
ca20: 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72  curr = root; cur
ca30: 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20  r; curr = next) 
ca40: 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d  {...next = curr-
ca50: 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63  >_next;....switc
ca60: 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a  h (curr->tag) {.
ca70: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ca80: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
ca90: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
caa0: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
cab0: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29  if (curr->value)
cac0: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
cad0: 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d  r->value);.....}
cae0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
caf0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
cb00: 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63  RDURL:.....if (c
cb10: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
cb20: 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  rl) {......free(
cb30: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
cb40: 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  url);.....}.....
cb50: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72  break;...}....fr
cb60: 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72  ee(curr);..}...r
cb70: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
cb80: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
cb90: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
cba0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
cbb0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
cbc0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
cbd0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
cbe0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
cbf0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
cc00: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b  tlv_entity *cack
cc10: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75  ey_read_tlv(stru
cc20: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cc30: 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  slot) {..struct 
cc40: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
cc50: 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20  y *curr_entity, 
cc60: 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c  *root = NULL, *l
cc70: 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73  ast = NULL;..uns
cc80: 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f  igned char tlen_
cc90: 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66  buf[2], tval_buf
cca0: 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09  [1024], *tval;..
ccb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c  unsigned char vl
ccc0: 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f  en_buf[2], vval_
ccd0: 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c  buf[8192], *vval
cce0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
ccf0: 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
cd00: 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c  ned long tmpbufl
cd10: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  en;..ssize_t tle
cd20: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
cd30: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
cd40: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
cd50: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
cd60: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
cd70: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
cd80: 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  th;.#ifdef HAVE_
cd90: 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70  LIBZ..int uncomp
cda0: 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66  ress_ret;.#endif
cdb0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cdc0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
cdd0: 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  );...read_ret = 
cde0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
cdf0: 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75  er(slot, tlen_bu
ce00: 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  f, sizeof(tlen_b
ce10: 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  uf), 1, offset_t
ce20: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
ce30: 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f   != sizeof(tlen_
ce40: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
ce50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ce60: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
ce70: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ce80: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
ce90: 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d  LL);..}...tlen =
cea0: 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (tlen_buf[1] <<
ceb0: 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30   8) | tlen_buf[0
cec0: 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  ];...read_ret = 
ced0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
cee0: 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75  er(slot, vlen_bu
cef0: 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  f, sizeof(vlen_b
cf00: 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  uf), 2, offset_v
cf10: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
cf20: 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f   != sizeof(vlen_
cf30: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
cf40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
cf50: 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ead failed, retu
cf60: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
cf70: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
cf80: 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d  LL);..}...vlen =
cf90: 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c   (vlen_buf[1] <<
cfa0: 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30   8) | vlen_buf[0
cfb0: 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ];...CACKEY_DEBU
cfc0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65  G_PRINTF("Tag Le
cfd0: 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75  ngth = %lu, Valu
cfe0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c  e Length = %lu",
cff0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d000: 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64   tlen, (unsigned
d010: 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09   long) vlen);...
d020: 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09  offset_t += 2;..
d030: 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a  offset_v += 2;..
d040: 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65  .if (tlen > size
d050: 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(tval_buf)) {.
d060: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d070: 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74  RINTF("Tag lengt
d080: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
d090: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
d0a0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
d0b0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
d0c0: 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28   (vlen > sizeof(
d0d0: 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43  vval_buf)) {...C
d0e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d0f0: 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68  TF("Value length
d100: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
d110: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d120: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d130: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
d140: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
d150: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
d160: 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c   tval_buf, tlen,
d170: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
d180: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
d190: 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  tlen) {...CACKEY
d1a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d1b0: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
d1c0: 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72  tire T-buffer, r
d1d0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d1e0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d1f0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61  (NULL);..}...rea
d200: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
d210: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
d220: 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c   vval_buf, vlen,
d230: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
d240: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
d250: 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  vlen) {...CACKEY
d260: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
d270: 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e  nable to read en
d280: 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72  tire V-buffer, r
d290: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
d2a0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
d2b0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61  (NULL);..}...tva
d2c0: 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76  l = tval_buf;..v
d2d0: 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a  val = vval_buf;.
d2e0: 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30  .while (tlen > 0
d2f0: 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a   && vlen > 0) {.
d300: 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09  ..tag = *tval;..
d310: 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d  .tval++;...tlen-
d320: 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20  -;....if (*tval 
d330: 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65  == 0xff) {....le
d340: 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20  ngth = (tval[2] 
d350: 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b  << 8) | tval[1];
d360: 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09  ....tval += 3;..
d370: 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d  ..tlen -= 3;...}
d380: 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74   else {....lengt
d390: 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76  h = *tval;....tv
d3a0: 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b  al++;....tlen--;
d3b0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
d3c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
d3d0: 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41  : %s (%02x)", CA
d3e0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
d3f0: 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c  TAG_TO_STR(tag),
d400: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
d410: 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44  tag);...CACKEY_D
d420: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56  EBUG_PRINTBUF("V
d430: 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65  alue:", vval, le
d440: 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65  ngth);....curr_e
d450: 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
d460: 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09  switch (tag) {..
d470: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
d480: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75  _CARDURL:.....cu
d490: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
d4a0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
d4b0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75  entity));.....cu
d4c0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
d4d0: 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f  _cardurl = mallo
d4e0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
d4f0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
d500: 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d  durl));......mem
d510: 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d  cpy(curr_entity-
d520: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
d530: 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09  rid, vval, 5);..
d540: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d550: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
d560: 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d  pptype = vval[5]
d570: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
d580: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
d590: 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76  ->objectid = (vv
d5a0: 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[6] << 8) | vv
d5b0: 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[7];.....curr_
d5c0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
d5d0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28  rdurl->appid = (
d5e0: 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20  vval[8] << 8) | 
d5f0: 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75  vval[9];......cu
d600: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
d610: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
d620: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
d630: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
d640: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
d650: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
d660: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
d670: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
d680: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
d690: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
d6a0: 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09  c(length);......
d6b0: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
d6c0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09  val, length);...
d6d0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
d6e0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
d6f0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
d700: 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  th = length;....
d710: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
d720: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
d730: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
d740: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
d750: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
d760: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
d770: 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72  FICATE:.....curr
d780: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
d790: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
d7a0: 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20  tity));..#ifdef 
d7b0: 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d  HAVE_LIBZ.....tm
d7c0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
d7d0: 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66   * 2;.....tmpbuf
d7e0: 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66   = malloc(tmpbuf
d7f0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d  len);......uncom
d800: 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f  press_ret = unco
d810: 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26  mpress(tmpbuf, &
d820: 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c  tmpbuflen, vval,
d830: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66   length);.....if
d840: 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
d850: 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   != Z_OK) {.....
d860: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d870: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
d880: 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f  decompress, unco
d890: 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65  mpress() returne
d8a0: 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e  d %i -- resortin
d8b0: 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79  g to direct copy
d8c0: 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ", uncompress_re
d8d0: 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66  t);.......tmpbuf
d8e0: 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  len = length;...
d8f0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
d900: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
d910: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
d920: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
d930: 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20  F("Decompressed 
d940: 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  to:", tmpbuf, tm
d950: 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a  pbuflen);.#else.
d960: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d970: 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67  _PRINTF("Missing
d980: 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74   ZLIB Support, t
d990: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
d9a0: 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73  is likely useles
d9b0: 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70  s...");......tmp
d9c0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
d9d0: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
d9e0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
d9f0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63  );.#endif......c
da00: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
da10: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
da20: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
da30: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09   tmpbuflen;.....
da40: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
da50: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
da60: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
da70: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
da80: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
da90: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
daa0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
dab0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
dac0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
dad0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
dae0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
daf0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
db00: 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61  value_byte = vva
db10: 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[0];.....curr_e
db20: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
db30: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
db40: 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20  ...}....vval += 
db50: 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d  length;...vlen -
db60: 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20  = length;....if 
db70: 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20  (curr_entity != 
db80: 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72  NULL) {....if (r
db90: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
dba0: 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65  ...root = curr_e
dbb0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
dbc0: 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c  if (last != NULL
dbd0: 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e  ) {.....last->_n
dbe0: 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ext = curr_entit
dbf0: 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74  y;....}.....last
dc00: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
dc10: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
dc20: 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  root);.}../*. * 
dc30: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
dc40: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
dc50: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
dc60: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
dc70: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
dc80: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
dc90: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
dca0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
dcb0: 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  ee_certs(struct 
dcc0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
dcd0: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
dce0: 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66  e_t count, int f
dcf0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69  ree_start) {..si
dd00: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
dd10: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
dd20: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
dd30: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
dd40: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
dd50: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
dd60: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
dd70: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
dd80: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
dd90: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
dda0: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
ddb0: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
ddc0: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73  }...return;.}..s
ddd0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
dde0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
ddf0: 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63  y *cackey_copy_c
de00: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
de10: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
de20: 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20 63   *dest, struct c
de30: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
de40: 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65  ity *start, size
de50: 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a  _t count) {..siz
de60: 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73  e_t idx;...if (s
de70: 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tart == NULL) {.
de80: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
de90: 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d  .}...if (dest ==
dea0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20   NULL) {...dest 
deb0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
dec0: 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b  *dest) * count);
ded0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
dee0: 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b   0; idx < count;
def0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 6d 65 6d 63   idx++) {...memc
df00: 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 61 70 70  py(dest[idx].app
df10: 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e  let, start[idx].
df20: 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64  applet, sizeof(d
df30: 65 73 74 5b 69 64 78 5d 2e 61 70 70 6c 65 74 29  est[idx].applet)
df40: 29 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 66  );...dest[idx].f
df50: 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  ile = start[idx]
df60: 2e 66 69 6c 65 3b 0a 09 09 64 65 73 74 5b 69 64  .file;...dest[id
df70: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
df80: 65 6e 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  en = start[idx].
df90: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
dfa0: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79  ...dest[idx].key
dfb0: 73 69 7a 65 20 3d 20 73 74 61 72 74 5b 69 64 78  size = start[idx
dfc0: 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65  ].keysize;....de
dfd0: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
dfe0: 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73  ate = malloc(des
dff0: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
e000: 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70  te_len);...memcp
e010: 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  y(dest[idx].cert
e020: 69 66 69 63 61 74 65 2c 20 73 74 61 72 74 5b 69  ificate, start[i
e030: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c  dx].certificate,
e040: 20 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69   dest[idx].certi
e050: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a  ficate_len);..}.
e060: 0a 09 72 65 74 75 72 6e 28 64 65 73 74 29 3b 0a  ..return(dest);.
e070: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
e080: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
e090: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
e0a0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
e0b0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
e0c0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
e0d0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
e0e0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
e0f0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
e100: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
e110: 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63 74  ead_certs(struct
e120: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
e130: 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ot, struct cacke
e140: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
e150: 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64  *certs, unsigned
e160: 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a   long *count) {.
e170: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
e180: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75  csc_identity *cu
e190: 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63  rr_id;..struct c
e1a0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
e1b0: 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f   *ccc_tlv, *ccc_
e1c0: 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20  curr, *app_tlv, 
e1d0: 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69  *app_curr;..unsi
e1e0: 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61 69  gned char ccc_ai
e1f0: 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44  d[] = {GSCIS_AID
e200: 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _CCC};..unsigned
e210: 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37   char curr_aid[7
e220: 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ];..unsigned lon
e230: 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63  g outidx = 0;..c
e240: 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61  ackey_ret transa
e250: 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 69 6e 74 20  ction_ret;..int 
e260: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b  certs_resizable;
e270: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20  ..int send_ret, 
e280: 73 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41  select_ret;...CA
e290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e2a0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
e2b0: 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c  if (count == NUL
e2c0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
e2d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e  BUG_PRINTF("coun
e2e0: 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72  t is NULL, retur
e2f0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e300: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e310: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72  L);..}...if (cer
e320: 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts != NULL) {...
e330: 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29  if (*count == 0)
e340: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
e350: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
e360: 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30  sted we return 0
e370: 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d   objects, short-
e380: 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72  circuit");.....r
e390: 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
e3a0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 73 6c 6f 74  }..}...if (!slot
e3b0: 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ->slot_reset) {.
e3c0: 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
e3d0: 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 69  ed_certs) {....i
e3e0: 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c  f (certs == NULL
e3f0: 29 20 7b 0a 09 09 09 09 63 65 72 74 73 20 3d 20  ) {.....certs = 
e400: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
e410: 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d 3e 63 61  erts) * slot->ca
e420: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
e430: 29 3b 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20  );.....*count = 
e440: 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
e450: 74 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 7d 20  ts_count;.....} 
e460: 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 2a  else {.....if (*
e470: 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63 61  count > slot->ca
e480: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
e490: 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20  ) {......*count 
e4a0: 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  = slot->cached_c
e4b0: 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 09 09  erts_count;.....
e4c0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  }....}.....cacke
e4d0: 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 63 65 72  y_copy_certs(cer
e4e0: 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  ts, slot->cached
e4f0: 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b  _certs, *count);
e500: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
e510: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  s);...}..}...if 
e520: 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
e530: 72 74 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  rts) {...cackey_
e540: 66 72 65 65 5f 63 65 72 74 73 28 73 6c 6f 74 2d  free_certs(slot-
e550: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 73  >cached_certs, s
e560: 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
e570: 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09  s_count, 1);....
e580: 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
e590: 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ts = NULL;..}...
e5a0: 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74  /* Begin a Smart
e5b0: 43 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  Card transaction
e5c0: 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e   */..transaction
e5d0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65  _ret = cackey_be
e5e0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
e5f0: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e  slot);..if (tran
e600: 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43  saction_ret != C
e610: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
e620: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e630: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e640: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
e650: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
e660: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e670: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e680: 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
e690: 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ULL) {...certs =
e6a0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
e6b0: 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a  certs) * 5);...*
e6c0: 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72  count = 5;...cer
e6d0: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31  ts_resizable = 1
e6e0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65  ;..} else {...ce
e6f0: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
e700: 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63  0;..}.../* Selec
e710: 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74  t the CCC Applet
e720: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
e730: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
e740: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
e750: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
e760: 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  id));..if (send_
e770: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
e780: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
e790: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e7a0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
e7b0: 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72  ct CCC Applet, r
e7c0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e7d0: 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72  ure");..../* Ter
e7e0: 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
e7f0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
e800: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
e810: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
e820: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
e830: 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c  ..}.../* Read al
e840: 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72  l the applets fr
e850: 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56  om the CCC's TLV
e860: 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63   */..ccc_tlv = c
e870: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
e880: 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20  lot);.../* Look 
e890: 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61  for CARDURLs tha
e8a0: 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20  t coorespond to 
e8b0: 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09  PKI applets */..
e8c0: 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20  for (ccc_curr = 
e8d0: 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72  ccc_tlv; ccc_cur
e8e0: 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r; ccc_curr = cc
e8f0: 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  c_curr->_next) {
e900: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e910: 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61  PRINTF("Found ta
e920: 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43  g: %s ... ", CAC
e930: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
e940: 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  AG_TO_STR(ccc_cu
e950: 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66  rr->tag));....if
e960: 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20   (ccc_curr->tag 
e970: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  != GSCIS_TAG_CAR
e980: 44 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  DURL) {....CACKE
e990: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e9a0: 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
e9b0: 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
e9c0: 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
e9d0: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
e9e0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63 63  ...}....if ((ccc
e9f0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
ea00: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20  durl->apptype & 
ea10: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
ea20: 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c  KI) != CACKEY_TL
ea30: 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09  V_APP_PKI) {....
ea40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ea50: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
ea60: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
ea70: 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
ea80: 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
ea90: 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
eaa0: 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
eab0: 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
eac0: 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
ead0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
eae0: 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
eaf0: 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
eb00: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
eb10: 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
eb20: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
eb30: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
eb40: 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
eb50: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
eb60: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
eb70: 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
eb80: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
eb90: 72 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f  rid));...CACKEY_
eba0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70  DEBUG_PRINTF("Ap
ebb0: 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  pID = %s/%04lx",
ebc0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
ebd0: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
ebe0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
ebf0: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c  cardurl->appid),
ec00: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ec10: 20 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 61 70 70 69 64 29  _cardurl->appid)
ec30: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
ec40: 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49  _PRINTF("ObjectI
ec50: 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43  D = %s/%04lx", C
ec60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
ec70: 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63  _OBJID_TO_STR(cc
ec80: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
ec90: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
eca0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
ecb0: 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
ecc0: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
ecd0: 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28  tid);....memcpy(
ece0: 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75  curr_aid, ccc_cu
ecf0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
ed00: 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
ed10: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
ed20: 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
ed30: 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
ed40: 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20  (curr_aid) - 2] 
ed50: 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  = (ccc_curr->val
ed60: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
ed70: 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  d >> 8) & 0xff;.
ed80: 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
ed90: 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d  f(curr_aid) - 1]
eda0: 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
edb0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
edc0: 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20  d & 0xff;..../* 
edd0: 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70  Select found app
ede0: 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c  let ... */...sel
edf0: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
ee00: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
ee10: 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73  lot, curr_aid, s
ee20: 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29  izeof(curr_aid))
ee30: 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ;...if (select_r
ee40: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
ee50: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
ee60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ee70: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
ee80: 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
ee90: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
eea0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
eeb0: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
eec0: 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64  .}..../* ... and
eed0: 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a   object (file) *
eee0: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  /...select_ret =
eef0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
ef00: 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
ef10: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
ef20: 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
ef30: 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
ef40: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
ef50: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
ef60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
ef70: 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66  iled to select f
ef80: 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72  ile, skipping pr
ef90: 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73  ocessing of this
efa0: 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63   object");.....c
efb0: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
efc0: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20  /* Process this 
efd0: 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69  file's TLV looki
efe0: 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61  ng for certifica
eff0: 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76  tes */...app_tlv
f000: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
f010: 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72  lv(slot);....for
f020: 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70   (app_curr = app
f030: 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20  _tlv; app_curr; 
f040: 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63  app_curr = app_c
f050: 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
f060: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f070: 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
f080: 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
f090: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
f0a0: 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  TR(app_curr->tag
f0b0: 29 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f 63  ));....if (app_c
f0c0: 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49  urr->tag != GSCI
f0d0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
f0e0: 45 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  E) {.....CACKEY_
f0f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
f100: 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
f110: 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
f120: 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73  out CERTIFICATEs
f130: 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  )");......contin
f140: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
f150: 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
f160: 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
f170: 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ++;.....memcpy(c
f180: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
f190: 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
f1a0: 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
f1b0: 29 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  ));....curr_id->
f1c0: 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d  file = ccc_curr-
f1d0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
f1e0: 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75 72  objectid;....cur
f1f0: 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  r_id->keysize = 
f200: 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  -1;.....CACKEY_D
f210: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
f220: 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70  ling curr_id->ap
f230: 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25  plet (%p) with %
f240: 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72  lu bytes:", curr
f250: 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e  _id->applet, (un
f260: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
f270: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
f280: 6c 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  let));....CACKEY
f290: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
f2a0: 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d  "VAL:", curr_id-
f2b0: 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28  >applet, sizeof(
f2c0: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29  curr_id->applet)
f2d0: 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  );.....curr_id->
f2e0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
f2f0: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67  = app_curr->leng
f300: 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  th;.....curr_id-
f310: 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
f320: 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
f330: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
f340: 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
f350: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
f360: 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65   app_curr->value
f370: 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
f380: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
f390: 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
f3a0: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66 20  count) {.....if 
f3b0: 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
f3c0: 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20  ) {......*count 
f3d0: 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74 73  *= 2;......certs
f3e0: 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73   = realloc(certs
f3f0: 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  , sizeof(*certs)
f400: 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09   * (*count));...
f410: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
f420: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09  break;.....}....
f430: 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  }...}....cackey_
f440: 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76  free_tlv(app_tlv
f450: 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64 78  );....if (outidx
f460: 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
f470: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
f480: 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
f490: 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f  (ccc_tlv);...*co
f4a0: 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
f4b0: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
f4c0: 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
f4d0: 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
f4e0: 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
f4f0: 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
f500: 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  .slot->cached_ce
f510: 72 74 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70  rts = cackey_cop
f520: 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65  y_certs(NULL, ce
f530: 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73  rts, *count);..s
f540: 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
f550: 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74  s_count = *count
f560: 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ;.../* Terminate
f570: 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
f580: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
f590: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
f5a0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
f5b0: 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
f5c0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
f5d0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
f5e0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
f5f0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
f600: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
f610: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
f620: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
f630: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
f640: 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
f650: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f660: 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
f670: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
f680: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
f690: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
f6a0: 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
f6b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
f6c0: 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
f6d0: 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
f6e0: 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
f6f0: 75 74 70 75 74 29 20 7b 0a 09 75 6e 73 69 67 6e  utput) {..unsign
f700: 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
f710: 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74   *tmpbuf_s, *out
f720: 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64  buf_s;..unsigned
f730: 20 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73   char bytes_to_s
f740: 65 6e 64 2c 20 70 31 3b 0a 09 75 6e 73 69 67 6e  end, p1;..unsign
f750: 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70  ed char blocktyp
f760: 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73  e;..cackey_ret s
f770: 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36  end_ret;..uint16
f780: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73  _t respcode;..ss
f790: 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30  ize_t retval = 0
f7a0: 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  , unpadoffset;..
f7b0: 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e  size_t tmpbuflen
f7c0: 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74  , padlen, tmpout
f7d0: 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65  buflen;..int fre
f7e0: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69  e_tmpbuf = 0;..i
f7f0: 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  nt le;...CACKEY_
f800: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
f810: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
f820: 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lot == NULL) {..
f830: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f840: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c  INTF("Error.  sl
f850: 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ot is NULL");...
f860: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
f870: 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c  ..if (buf == NUL
f880: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
f890: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
f8a0: 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22  r.  buf is NULL"
f8b0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
f8c0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75  ;..}...if (outbu
f8d0: 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  f == NULL) {...C
f8e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f8f0: 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62  TF("Error.  outb
f900: 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
f910: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
f920: 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d  ..if (identity =
f930: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
f940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f950: 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
f960: 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
f970: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
f980: 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
f990: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20  csc_identity == 
f9a0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
f9b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f9c0: 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
f9d0: 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
f9e0: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
f9f0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  urn(-1);..}.../*
fa00: 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74   Determine ident
fa10: 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a  ity Key size */.
fa20: 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
fa30: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
fa40: 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69  ysize < 0) {...i
fa50: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
fa60: 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
fa70: 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a  = x509_to_keysiz
fa80: 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  e(identity->pcsc
fa90: 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
faa0: 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79  ficate, identity
fab0: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
fac0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
fad0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d  );..}.../* Pad m
fae0: 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69  essage to key si
faf0: 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e  ze */..if (padIn
fb00: 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65  put) {...if (ide
fb10: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
fb20: 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20  tity->keysize > 
fb30: 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c  0) {....if (bufl
fb40: 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e  en != identity->
fb50: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
fb60: 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66  eysize) {.....if
fb70: 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e   (buflen > (iden
fb80: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
fb90: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33  ity->keysize + 3
fba0: 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  )) {......CACKEY
fbb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
fbc0: 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69  rror.  Message i
fbd0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73  s too large to s
fbe0: 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a  ign/decrypt");..
fbf0: 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
fc00: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62  .....}......tmpb
fc10: 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  uflen = identity
fc20: 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
fc30: 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d  >keysize;.....tm
fc40: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
fc50: 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72  pbuflen);.....fr
fc60: 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a  ee_tmpbuf = 1;..
fc70: 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70  ....padlen = tmp
fc80: 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20  buflen - buflen 
fc90: 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41  - 3;....../* RSA
fca0: 20 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43   PKCS#1 EMSA-PKC
fcb0: 53 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20  S1-v1_5 Padding 
fcc0: 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d  */.....tmpbuf[0]
fcd0: 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70   = 0x00;.....tmp
fce0: 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09  buf[1] = 0x01;..
fcf0: 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75  ...memset(&tmpbu
fd00: 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c  f[2], 0xFF, padl
fd10: 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b  en);.....tmpbuf[
fd20: 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30  padlen + 2]= 0x0
fd30: 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74  0;.....memcpy(&t
fd40: 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33  mpbuf[padlen + 3
fd50: 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ], buf, buflen);
fd60: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
fd70: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70  UG_PRINTBUF("Unp
fd80: 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75  added:", buf, bu
fd90: 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45  flen);.....CACKE
fda0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
fdb0: 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62  ("Padded:", tmpb
fdc0: 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  uf, tmpbuflen);.
fdd0: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
fde0: 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
fdf0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
fe00: 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74  flen;.....free_t
fe10: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70  mpbuf = 0;.....p
fe20: 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a  adlen = 0;....}.
fe30: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
fe40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fe50: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74  F("Unable to det
fe60: 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c  ermine key size,
fe70: 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73   hoping the mess
fe80: 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20  age is properly 
fe90: 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74  padded!");.....t
fea0: 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09  mpbuf = buf;....
feb0: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
fec0: 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62  en;....free_tmpb
fed0: 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65  uf = 0;....padle
fee0: 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n = 0;...}..} el
fef0: 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20  se {...tmpbuf = 
ff00: 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  buf;...tmpbuflen
ff10: 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65   = buflen;...fre
ff20: 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09  e_tmpbuf = 0;...
ff30: 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a  padlen = 0;..}..
ff40: 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61  ./* Begin transa
ff50: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
ff60: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
ff70: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53  on(slot);.../* S
ff80: 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70  elect correct ap
ff90: 70 6c 65 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f  plet */..CACKEY_
ffa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
ffb0: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66  lecting applet f
ffc0: 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c  ound at %p ...",
ffd0: 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
ffe0: 69 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74  identity->applet
fff0: 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  );..cackey_selec
10000 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69  t_applet(slot, i
10010 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
10020 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20  entity->applet, 
10030 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d  sizeof(identity-
10040 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
10050 61 70 70 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53  applet));.../* S
10060 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69  elect correct fi
10070 6c 65 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65  le */..cackey_se
10080 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
10090 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
100a0 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a  dentity->file);.
100b0 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
100c0 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d  buf;..outbuf_s =
100d0 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20   outbuf;..while 
100e0 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
100f0 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
10100 32 34 35 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  245) {....bytes_
10110 74 6f 5f 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09  to_send = 245;..
10120 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09  ..p1 = 0x80;....
10130 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65  le = 0x00;...} e
10140 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  lse {....bytes_t
10150 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c  o_send = tmpbufl
10160 65 6e 3b 0a 09 09 09 70 31 20 3d 20 30 78 30 30  en;....p1 = 0x00
10170 3b 0a 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  ;....le = 0x00;.
10180 09 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66  ..}....tmpoutbuf
10190 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b  len = outbuflen;
101a0 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
101b0 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
101c0 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
101d0 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
101e0 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  M, GSCIS_INSTR_S
101f0 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20  IGNDECRYPT, p1, 
10200 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73  0x00, bytes_to_s
10210 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c  end, tmpbuf, le,
10220 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62   &respcode, outb
10230 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65  uf, &tmpoutbufle
10240 6e 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  n);...if (send_r
10250 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
10260 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
10270 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10280 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46  ("ADPU Sending F
10290 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69  ailed -- returni
102a0 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
102b0 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70  ....if (free_tmp
102c0 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74  buf) {.....if (t
102d0 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09  mpbuf_s) {......
102e0 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
102f0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
10300 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
10310 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
10320 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
10330 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  lot);.....if (re
10340 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32  spcode == 0x6982
10350 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
10360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
10370 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74  urity status not
10380 20 73 61 74 69 73 69 66 69 65 64 2e 20 20 52 65   satisified.  Re
10390 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49  turning NEEDLOGI
103a0 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  N");......cackey
103b0 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
103c0 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74  (slot);.....slot
103d0 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
103e0 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
103f0 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ED;......return(
10400 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
10410 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a  EDLOGIN);....}..
10420 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
10430 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
10440 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
10450 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10460 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61  _PRINTF("Token a
10470 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e  bsent.  Returnin
10480 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b  g TOKENABSENT");
10490 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72  ......cackey_mar
104a0 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
104b0 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  t);......return(
104c0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
104d0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
104e0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
104f0 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b  ...}....tmpbuf +
10500 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
10510 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20  ...tmpbuflen -= 
10520 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a  bytes_to_send;..
10530 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f  ..outbuf += tmpo
10540 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62  utbuflen;...outb
10550 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62  uflen -= tmpoutb
10560 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20  uflen;...retval 
10570 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  += tmpoutbuflen;
10580 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74  ..}...if (free_t
10590 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74  mpbuf) {...if (t
105a0 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72  mpbuf_s) {....fr
105b0 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09  ee(tmpbuf_s);...
105c0 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20  }..}...outbuf = 
105d0 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45  outbuf_s;.../* E
105e0 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
105f0 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
10600 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
10610 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
10620 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
10630 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
10640 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65  AX..if (outbufle
10650 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  n > _POSIX_SSIZE
10660 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
10670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
10680 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73  utbuflen exceeds
10690 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
106a0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
106b0 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
106c0 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c  , outbuflen = %l
106d0 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
106e0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
106f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75  nsigned long) ou
10700 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  tbuflen);....ret
10710 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
10720 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  ndif.#endif.../*
10730 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a   Unpad reply */.
10740 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74  .if (unpadOutput
10750 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c  ) {...if (retval
10760 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45   < 3) {....CACKE
10770 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10780 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61  Reply is too sma
10790 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61  ll, we are not a
107a0 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20  ble to unpad -- 
107b0 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
107c0 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
107d0 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
107e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
107f0 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
10800 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
10810 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
10820 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
10830 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
10840 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74  ;...}....if (out
10850 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20  buf[0] != 0x00) 
10860 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
10870 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f  G_PRINTF("Unreco
10880 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73  gnized padding s
10890 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67  cheme -- passing
108a0 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
108b0 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
108c0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
108d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
108e0 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
108f0 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
10900 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
10910 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
10920 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
10930 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75  ..blocktype = ou
10940 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64  tbuf[1];...unpad
10950 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73  offset = 0;....s
10960 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65  witch (blocktype
10970 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30  ) {....case 0x00
10980 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67  :...../* Padding
10990 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66   Scheme 1, the f
109a0 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79  irst non-zero by
109b0 74 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20  te is the start 
109c0 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66  of data */.....f
109d0 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  or (unpadoffset 
109e0 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  = 2; unpadoffset
109f0 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64   < retval; unpad
10a00 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09  offset++) {.....
10a10 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
10a20 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30  doffset] != 0x00
10a30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
10a40 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
10a50 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
10a60 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61   0x01:...../* Pa
10a70 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20  dding Scheme 2, 
10a80 70 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78  pad bytes are 0x
10a90 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30  FF followed by 0
10aa0 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  x00 */.....for (
10ab0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
10ac0 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
10ad0 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
10ae0 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
10af0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
10b00 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a  set] != 0xFF) {.
10b10 09 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
10b20 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d  [unpadoffset] ==
10b30 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09   0x00) {........
10b40 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a  unpadoffset++;..
10b50 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10b60 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
10b70 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10b80 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
10b90 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
10ba0 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
10bb0 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
10bc0 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30  d have been 0x00
10bd0 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
10be0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
10bf0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
10c00 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74  t]);.........ret
10c10 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d  urn(-1);.......}
10c20 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
10c30 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10c40 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
10c50 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66  d padding data f
10c60 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  ound, returning 
10c70 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75  in failure, shou
10c80 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46  ld have been 0xF
10c90 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c  F found 0x%02x",
10ca0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
10cb0 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
10cc0 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74  et]);........ret
10cd0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a  urn(-1);......}.
10ce0 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
10cf0 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ....case 0x02:..
10d00 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
10d10 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65  heme 3, pad byte
10d20 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s are non-zero f
10d30 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66  irst zero byte f
10d40 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65  ound is the sepe
10d50 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09  rator byte */...
10d60 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
10d70 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
10d80 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
10d90 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
10da0 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
10db0 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30  npadoffset] == 0
10dc0 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70  x00) {.......unp
10dd0 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09  adoffset++;.....
10de0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
10df0 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
10e00 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70  ;...}....if (unp
10e10 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61  adoffset > retva
10e20 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  l) {....CACKEY_D
10e30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
10e40 73 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  set greater than
10e50 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f   reply size, abo
10e60 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66  rting.  (unpadof
10e70 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76  fset = %lu, retv
10e80 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  al = %lu)", (uns
10e90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61  igned long) unpa
10ea0 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e  doffset, (unsign
10eb0 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29  ed long) retval)
10ec0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
10ed0 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
10ee0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
10ef0 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66  Padded:", outbuf
10f00 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  , retval);....re
10f10 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66  tval -= unpadoff
10f20 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f  set;...memmove(o
10f30 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20  utbuf, outbuf + 
10f40 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74  unpadoffset, ret
10f50 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  val);....CACKEY_
10f60 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
10f70 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62  Unpadded:", outb
10f80 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  uf, retval);..}.
10f90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10fa0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
10fb0 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
10fc0 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65  tval = %li (byte
10fd0 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76  s)", (long) retv
10fe0 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
10ff0 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  tval);.}../*. * 
11000 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
11010 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
11020 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
11030 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
11040 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
11050 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
11060 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
11070 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
11080 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74  key_login(struct
11090 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
110a0 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
110b0 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64  r *pin, unsigned
110c0 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69   long pin_len, i
110d0 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  nt *tries_remain
110e0 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e  ing_p) {..unsign
110f0 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b  ed char cac_pin[
11100 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46  8] = {0xFF, 0xFF
11110 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
11120 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
11130 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36 5f 74  0xFF};..uint16_t
11140 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a   response_code;.
11150 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
11160 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  ning;..int send_
11170 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61  ret;.../* Indica
11180 74 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  te that we do no
11190 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77  t know about how
111a0 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20   many tries are 
111b0 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66  remaining */..if
111c0 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   (tries_remainin
111d0 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f  g_p) {...*tries_
111e0 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31  remaining_p = -1
111f0 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65  ;..}.../* Appare
11200 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61  ntly, CAC PINs a
11210 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62  re *EXACTLY* 8 b
11220 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64  ytes long -- pad
11230 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f   with 0xFF if to
11240 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
11250 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a  pin_len >= 8) {.
11260 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e  ..memcpy(cac_pin
11270 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c  , pin, 8);..} el
11280 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  se {...memcpy(ca
11290 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f  c_pin, pin, pin_
112a0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73  len);..}.../* Is
112b0 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a  sue PIN Verify *
112c0 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
112d0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
112e0 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
112f0 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
11300 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78  INSTR_VERIFY, 0x
11310 30 30 2c 20 30 78 30 30 2c 20 73 69 7a 65 6f 66  00, 0x00, sizeof
11320 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  (cac_pin), cac_p
11330 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  in, 0x00, &respo
11340 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
11350 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64  NULL);..if (send
11360 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
11370 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
11380 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65   ((response_code
11390 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78   & 0x63C0) == 0x
113a0 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73  63C0) {....tries
113b0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65  _remaining = (re
113c0 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
113d0 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  F);.....CACKEY_D
113e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
113f0 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
11400 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72  iled, %i tries r
11410 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73  emaining", tries
11420 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09  _remaining);....
11430 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
11440 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74  ning_p) {.....*t
11450 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
11460 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69   = tries_remaini
11470 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  ng;....}.....ret
11480 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
11490 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a  E_BADPIN);...}..
114a0 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
114b0 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b  ode == 0x6983) {
114c0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
114d0 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
114e0 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
114f0 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b  , device is lock
11500 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ed");.....return
11510 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c  (CACKEY_PCSC_E_L
11520 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72  OCKED);...}....r
11530 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
11540 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
11550 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11560 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
11570 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64  fication succeed
11580 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  ed");...return(C
11590 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
115a0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
115b0 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
115c0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
115d0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
115e0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
115f0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
11600 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
11610 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
11620 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74  key_ret cackey_t
11630 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72  oken_present(str
11640 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
11650 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
11660 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
11670 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65  t_ret;..DWORD re
11680 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74  ader_len = 0, st
11690 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f  ate = 0, protoco
116a0 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a  l = 0, atr_len;.
116b0 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54  .BYTE atr[MAX_AT
116c0 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73  R_SIZE];..LONG s
116d0 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64  tatus_ret, scard
116e0 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  _reconn_ret;...C
116f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11700 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
11710 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72  .if (slot->inter
11720 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  nal) {...CACKEY_
11730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11740 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
11750 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20  esent (internal 
11760 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74  token)");....ret
11770 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
11780 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
11790 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ..}...pcsc_conne
117a0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
117b0 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
117c0 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
117d0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
117e0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
117f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11800 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
11810 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
11820 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
11830 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
11840 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
11850 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
11860 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65 6e 20  );..}...atr_len 
11870 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09  = sizeof(atr);..
11880 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
11890 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
118a0 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
118b0 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
118c0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
118d0 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
118e0 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
118f0 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41   == SCARD_E_INVA
11900 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09  LID_HANDLE) {...
11910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11920 4e 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73  NTF("SCardStatus
11930 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
11940 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
11950 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e  LE, marking is n
11960 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65  ot already conne
11970 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20  cted and trying 
11980 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65  again");...cacke
11990 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
119a0 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63  t(slot);....pcsc
119b0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
119c0 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
119d0 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28  rd(slot);...if (
119e0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
119f0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11a00 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
11a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11a20 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
11a30 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
11a40 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
11a50 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
11a60 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
11a70 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
11a80 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
11a90 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74  eof(atr);...stat
11aa0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
11ab0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
11ac0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
11ad0 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
11ae0 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
11af0 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   &atr_len);..}..
11b00 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
11b10 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
11b20 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  SS) {...cackey_m
11b30 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
11b40 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61  lot);....if (sta
11b50 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
11b60 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
11b70 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11b80 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
11b90 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
11ba0 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
11bb0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
11bc0 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
11bd0 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
11be0 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
11bf0 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
11c00 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
11c10 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
11c20 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
11c30 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
11c40 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
11c50 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
11c60 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
11c70 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20  otocol;....../* 
11c80 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
11c90 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
11ca0 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
11cb0 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
11cc0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
11cd0 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
11ce0 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
11cf0 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
11d00 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
11d10 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
11d20 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
11d30 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
11d40 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
11d50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11d60 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
11d70 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67  sful, requerying
11d80 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72  ");.....status_r
11d90 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
11da0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
11db0 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
11dc0 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
11dd0 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
11de0 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28  r_len);.....if (
11df0 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43  status_ret != SC
11e00 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
11e10 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11e20 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c  UG_PRINTF("Still
11e30 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79   unable to query
11e40 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
11e50 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
11e60 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
11e70 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
11e80 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
11e90 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
11ea0 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
11eb0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
11ec0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
11ed0 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
11ee0 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
11ef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11f00 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
11f10 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
11f20 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
11f30 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e  ent.  SCardRecon
11f40 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41  nect() = %s", CA
11f50 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
11f60 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
11f70 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
11f80 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
11f90 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
11fa0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
11fb0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
11fc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11fd0 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75  TF("Unable to qu
11fe0 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c  ery card status,
11ff0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
12000 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53   absent.  SCardS
12010 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43  tatus() = %s", C
12020 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
12030 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
12040 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a  (status_ret));..
12050 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
12060 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
12070 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ENT);...}..}...i
12080 66 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52  f ((state & SCAR
12090 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41  D_ABSENT) == SCA
120a0 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43  RD_ABSENT) {...C
120b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
120c0 54 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65  TF("Card is abse
120d0 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  nt, returning to
120e0 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
120f0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
12100 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
12110 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
12120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
12130 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
12140 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75  esent.");...retu
12150 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
12160 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
12170 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
12180 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
12190 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
121a0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
121b0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
121c0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
121d0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
121e0 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
121f0 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  _t cackey_pcsc_i
12200 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
12210 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
12220 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
12230 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
12240 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66   char *label_buf
12250 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
12260 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b  label_buf_len) {
12270 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
12280 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
12290 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73  ..void *label_as
122a0 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69  n1;..void *certi
122b0 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30  ficate;..int x50
122c0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65  9_read_ret;...ce
122d0 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e  rtificate = iden
122e0 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
122f0 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f  e;..certificate_
12300 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
12310 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
12320 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
12330 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  te_len < 0) {...
12340 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
12350 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
12360 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
12370 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
12380 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28  rtificate_len, (
12390 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f  void **) &label_
123a0 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39  asn1);..if (x509
123b0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
123c0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
123d0 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
123e0 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
123f0 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
12400 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
12410 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
12420 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
12430 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28  en, "CN");..if (
12440 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
12450 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61   0) {...x509_rea
12460 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
12470 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
12480 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
12490 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
124a0 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
124b0 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a  uf_len, NULL);..
124c0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
124d0 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72  ret <= 0) {....r
124e0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
124f0 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
12500 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
12510 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
12520 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65  MAX..if (x509_re
12530 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f  ad_ret > _POSIX_
12540 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
12550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12560 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65  TF("x509_read_re
12570 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  t exceeds maximu
12580 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
12590 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
125a0 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f  max = %li, x509_
125b0 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22  read_ret = %lu)"
125c0 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
125d0 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
125e0 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f  gned long) x509_
125f0 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65  read_ret);....re
12600 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
12610 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72  endif.#endif...r
12620 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f  eturn(x509_read_
12630 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ret);.}../* Retu
12640 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
12650 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
12660 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
12670 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29  te(void **mutex)
12680 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
12690 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
126a0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
126b0 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
126c0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
126d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
126e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
126f0 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
12700 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
12710 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
12720 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
12730 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
12740 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28  _mutex = malloc(
12750 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f  sizeof(*pthread_
12760 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21  mutex));...if (!
12770 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b  pthread_mutex) {
12780 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12790 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
127a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
127b0 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ry.");.....retur
127c0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74  n(-1);...}....pt
127d0 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
127e0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
127f0 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c  t(pthread_mutex,
12800 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74   NULL);...if (pt
12810 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12820 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
12840 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
12850 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
12860 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
12870 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
12880 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
12890 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61  .*mutex = pthrea
128a0 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65  d_mutex;..} else
128b0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
128c0 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
128d0 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
128e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
128f0 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d  gs.CreateMutex(m
12900 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
12910 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
12920 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
12930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12940 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  F("cackey_args.C
12950 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74  reateMutex() ret
12960 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
12970 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
12980 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
12990 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
129a0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
129b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
129c0 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
129d0 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
129e0 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
129f0 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
12a00 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
12a10 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
12a20 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
12a30 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
12a40 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
12a50 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
12a60 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
12a70 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
12a80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12a90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
12aa0 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
12ab0 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
12ac0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
12ad0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
12ae0 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
12af0 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
12b00 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
12b10 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
12b20 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  ex_lock(pthread_
12b30 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
12b40 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
12b50 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
12b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
12b70 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
12b80 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
12b90 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
12ba0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
12bb0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
12bc0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
12bd0 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
12be0 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
12bf0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
12c00 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
12c10 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
12c20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
12c30 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
12c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12c50 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
12c60 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  LockMutex() retu
12c70 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
12c80 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
12c90 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
12ca0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
12cb0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
12cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12cd0 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
12ce0 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
12cf0 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
12d00 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
12d10 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
12d20 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  t cackey_mutex_u
12d30 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  nlock(void *mute
12d40 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
12d50 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
12d60 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
12d70 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
12d80 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
12d90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12da0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
12db0 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
12dc0 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
12dd0 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
12de0 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
12df0 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
12e00 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
12e10 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
12e20 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
12e30 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65  tex_unlock(pthre
12e40 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
12e50 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
12e60 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
12e70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12e80 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
12e90 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
12ea0 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
12eb0 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
12ec0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12ed0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
12ee0 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  f (cackey_args.U
12ef0 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  nlockMutex) {...
12f00 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
12f10 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c   cackey_args.Unl
12f20 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
12f30 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
12f40 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
12f50 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
12f70 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
12f80 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
12f90 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
12fa0 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
12fb0 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
12fc0 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
12fd0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
12fe0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
12ff0 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
13000 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
13010 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b  0);.}..static CK
13020 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63  _ATTRIBUTE_PTR c
13030 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
13040 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  utes(CK_OBJECT_C
13050 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73  LASS objectclass
13060 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
13070 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
13080 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
13090 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
130a0 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  num, CK_ULONG_PT
130b0 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73  R pulCount) {..s
130c0 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
130d0 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61  k_true = 1;..sta
130e0 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
130f0 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74  false = 0;..stat
13100 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74  ic CK_TRUST ck_t
13110 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53  rusted = CK_TRUS
13120 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09  TED_DELEGATOR;..
13130 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
13140 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
13150 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
13160 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
13170 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
13180 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
13190 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
131a0 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
131b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
131c0 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
131d0 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
131e0 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
131f0 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
13200 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
13210 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
13220 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
13230 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
13240 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e  [1024];..SHA1Con
13250 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09  text sha1_ctx;..
13260 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b  MD5_CTX md5_ctx;
13270 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68  ..uint8_t sha1_h
13280 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65  ash[SHA1HashSize
13290 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f  ];..uint8_t md5_
132a0 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65  hash[MD5HashSize
132b0 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
132c0 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
132d0 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  .ssize_t certifi
132e0 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78  cate_len = -1, x
132f0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69  509_read_ret;..i
13300 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a  nt pValue_free;.
13310 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13320 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f  RINTF("Called (o
13330 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75  bjectClass = %lu
13340 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d  , identity_num =
13350 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
13360 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63  ed long) objectc
13370 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e  lass, identity_n
13380 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  um);...*pulCount
13390 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65   = 0;...if (obje
133a0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
133b0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
133c0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
133d0 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f  _PUBLIC_KEY && o
133e0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
133f0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
13400 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
13410 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
13420 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ST) {...CACKEY_D
13430 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
13440 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
13450 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
13460 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
13470 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
13480 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
13490 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
134a0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
134b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
134c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
134d0 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
134e0 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
134f0 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
13500 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
13510 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
13520 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
13530 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
13540 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
13550 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
13560 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
13570 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
13580 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
13590 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
135a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
135b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
135c0 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
135d0 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
135e0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
135f0 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
13600 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13610 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
13620 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
13630 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
13640 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
13650 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
13660 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
13670 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
13680 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
13690 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
136a0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
136b0 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
136c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
136d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
136e0 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
136f0 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
13700 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
13710 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
13720 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
13730 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
13740 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
13750 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09  al_count = 64;..
13760 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
13770 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
13780 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
13790 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
137a0 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
137b0 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
137c0 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74  e5363bf; curr_at
137d0 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
137e0 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
137f0 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
13800 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
13810 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
13820 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
13830 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
13840 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
13850 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
13860 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
13870 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
13880 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
13890 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
138a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
138b0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
138c0 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
138d0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
138e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
138f0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
13900 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
13910 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
13920 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
13930 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
13940 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
13950 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
13960 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
13970 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13980 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
13990 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
139a0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
139b0 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
139c0 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
139d0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
139e0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
139f0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
13a00 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
13a10 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
13a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13a30 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
13a40 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
13a50 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13a60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
13a70 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
13a80 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
13a90 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
13aa0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
13ab0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
13ac0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13ad0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
13ae0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
13af0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13b00 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
13b10 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
13b20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13b30 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13b40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13b50 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09  e CKA_PRIVATE:..
13b60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13b70 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
13b80 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
13b90 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c  _PRIVATE (0x%08l
13ba0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
13bb0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
13bc0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
13bd0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
13be0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
13bf0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
13c00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13c10 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
13c20 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
13c30 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
13c40 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
13c50 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
13c60 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
13c70 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
13c80 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
13c90 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
13ca0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
13cb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13cc0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
13cd0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
13ce0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
13cf0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
13d00 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
13d10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
13d20 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
13d30 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13d40 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
13d50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13d60 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
13d70 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
13d80 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29  RUSTED (0x%08lx)
13d90 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
13da0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
13db0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
13dc0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
13dd0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
13de0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
13df0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13e00 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
13e10 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
13e20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
13e30 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
13e40 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
13e50 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65  ...}......pValue
13e60 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
13e70 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
13e80 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
13e90 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13ea0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
13eb0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
13ec0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
13ed0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
13ee0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
13ef0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
13f00 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
13f10 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
13f20 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
13f30 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
13f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13f50 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
13f60 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
13f70 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
13f80 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
13f90 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
13fa0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
13fb0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
13fc0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
13fd0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
13fe0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
13ff0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
14000 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
14010 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
14020 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
14030 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
14040 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
14050 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
14060 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
14070 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
14080 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
14090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
140a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
140b0 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
140c0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
140d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
140e0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
140f0 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74 65  ..../* XXX: Dete
14100 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 09 09  rmine name */...
14110 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
14120 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29  nprintf((char *)
14130 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f   ucTmpBuf, sizeo
14140 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64  f(ucTmpBuf), "Id
14150 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75  entity #%lu", (u
14160 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
14170 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09  entity_num);....
14180 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42  .pValue = ucTmpB
14190 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 75 6c 56  uf;......if (ulV
141a0 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f  alueLen >= sizeo
141b0 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09  f(ucTmpBuf)) {..
141c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
141d0 20 30 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20   0;......pValue 
141e0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09  = NULL;.....}...
141f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14200 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
14210 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
14220 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
14230 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
14240 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
14250 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56  k;....case CKA_V
14260 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ALUE:.....CACKEY
14270 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14280 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
14290 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30  ute CKA_VALUE (0
142a0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
142b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
142c0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
142d0 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65  ....switch (obje
142e0 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09  ctclass) {......
142f0 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45  case CKO_PRIVATE
14300 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b  _KEY:.......CACK
14310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14320 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
14330 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
14340 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74   we are a privat
14350 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  e key.");.......
14360 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
14370 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  e CKO_NETSCAPE_T
14380 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b  RUST:.......CACK
14390 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
143a0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
143b0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
143c0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
143d0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
143e0 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
143f0 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
14400 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09  UBLIC_KEY:......
14410 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
14420 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
14430 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
14440 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b  t = x509_to_pubk
14450 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ey(certificate, 
14460 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
14470 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
14480 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
14490 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09  ret < 0) { .....
144a0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
144b0 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65  L;........} else
144c0 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c   {.........ulVal
144d0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
144e0 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a  d_ret;........}.
144f0 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62  ......}........b
14500 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
14510 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a  CKO_CERTIFICATE:
14520 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
14530 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
14540 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
14550 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
14560 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
14570 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
14580 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14590 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
145a0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
145b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
145c0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
145d0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
145e0 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09  CKA_ISSUER:.....
145f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14600 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
14610 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53  attribute CKA_IS
14620 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  SUER (0x%08lx) .
14630 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
14640 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
14650 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
14660 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
14670 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
14680 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
14690 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
146a0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
146b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
146c0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
146d0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
146e0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
146f0 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73  tificate or Nets
14700 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
14710 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
14720 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
14730 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
14740 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
14750 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
14760 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72  09_to_issuer(cer
14770 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
14780 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
14790 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
147a0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
147b0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
147c0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
147d0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
147e0 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
147f0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
14800 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
14810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14820 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
14830 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
14840 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14850 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14860 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14870 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
14880 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
14890 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
148a0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
148b0 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
148c0 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
148d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
148e0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
148f0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
14900 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
14910 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
14920 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
14930 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
14940 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
14950 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
14960 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
14970 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
14980 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
14990 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
149a0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
149b0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
149c0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
149d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
149e0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
149f0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
14a00 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
14a10 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
14a20 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
14a30 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
14a40 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
14a50 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
14a60 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
14a70 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
14a80 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
14a90 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
14aa0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
14ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14ac0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
14ad0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
14ae0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
14af0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
14b00 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14b10 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09  CKA_SUBJECT:....
14b20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14b30 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
14b40 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
14b50 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29  UBJECT (0x%08lx)
14b60 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
14b70 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
14b80 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
14b90 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
14ba0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
14bb0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
14bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
14bd0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
14be0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
14bf0 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
14c00 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62  icate");.......b
14c10 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
14c20 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
14c30 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
14c40 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
14c50 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
14c60 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
14c70 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
14c80 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
14c90 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
14ca0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
14cb0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
14cc0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
14cd0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
14ce0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
14cf0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
14d00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14d10 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
14d20 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
14d30 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
14d40 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
14d50 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
14d60 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
14d70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14d80 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
14d90 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
14da0 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
14db0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14dc0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
14dd0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
14de0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
14df0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
14e00 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14e10 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
14e20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
14e30 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
14e40 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
14e50 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
14e60 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
14e70 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d  .....ucTmpBuf[0]
14e80 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75   = ((identity_nu
14e90 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30  m + 1) >> 8) & 0
14ea0 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75  xff;.....ucTmpBu
14eb0 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74  f[1] =  (identit
14ec0 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66  y_num + 1) & 0xf
14ed0 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  f;......pValue =
14ee0 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09   &ucTmpBuf;.....
14ef0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a  ulValueLen = 2;.
14f00 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14f10 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
14f20 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
14f30 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
14f40 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
14f50 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
14f60 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
14f70 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
14f80 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14f90 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
14fa0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
14fb0 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
14fc0 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
14fd0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
14fe0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
14ff0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
15000 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
15010 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
15020 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15030 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
15040 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
15050 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
15060 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
15070 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
15080 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
15090 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
150a0 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  t one certificat
150b0 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  e type */.....ck
150c0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
150d0 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a  e = CKC_X_509;..
150e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
150f0 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
15100 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
15110 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65  n = sizeof(ck_ce
15120 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b  rtificate_type);
15130 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15140 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15150 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f  returning CKC_X_
15160 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  509 (%lu) (%p/%l
15170 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
15180 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
15190 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
151a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
151b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
151c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
151d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
151e0 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09   CKA_KEY_TYPE:..
151f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15200 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
15210 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
15220 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38  _KEY_TYPE (0x%08
15230 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
15240 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
15250 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
15260 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
15270 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
15280 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
15290 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s != CKO_PUBLIC_
152a0 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  KEY) {......CACK
152b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
152c0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
152d0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
152e0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65   we are not a ke
152f0 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  y.");.......brea
15300 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
15310 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
15320 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f   one key type */
15330 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65  .....ck_key_type
15340 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09   = CKK_RSA;.....
15350 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65  .pValue = &ck_ke
15360 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  y_type;.....ulVa
15370 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
15380 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09  ck_key_type);...
15390 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
153a0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
153b0 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28  urning CKK_RSA (
153c0 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
153d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
153e0 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
153f0 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
15400 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
15410 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15420 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15430 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15440 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  SIGN:.....CACKEY
15450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15460 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
15470 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78  ute CKA_SIGN (0x
15480 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
15490 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
154a0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
154b0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
154c0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
154d0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
154e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
154f0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
15500 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
15510 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
15520 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
15530 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
15540 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
15550 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
15560 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
15570 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
15580 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
15590 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
155a0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
155b0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
155c0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
155d0 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
155e0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
155f0 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
15600 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15610 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15620 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
15630 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15640 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15650 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15660 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15670 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
15680 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
15690 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
156a0 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09  GN_RECOVER:.....
156b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
156c0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
156d0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49  attribute CKA_SI
156e0 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30  GN_RECOVER (0x%0
156f0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
15700 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
15710 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
15720 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15730 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
15740 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
15750 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15760 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
15770 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
15780 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
15790 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
157a0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
157b0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
157c0 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   We currently on
157d0 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e  ly support "Sign
157e0 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20   with Appendix" 
157f0 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  */.....pValue = 
15800 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
15810 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15820 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
15830 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15840 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
15850 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
15860 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
15870 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
15880 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
15890 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
158a0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
158b0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
158c0 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59  ..case CKA_DECRY
158d0 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PT:.....CACKEY_D
158e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
158f0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
15900 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30  e CKA_DECRYPT (0
15910 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15920 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15930 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15940 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
15950 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
15960 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
15970 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15980 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
15990 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
159a0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
159b0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
159c0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
159d0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
159e0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
159f0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
15a00 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61  KEY || objectcla
15a10 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss == CKO_PUBLIC
15a20 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
15a30 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
15a40 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15a50 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
15a60 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
15a70 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
15a80 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
15a90 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
15aa0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
15ab0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
15ac0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
15ad0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
15ae0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
15af0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
15b00 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
15b10 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
15b20 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15b30 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15b40 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15b50 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43  SENSITIVE:.....C
15b60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15b70 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
15b80 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e  ttribute CKA_SEN
15b90 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29  SITIVE (0x%08lx)
15ba0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15bb0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15bc0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
15bd0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
15be0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
15bf0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
15c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15c10 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
15c20 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
15c30 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
15c40 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
15c50 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
15c60 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
15c70 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
15c80 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
15c90 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
15ca0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
15cb0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
15cc0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
15cd0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
15ce0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
15cf0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15d00 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
15d10 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
15d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15d30 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15d40 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
15d50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15d60 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
15d70 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
15d80 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
15d90 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
15da0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
15db0 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ase CKA_EXTRACTA
15dc0 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BLE:.....CACKEY_
15dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15de0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
15df0 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  te CKA_EXTRACTAB
15e00 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
15e10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15e20 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15e30 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
15e40 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
15e50 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
15e60 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15e70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15e80 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
15e90 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
15ea0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
15eb0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
15ec0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
15ed0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
15ee0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
15ef0 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
15f00 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
15f10 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
15f20 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
15f30 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
15f40 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
15f50 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
15f60 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
15f70 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
15f80 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
15f90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15fa0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
15fb0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
15fc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
15fd0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
15fe0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
15ff0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16000 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16010 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
16020 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
16030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16040 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
16050 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
16060 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29  ODULUS (0x%08lx)
16070 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16080 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16090 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
160a0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
160b0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
160c0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
160d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
160e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
160f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
16100 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
16110 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
16120 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
16130 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
16140 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
16150 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
16160 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
16170 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69  to_modulus(certi
16180 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
16190 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
161a0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
161b0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
161c0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
161d0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
161e0 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
161f0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
16200 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
16210 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
16220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16230 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
16240 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
16250 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16260 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16270 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
16280 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
16290 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ENT:.....CACKEY_
162a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
162b0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
162c0 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  te CKA_PUBLIC_EX
162d0 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29  PONENT (0x%08lx)
162e0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
162f0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16300 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
16310 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
16320 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
16330 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
16340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16350 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
16360 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
16370 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
16380 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
16390 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
163a0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
163b0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
163c0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
163d0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
163e0 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74  to_exponent(cert
163f0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
16400 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
16410 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
16420 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
16430 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
16440 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
16450 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
16460 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
16470 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
16480 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
16490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
164a0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
164b0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
164c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
164d0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
164e0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
164f0 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54   CKA_TRUST_DIGIT
16500 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09  AL_SIGNATURE:...
16510 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
16520 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a  NON_REPUDIATION:
16530 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
16540 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d  ST_KEY_ENCIPHERM
16550 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
16560 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49  _TRUST_DATA_ENCI
16570 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
16580 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
16590 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61  AGREEMENT:....ca
165a0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
165b0 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63  _CERT_SIGN:....c
165c0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52  ase CKA_TRUST_CR
165d0 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20  L_SIGN:....case 
165e0 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52  CKA_TRUST_SERVER
165f0 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
16600 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f  KA_TRUST_CLIENT_
16610 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
16620 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
16630 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b  NING:....case CK
16640 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
16650 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41  OTECTION:.....CA
16660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16670 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
16680 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
16690 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20  T_... (0x%08lx) 
166a0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
166b0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
166c0 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
166d0 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64  ue = &ck_trusted
166e0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
166f0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
16700 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b  sted);......CACK
16710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16720 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16730 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
16740 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
16750 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56  ((CK_TRUST *) pV
16760 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
16770 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16780 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16790 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
167a0 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
167b0 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SH:.....CACKEY_D
167c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
167d0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
167e0 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f  e CKA_CERT_SHA1_
167f0 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
16800 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
16810 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
16820 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
16830 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16840 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
16850 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
16860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
16870 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
16880 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
16890 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
168a0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
168b0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
168c0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31  .....}......SHA1
168d0 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29  Reset(&sha1_ctx)
168e0 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28  ;.....SHA1Input(
168f0 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69  &sha1_ctx, certi
16900 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
16910 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48  ate_len);.....SH
16920 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63  A1Result(&sha1_c
16930 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a  tx, sha1_hash);.
16940 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68  .....pValue = sh
16950 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56  a1_hash;.....ulV
16960 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
16970 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09  (sha1_hash);....
16980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16990 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
169a0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
169b0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
169c0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
169d0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
169e0 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
169f0 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43  _MD5_HASH:.....C
16a00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16a10 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
16a20 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
16a30 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30  T_MD5_HASH (0x%0
16a40 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
16a50 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
16a60 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
16a70 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
16a80 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
16a90 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
16aa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16ab0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
16ac0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
16ad0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
16ae0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
16af0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
16b00 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
16b10 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63  ..MD5Init(&md5_c
16b20 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61  tx);.....MD5Upda
16b30 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72  te(&md5_ctx, cer
16b40 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
16b50 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
16b60 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73  MD5Final(md5_has
16b70 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09  h, &md5_ctx);...
16b80 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f  ...pValue = md5_
16b90 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75  hash;.....ulValu
16ba0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64  eLen = sizeof(md
16bb0 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41  5_hash);......CA
16bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16bd0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16be0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
16bf0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16c00 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16c10 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64  .....break;....d
16c20 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c  efault:.....pVal
16c30 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75  ue = NULL;.....u
16c40 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
16c50 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72  LONG) -1;.....br
16c60 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
16c70 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c  ((CK_LONG) ulVal
16c80 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c  ueLen) != ((CK_L
16c90 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f  ONG) -1)) {..../
16ca0 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72  * Push curr_attr
16cb0 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
16cc0 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  */....curr_attr.
16cd0 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72  type = curr_attr
16ce0 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61  _type;....curr_a
16cf0 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ttr.ulValueLen =
16d00 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09   ulValueLen;....
16d10 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  .curr_attr.pValu
16d20 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
16d30 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
16d40 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  ;....memcpy(curr
16d50 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56  _attr.pValue, pV
16d60 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e  alue, curr_attr.
16d70 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
16d80 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65  .if (pValue_free
16d90 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
16da0 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a  ..free(pValue);.
16db0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d  ...}.....if (num
16dc0 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f  attrs >= retval_
16dd0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74  count) {.....ret
16de0 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
16df0 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
16e00 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
16e10 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
16e20 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
16e30 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
16e40 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
16e50 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
16e60 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
16e70 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
16e80 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
16e90 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
16ea0 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
16eb0 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
16ec0 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
16ed0 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
16ee0 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
16ef0 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
16f00 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
16f10 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
16f20 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
16f30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16f40 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
16f50 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
16f60 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74  rs, (void *) ret
16f70 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
16f80 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
16f90 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
16fa0 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ee_identities(st
16fb0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
16fc0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
16fd0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
16fe0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
16ff0 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
17000 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75  E *curr_attr;..u
17010 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f  nsigned long id_
17020 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a  idx, attr_idx;..
17030 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20  .if (identities 
17040 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74  == NULL || ident
17050 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30  ities_count == 0
17060 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
17070 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d  ...for (id_idx =
17080 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65   0; id_idx < ide
17090 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69  ntities_count; i
170a0 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  d_idx++) {...if 
170b0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
170c0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20  dx].attributes) 
170d0 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69  {....for (attr_i
170e0 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
170f0 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64   < identities[id
17100 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
17110 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78  _count; attr_idx
17120 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61  ++) {.....curr_a
17130 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65  ttr = &identitie
17140 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
17150 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  utes[attr_idx];.
17160 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
17170 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09  tr->pValue) {...
17180 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74  ...free(curr_att
17190 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  r->pValue);.....
171a0 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69  }....}.....if (i
171b0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
171c0 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
171d0 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74  ....free(identit
171e0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
171f0 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09  ibutes);....}...
17200 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
17210 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69  rts(identities[i
17220 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
17230 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d  tity, 1, 1);...}
17240 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74  ..}...free(ident
17250 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69  ities);.}..stati
17260 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
17270 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
17280 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
17290 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
172a0 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75  y *identities, u
172b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
172c0 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75  _dod_certs) {..u
172d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
172e0 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20  t_idx, id_idx = 
172f0 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  0;...if (identit
17300 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies == NULL) {..
17310 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f  .return(num_dod_
17320 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a  certs * 3);..}..
17330 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d  .for (cert_idx =
17340 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e   0; cert_idx < n
17350 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65  um_dod_certs; ce
17360 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64  rt_idx++) {...id
17370 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17380 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
17390 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74   NULL;...identit
173a0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
173b0 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
173c0 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
173d0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20  KO_CERTIFICATE, 
173e0 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72  &extra_certs[cer
173f0 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c  t_idx], 0xf000 |
17400 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
17410 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
17420 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
17430 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09  ;...id_idx++;...
17440 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
17450 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
17460 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e  y = NULL;...iden
17470 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
17480 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
17490 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
174a0 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  s(CKO_PUBLIC_KEY
174b0 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63  , &extra_certs[c
174c0 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30  ert_idx], 0xf000
174d0 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64   | cert_idx, &id
174e0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
174f0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
17500 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  t);...id_idx++;.
17510 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
17520 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
17530 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64  ity = NULL;...id
17540 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17550 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
17560 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
17570 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45  tes(CKO_NETSCAPE
17580 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63  _TRUST, &extra_c
17590 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  erts[cert_idx], 
175a0 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64  0xf000 | cert_id
175b0 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
175c0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
175d0 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69  s_count);...id_i
175e0 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  dx++;..}...retur
175f0 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74  n(id_idx);.}..st
17600 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
17610 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  ey_identity *cac
17620 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
17630 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
17640 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
17650 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73  signed long *ids
17660 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63  _found) {..struc
17670 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
17680 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
17690 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
176a0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
176b0 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
176c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
176d0 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
176e0 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
176f0 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
17700 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  erts, num_dod_ce
17710 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09  rts, cert_idx;..
17720 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72  int include_extr
17730 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 0a 09 43  a_certs = 0;...C
17740 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17750 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
17760 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d  .if (ids_found =
17770 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
17780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17790 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75  "Error.  ids_fou
177a0 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  nd is NULL");...
177b0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
177c0 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
177d0 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55  _CARD_SLOT_INCLU
177e0 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09  DE_EXTRA_CERTS..
177f0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
17800 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  rts = 1;.#endif.
17810 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
17820 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f  CKEY_DOD_CERTS_O
17830 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20  N_HW_SLOTS") != 
17840 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
17850 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
17860 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  1;..}...if (gete
17870 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f  nv("CACKEY_NO_DO
17880 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c  D_CERTS_ON_HW_SL
17890 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  OTS") != NULL) {
178a0 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  ...include_extra
178b0 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _certs = 0;..}..
178c0 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
178d0 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
178e0 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
178f0 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20  ..num_dod_certs 
17900 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 0;..} else {..
17910 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d  .num_dod_certs =
17920 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65   sizeof(extra_ce
17930 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78  rts) / sizeof(ex
17940 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09  tra_certs[0]);..
17950 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e  }...if (slot->in
17960 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f  ternal) {...num_
17970 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ids = cackey_rea
17980 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
17990 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63  (NULL, num_dod_c
179a0 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75  erts);....if (nu
179b0 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a 09 09  m_ids != 0) {...
179c0 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
179d0 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
179e0 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
179f0 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  s));.....cackey_
17a00 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
17a10 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 2c 20  ies(identities, 
17a20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
17a30 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 64  ..} else {....id
17a40 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
17a50 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75  ...}....*ids_fou
17a60 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
17a70 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
17a80 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69  es);..}...pcsc_i
17a90 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
17aa0 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c  ey_read_certs(sl
17ab0 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  ot, NULL, &num_c
17ac0 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63  erts);..if (pcsc
17ad0 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
17ae0 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76  ULL) {.../* Conv
17af0 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65  ert number of Ce
17b00 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66  rts to number of
17b10 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75   objects */...nu
17b20 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49  m_ids = (CKO_PRI
17b30 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43  VATE_KEY - CKO_C
17b40 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20  ERTIFICATE + 1) 
17b50 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09  * num_certs;....
17b60 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72  if (include_extr
17b70 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e 75  a_certs) {....nu
17b80 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f  m_ids += cackey_
17b90 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
17ba0 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f  ies(NULL, num_do
17bb0 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
17bc0 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
17bd0 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
17be0 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
17bf0 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63  s));..../* Add c
17c00 65 72 74 69 66 69 63 61 74 65 73 2c 20 70 75 62  ertificates, pub
17c10 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72  lic keys, and pr
17c20 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20  ivate keys from 
17c30 74 68 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f  the smartcard */
17c40 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09  ...id_idx = 0;..
17c50 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d  .for (cert_idx =
17c60 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e   0; cert_idx < n
17c70 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69  um_certs; cert_i
17c80 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28  dx++) {....for (
17c90 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43  curr_id_type = C
17ca0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20  KO_CERTIFICATE; 
17cb0 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20  curr_id_type <= 
17cc0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b  CKO_PRIVATE_KEY;
17cd0 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29   curr_id_type++)
17ce0 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65   {.....identitie
17cf0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
17d00 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
17d10 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75 72  t_attributes(cur
17d20 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63  r_id_type, &pcsc
17d30 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
17d40 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c  _idx], cert_idx,
17d50 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
17d60 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
17d70 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65  count);......ide
17d80 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
17d90 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
17da0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69  malloc(sizeof(*i
17db0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
17dc0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
17dd0 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64  );.....memcpy(id
17de0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
17df0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20  .pcsc_identity, 
17e00 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
17e10 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65  [cert_idx], size
17e20 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69  of(*identities[i
17e30 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
17e40 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65  tity));......ide
17e50 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
17e60 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
17e70 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
17e80 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74  loc(pcsc_identit
17e90 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
17ea0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
17eb0 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74  ....memcpy(ident
17ec0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
17ed0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
17ee0 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69  tificate, pcsc_i
17ef0 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
17f00 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c  dx].certificate,
17f10 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
17f20 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
17f30 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
17f40 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d  ..id_idx++;....}
17f50 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c  ...}....if (incl
17f60 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29  ude_extra_certs)
17f70 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
17f80 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75  UG_PRINTF("Inclu
17f90 64 69 6e 67 20 44 6f 44 20 43 65 72 74 69 66 69  ding DoD Certifi
17fa0 63 61 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72  cates on hardwar
17fb0 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61  e slot");.....ca
17fc0 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
17fd0 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74  entities(identit
17fe0 69 65 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75  ies + id_idx, nu
17ff0 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09  m_dod_certs);...
18000 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
18010 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
18020 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
18030 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66  s, 1);....*ids_f
18040 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ound = num_ids;.
18050 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69  ...return(identi
18060 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64  ties);..}....*id
18070 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65  s_found = 0;..re
18080 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43  turn(NULL);.}..C
18090 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
180a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69  N(CK_RV, C_Initi
180b0 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
180c0 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a  TR pInitArgs) {.
180d0 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
180e0 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67  _ARGS CK_PTR arg
180f0 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78  s;..uint32_t idx
18100 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a  , highest_slot;.
18110 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f  .int mutex_init_
18120 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
18130 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18140 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
18150 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
18160 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18170 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18180 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61    Already initia
18190 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
181a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
181b0 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c  _ALREADY_INITIAL
181c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
181d0 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c  pInitArgs != NUL
181e0 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49  L) {...args = pI
181f0 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70  nitArgs;...memcp
18200 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20  y(&cackey_args, 
18210 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63  args, sizeof(cac
18220 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69  key_args));....i
18230 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d  f (args->CreateM
18240 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
18250 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74  args->DestroyMut
18260 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
18270 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d  gs->LockMutex ==
18280 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55   NULL || args->U
18290 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55  nlockMutex == NU
182a0 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67  LL) {....if (arg
182b0 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21  s->CreateMutex !
182c0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
182d0 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20  DestroyMutex != 
182e0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
182f0 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  ckMutex != NULL 
18300 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
18310 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  utex != NULL) {.
18320 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18330 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18340 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c  Some, but not Al
18350 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d  l threading prim
18360 69 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e  itives provided.
18370 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
18380 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
18390 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20  D);....}...}..} 
183a0 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f  else {...cackey_
183b0 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
183c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
183d0 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75  y_args.DestroyMu
183e0 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
183f0 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
18400 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
18410 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
18420 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
18430 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
18440 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20  s = 0;..}...for 
18450 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
18460 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
18470 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
18480 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
18490 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
184a0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
184b0 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
184c0 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64   0;..}...for (id
184d0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
184e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
184f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
18500 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
18510 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79  dx++) {...cackey
18520 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
18530 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ve = 0;...cackey
18540 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
18550 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
18560 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
18570 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
18580 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
18590 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
185a0 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
185b0 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63  hw_lock = 0;...c
185c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
185d0 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
185e0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
185f0 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  idx].token_flags
18600 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
18610 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20  lots[idx].label 
18620 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
18630 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65  _slots[idx].inte
18640 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  rnal = 0;..}...i
18650 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
18660 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
18670 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
18680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18690 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74  NTF("Asked not t
186a0 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65  o include DoD ce
186b0 72 74 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d  rtificates");..}
186c0 20 65 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73   else {...highes
186d0 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66  t_slot = (sizeof
186e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
186f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
18700 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a  lots[0])) - 1;..
18710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18720 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67  RINTF("Including
18730 20 44 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c   DoD certs in sl
18740 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ot %lu", (unsign
18750 65 64 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74  ed long) highest
18760 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65  _slot);....cacke
18770 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
18780 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31  slot].active = 1
18790 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
187a0 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69  [highest_slot].i
187b0 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63  nternal = 1;...c
187c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
187d0 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20  est_slot].label 
187e0 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
187f0 20 2a 29 20 22 44 6f 44 20 43 65 72 74 69 66 69   *) "DoD Certifi
18800 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79  cates";...cackey
18810 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
18820 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
18830 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63   = "CACKey";...c
18840 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
18850 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  est_slot].token_
18860 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
18870 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
18880 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63  ed = 1;...if (!c
18890 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
188a0 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e  it) {...mutex_in
188b0 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  it_ret = cackey_
188c0 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63 61  mutex_create(&ca
188d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
188e0 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74  ..if (mutex_init
188f0 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  _ret != 0) {....
18900 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18910 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74  NTF("Error.  Mut
18920 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
18930 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  n failed.");....
18940 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54  .return(CKR_CANT
18950 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63  _LOCK);...}....c
18960 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
18970 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43  it = 1;..}...CAC
18980 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18990 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
189a0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
189b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
189c0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
189d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
189e0 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b  , C_Finalize)(CK
189f0 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72  _VOID_PTR pReser
18a00 76 65 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  ved) {..uint32_t
18a10 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
18a20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
18a30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52  led.");...if (pR
18a40 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29  eserved != NULL)
18a50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18a60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18a70 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f   pReserved is no
18a80 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
18a90 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
18aa0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
18ab0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
18ac0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
18ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18ae0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
18af0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
18b00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
18b10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
18b20 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ED);..}...for (i
18b30 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
18b40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
18b50 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
18b60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18b70 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
18b80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
18b90 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
18ba0 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  ) {....C_CloseSe
18bb0 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a  ssion(idx);...}.
18bc0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .}...cackey_slot
18bd0 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
18be0 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ();...for (idx =
18bf0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
18c00 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
18c10 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
18c20 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b  slots[0])); idx+
18c30 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
18c40 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74  y_slots[idx].int
18c50 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f 6e 74  ernal) {....cont
18c60 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
18c70 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
18c80 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20  x].pcsc_reader) 
18c90 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
18ca0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
18cb0 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 0a 09  _reader);...}...
18cc0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
18cd0 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
18ce0 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  rts) {....cackey
18cf0 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61 63 6b  _free_certs(cack
18d00 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
18d10 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61 63 6b  ched_certs, cack
18d20 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
18d30 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
18d40 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  , 1);.....cackey
18d50 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
18d60 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
18d70 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
18d80 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
18d90 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ();...cackey_ini
18da0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09  tialized = 0;...
18db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18dc0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
18dd0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
18de0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
18df0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
18e00 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
18e10 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28  _RV, C_GetInfo)(
18e20 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  CK_INFO_PTR pInf
18e30 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
18e40 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
18e50 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
18e60 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
18e70 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
18e80 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  AR libraryDescri
18e90 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
18ea0 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  y";...CACKEY_DEB
18eb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
18ec0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
18ed0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
18ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18ef0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
18f00 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
18f10 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
18f20 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
18f30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18f40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18f50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18f60 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
18f70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
18f80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
18f90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
18fa0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  IZED);..}...pInf
18fb0 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
18fc0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
18fd0 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
18fe0 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
18ff0 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
19000 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
19010 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
19020 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
19030 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
19040 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74  & 0xff;...memset
19050 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
19060 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
19070 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
19080 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
19090 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
190a0 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
190b0 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
190c0 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
190d0 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  D) - 1);...pInfo
190e0 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a  ->flags = 0x00;.
190f0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
19100 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
19110 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
19120 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
19130 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
19140 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mcpy(pInfo->libr
19150 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
19160 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
19170 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61  on, sizeof(libra
19180 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  ryDescription) -
19190 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69   1);...pInfo->li
191a0 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a  braryVersion.maj
191b0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
191c0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
191d0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
191e0 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
191f0 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
19200 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
19210 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  8) & 0xff;...CAC
19220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19230 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
19240 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
19250 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
19260 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72  OK);.}../*. * Pr
19270 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65  ocess list of re
19280 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74  aders, and creat
19290 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65  e mapping betwee
192a0 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e  n reader name an
192b0 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b  d slot ID. */.CK
192c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
192d0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
192e0 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20  tList)(CK_BBOOL 
192f0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b  tokenPresent, CK
19300 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
19310 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  otList, CK_ULONG
19320 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
19330 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66 69 72  ..static int fir
19340 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e  st_call = 1;..in
19350 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
19360 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
19370 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  t_ret;..CK_ULONG
19380 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75   count, slot_cou
19390 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74  nt = 0, currslot
193a0 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 61  , slot_idx;..cha
193b0 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c  r *pcsc_readers,
193c0 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73   *pcsc_readers_s
193d0 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , *pcsc_readers_
193e0 65 3b 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72  e;..DWORD pcsc_r
193f0 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e  eaders_len;..LON
19400 47 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  G scard_listread
19410 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74  ers_ret;..size_t
19420 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
19430 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65  ;..int slot_rese
19440 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
19450 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
19460 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f  .");...if (pulCo
19470 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
19480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
194a0 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29  Count is NULL.")
194b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
194c0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
194d0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
194e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
194f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19500 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
19510 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
19520 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
19530 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
19540 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
19550 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
19560 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
19570 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
19580 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
19590 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
195a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
195b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
195c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
195d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
195e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
195f0 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20  ../* Clear list 
19600 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f  of slots */..slo
19610 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 69 66  t_reset = 0;..if
19620 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09   (pSlotList) {..
19630 09 69 66 20 28 66 69 72 73 74 5f 63 61 6c 6c 29  .if (first_call)
19640 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 61 6c 6c   {....first_call
19650 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72   = 0;.....slot_r
19660 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09  eset = 1;...}...
19670 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  ./* If any of th
19680 65 20 73 6c 6f 74 73 20 68 61 76 65 20 62 65 65  e slots have bee
19690 6e 20 72 65 73 65 74 20 74 68 65 6e 20 70 75 72  n reset then pur
196a0 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ge all informati
196b0 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 61 67 61  on and check aga
196c0 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72  in */...for (cur
196d0 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
196e0 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
196f0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
19700 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
19710 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
19720 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ++) {....if (cac
19730 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
19740 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  ot].internal) {.
19750 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
19760 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
19770 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
19780 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
19790 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
197a0 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
197b0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73  lots[currslot].s
197c0 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09  lot_reset) {....
197d0 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  .slot_reset = 1;
197e0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
197f0 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f  }...}....if (slo
19800 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 43 41  t_reset) {....CA
19810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19820 46 28 22 50 75 72 67 69 6e 67 20 61 6c 6c 20 73  F("Purging all s
19830 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  lot information.
19840 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20  ");...../* Only 
19850 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
19860 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
19870 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
19880 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
19890 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
198a0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
198b0 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
198c0 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72  );.....for (curr
198d0 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c  slot = 0; currsl
198e0 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
198f0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
19900 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
19910 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  [0])); currslot+
19920 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63  +) {.....if (cac
19930 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
19940 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  ot].internal) {.
19950 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
19960 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61  ...}......if (ca
19970 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
19980 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
19990 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61  ) {......free(ca
199a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
199b0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
199c0 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  );.......cackey_
199d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
199e0 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55  pcsc_reader = NU
199f0 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  LL;.....}......i
19a00 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
19a10 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29  currslot].label)
19a20 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63   {......free(cac
19a30 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
19a40 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09  ot].label);.....
19a50 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
19a60 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
19a70 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
19a80 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
19a90 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20  urrslot].active 
19aa0 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  = 0;....}...} el
19ab0 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a 09 7d 0a  se {.......}..}.
19ac0 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c  ../* Determine l
19ad0 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a  ist of readers *
19ae0 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  /..pcsc_connect_
19af0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73  ret = cackey_pcs
19b00 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66  c_connect();..if
19b10 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
19b20 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
19b30 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
19b40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19b50 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50  "Connection to P
19b60 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73  C/SC failed, ass
19b70 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29  uming no slots")
19b80 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20  ;....slot_count 
19b90 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 0;..} else {..
19ba0 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  .pcsc_readers_le
19bb0 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f  n = 0;....scard_
19bc0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
19bd0 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  = SCardListReade
19be0 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  rs(*cackey_pcsc_
19bf0 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55  handle, NULL, NU
19c00 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72  LL, &pcsc_reader
19c10 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73  s_len);....if (s
19c20 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
19c30 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f  _ret == SCARD_F_
19c40 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09  COMM_ERROR) {...
19c50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19c60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61  INTF("Error. SCa
19c70 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20  rdListReaders() 
19c80 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46  returned SCARD_F
19c90 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73  _COMM_ERROR, ass
19ca0 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e  uming Connection
19cb0 20 74 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61   to PC/SC went a
19cc0 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e  way. Reconnectin
19cd0 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  g.");.....cackey
19ce0 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
19cf0 28 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  ();....cackey_pc
19d00 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09  sc_connect();...
19d10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19d20 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43  RINTF("Trying SC
19d30 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 29  ardListReaders()
19d40 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61   again");....sca
19d50 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
19d60 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
19d70 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
19d80 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
19d90 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61   NULL, &pcsc_rea
19da0 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a  ders_len);...}..
19db0 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
19dc0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
19dd0 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26  CARD_S_SUCCESS &
19de0 26 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  & pcsc_readers_l
19df0 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63  en != 0) {....pc
19e00 73 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c  sc_readers = mal
19e10 6c 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72 73  loc(pcsc_readers
19e20 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72  _len);....pcsc_r
19e30 65 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f  eaders_s = pcsc_
19e40 72 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61  readers;.....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 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
19e70 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
19e80 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
19e90 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26   pcsc_readers, &
19ea0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
19eb0 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
19ec0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
19ed0 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
19ee0 53 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72  SS) {.....pcsc_r
19ef0 65 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f  eaders_e = pcsc_
19f00 72 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72  readers + pcsc_r
19f10 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09  eaders_len;.....
19f20 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53  ./* Start with S
19f30 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f  lot ID 1, to avo
19f40 69 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20  id a bug in GDM 
19f50 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f  on RHEL */...../
19f60 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74  * Bug 594911: ht
19f70 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72  tps://bugzilla.r
19f80 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62  edhat.com/show_b
19f90 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31  ug.cgi?id=594911
19fa0 20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74   */.....currslot
19fb0 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f 74 5f 63   = 1;.....slot_c
19fc0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 77 68  ount = 0;.....wh
19fd0 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72  ile (pcsc_reader
19fe0 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73  s < pcsc_readers
19ff0 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69  _e) {....../* Fi
1a000 6e 64 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c  nd next availabl
1a010 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66  e slot */......f
1a020 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c  or (; currslot <
1a030 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1a040 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1a050 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1a060 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1a070 0a 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b  .......if (!cack
1a080 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1a090 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
1a0a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
1a0b0 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  .}......}.......
1a0c0 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
1a0d0 3d 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65  = strlen(pcsc_re
1a0e0 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66  aders);.......if
1a0f0 20 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20   ((pcsc_readers 
1a100 2b 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  + curr_reader_le
1a110 6e 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72  n) > pcsc_reader
1a120 73 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65  s_e) {.......bre
1a130 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
1a140 09 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72  .if (curr_reader
1a150 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09  _len == 0) {....
1a160 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1a170 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73  .......if (currs
1a180 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  lot >= (sizeof(c
1a190 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1a1a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1a1b0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09  ts[0]))) {......
1a1c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a1d0 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65  INTF("Found more
1a1e0 20 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c   readers than sl
1a1f0 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ots are availabl
1a200 65 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  e!");........bre
1a210 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
1a220 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a230 49 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64  INTF("Found read
1a240 65 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65  er: %s", pcsc_re
1a250 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a  aders);......./*
1a260 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65   Only update the
1a270 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69   list of slots i
1a280 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c  f we are actuall
1a290 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73 75  y being asked su
1a2a0 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e  pply the slot in
1a2b0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09  formation */....
1a2c0 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29  ..if (pSlotList)
1a2d0 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 6c 6f   {.......if (slo
1a2e0 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09 09  t_reset) {......
1a2f0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1a300 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20  urrslot].active 
1a310 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 1;........cack
1a320 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1a330 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b  t].internal = 0;
1a340 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1a350 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
1a360 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72  csc_reader = str
1a370 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72 73  dup(pcsc_readers
1a380 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  );........cackey
1a390 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1a3a0 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
1a3b0 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 09  cted = 0;.......
1a3c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1a3d0 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74  rrslot].transact
1a3e0 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09  ion_depth = 0;..
1a3f0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1a400 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61  ts[currslot].tra
1a410 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
1a420 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09 09  _lock = 0;......
1a430 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1a440 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66  urrslot].token_f
1a450 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
1a460 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09  _REQUIRED;......
1a470 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1a480 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
1a490 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63   NULL;.........c
1a4a0 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
1a4b0 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c  reset(&cackey_sl
1a4c0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a  ots[currslot]);.
1a4d0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
1a4e0 6c 73 65 20 7b 0a 09 09 09 09 09 09 2f 2a 20 41  lse {......./* A
1a4f0 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e 63 72  rtificially incr
1a500 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65 72 20  ease the number 
1a510 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74 73 20  of active slots 
1a520 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62 65 63  by what will bec
1a530 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a 09 09  ome active */...
1a540 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b  ....slot_count++
1a550 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75  ;......}......cu
1a560 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09  rrslot++;.......
1a570 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20  pcsc_readers += 
1a580 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
1a590 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  + 1;.....}......
1a5a0 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
1a5b0 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  0; currslot < (s
1a5c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1a5d0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1a5e0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1a5f0 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1a600 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1a610 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1a620 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 43 41  tive) {.......CA
1a630 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a640 46 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20  F("Found active 
1a650 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69  slot %lu", (unsi
1a660 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73  gned long) currs
1a670 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 73 6c 6f  lot);........slo
1a680 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
1a690 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  }.....}....} els
1a6a0 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
1a6b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
1a6c0 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72  ond call to SCar
1a6d0 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69  dListReaders fai
1a6e0 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25  led, return %s/%
1a6f0 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  li", CACKEY_DEBU
1a700 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
1a710 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73  TO_STR(scard_lis
1a720 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28  treaders_ret), (
1a730 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74  long) scard_list
1a740 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09  readers_ret);...
1a750 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63  .}.....free(pcsc
1a760 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d  _readers_s);...}
1a770 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
1a780 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a790 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43  First call to SC
1a7a0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
1a7b0 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
1a7c0 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
1a7d0 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
1a7e0 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
1a7f0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
1a800 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
1a810 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
1a820 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
1a830 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1a840 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1a850 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1a860 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1a870 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1a880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a890 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1a8a0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1a8b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1a8c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1a8d0 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
1a8e0 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
1a8f0 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b  nt = slot_count;
1a900 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a910 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1a920 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
1a930 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
1a940 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72  rs, but not stor
1a950 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69  ing IDs (pSlotLi
1a960 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b  st == NULL)", CK
1a970 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
1a980 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
1a990 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1a9a0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74  _OK);..}...count
1a9b0 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69   = *pulCount;..i
1a9c0 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f  f (count < slot_
1a9d0 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45  count) {...CACKE
1a9e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a9f0 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1aa00 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1aa10 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25  s, but we have %
1aa20 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f  lu entries.", co
1aa30 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  unt, slot_count)
1aa40 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1aa50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1aa60 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
1aa70 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72  OO_SMALL");....r
1aa80 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
1aa90 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
1aaa0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1aab0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1aac0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1aad0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1aae0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1aaf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ab00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1ab10 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1ab20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1ab30 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1ab40 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30  }...slot_idx = 0
1ab50 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ;..for (currslot
1ab60 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20   = 0; (currslot 
1ab70 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1ab80 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1ab90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1aba0 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ))); currslot++)
1abb0 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
1abc0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1abd0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f  .active) {....co
1abe0 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
1abf0 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63  f (slot_idx >= c
1ac00 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
1ac10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ac20 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1ac30 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1ac40 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20 74  s, but we just t
1ac50 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ried to write to
1ac60 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d   the %lu index -
1ac70 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75  - ignoring", cou
1ac80 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a  nt, slot_idx);..
1ac90 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1aca0 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c  ....pSlotList[sl
1acb0 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c  ot_idx] = currsl
1acc0 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b  ot;...slot_idx++
1acd0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1ace0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1acf0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ad00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ad10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ad20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ad30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ad40 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1ad50 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ad60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ad70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  RROR);..}...*pul
1ad80 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
1ad90 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  nt;...CACKEY_DEB
1ada0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1adb0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1adc0 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
1add0 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20  ders.", CKR_OK, 
1ade0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1adf0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72  slot_count);...r
1ae00 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a  eturn(CKR_OK);..
1ae10 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20  .tokenPresent = 
1ae20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a  tokenPresent; /*
1ae30 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
1ae40 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
1ae50 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
1ae60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1ae70 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28   C_GetSlotInfo)(
1ae80 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1ae90 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f  D, CK_SLOT_INFO_
1aea0 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
1aeb0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1aec0 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
1aed0 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f  [] = "CACKey Slo
1aee0 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  t";..int mutex_r
1aef0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65  etval;..int byte
1af00 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43  s_to_copy;...CAC
1af10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1af20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1af30 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1af40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1af50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1af60 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1af70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1af80 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1af90 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1afa0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1afb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1afc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1afd0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1afe0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1aff0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b000 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b010 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1b020 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1b030 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b040 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1b050 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1b060 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b070 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b080 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1b090 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1b0a0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1b0b0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1b0c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1b0d0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1b0e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1b0f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1b100 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1b110 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1b120 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1b130 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b140 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b150 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1b160 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b170 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1b180 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1b190 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1b1a0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1b1b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b1c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1b1d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1b1e0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1b1f0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1b200 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1b210 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1b220 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1b230 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1b240 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1b250 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
1b260 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
1b270 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21  HW_SLOT;...if (!
1b280 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1b290 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  tID].internal) {
1b2a0 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1b2b0 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45  |= CKF_REMOVABLE
1b2c0 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66  _DEVICE;..}...if
1b2d0 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
1b2e0 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
1b2f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
1b300 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
1b310 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
1b320 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
1b330 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
1b340 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74  NT;..}...bytes_t
1b350 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28  o_copy = strlen(
1b360 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1b370 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
1b380 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70  );..if (sizeof(p
1b390 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1b3a0 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f  erID) < bytes_to
1b3b0 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73  _copy) {...bytes
1b3c0 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f  _to_copy = sizeo
1b3d0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1b3e0 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65  turerID);..}..me
1b3f0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
1b400 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b  facturerID, cack
1b410 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1b420 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79  .pcsc_reader, by
1b430 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09  tes_to_copy);...
1b440 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1b450 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1b460 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1b470 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1b480 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1b490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b4a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1b4b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1b4c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b4d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1b4e0 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
1b4f0 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69  o->slotDescripti
1b500 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
1b510 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
1b520 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70  iption));..memcp
1b530 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  y(pInfo->slotDes
1b540 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65  cription, slotDe
1b550 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f  scription, sizeo
1b560 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  f(slotDescriptio
1b570 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  n) - 1);...memse
1b580 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1b590 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1b5a0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1b5b0 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09  facturerID));...
1b5c0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
1b5d0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
1b5e0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1b5f0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
1b600 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
1b610 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1b620 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1b630 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1b640 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
1b650 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
1b660 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
1b670 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1b680 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
1b690 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
1b6a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b6b0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1b6c0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1b6d0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1b6e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b6f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54  ON(CK_RV, C_GetT
1b700 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  okenInfo)(CK_SLO
1b710 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
1b720 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  TOKEN_INFO_PTR p
1b730 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1b740 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
1b750 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
1b760 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
1b770 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
1b780 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62  8CHAR defaultLab
1b790 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20  el[] = "Unknown 
1b7a0 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20  Token";..static 
1b7b0 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65  CK_UTF8CHAR mode
1b7c0 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e  l[] = "CAC Token
1b7d0 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ";..struct cacke
1b7e0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
1b7f0 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
1b800 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1b810 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69   num_certs;..ssi
1b820 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a  ze_t label_ret;.
1b830 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1b840 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61  l;..int use_defa
1b850 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43  ult_label;...CAC
1b860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b870 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b880 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1b890 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b8a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b8b0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1b8c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b8d0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1b8e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1b8f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b900 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b910 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b920 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b930 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b940 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b950 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b960 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1b970 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1b980 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b990 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1b9a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1b9b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b9c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b9d0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1b9e0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1b9f0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1ba00 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1ba10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ba20 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1ba30 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1ba40 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1ba50 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1ba60 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1ba70 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1ba80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ba90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1baa0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1bab0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1bac0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1bad0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1bae0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1baf0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1bb00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bb10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1bb20 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1bb30 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1bb40 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1bb50 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1bb60 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1bb70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1bb80 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1bb90 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1bba0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1bbb0 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
1bbc0 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
1bbd0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
1bbe0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
1bbf0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
1bc00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bc10 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73  NTF("No token is
1bc20 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74   present in slot
1bc30 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49  ID = %lu", slotI
1bc40 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1bc50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1bc60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1bc70 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1bc80 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d  NOT_PRESENT);..}
1bc90 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1bca0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1bcb0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1bcc0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1bcd0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1bce0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bcf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1bd00 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1bd10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1bd20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1bd30 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
1bd40 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c  mine token label
1bd50 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74   from certificat
1bd60 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49  es */..memset(pI
1bd70 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c  nfo->label, ' ',
1bd80 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1bd90 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66  abel));..use_def
1bda0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a  ault_label = 1;.
1bdb0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1bdc0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1bdd0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63   == NULL) {...pc
1bde0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
1bdf0 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
1be00 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
1be10 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26  slotID], NULL, &
1be20 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66  num_certs);...if
1be30 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
1be40 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
1be50 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
1be60 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72  0) {.....label_r
1be70 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
1be80 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
1be90 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  el(pcsc_identiti
1bea0 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  es, pInfo->label
1beb0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1bec0 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20  label));.....if 
1bed0 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20  (label_ret > 0) 
1bee0 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75  {......use_defau
1bef0 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09  lt_label = 0;...
1bf00 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1bf10 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
1bf20 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70   malloc(sizeof(p
1bf30 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
1bf40 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
1bf50 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1bf60 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c  .label, pInfo->l
1bf70 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
1bf80 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
1bf90 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
1bfa0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
1bfb0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
1bfc0 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09  um_certs, 1);...
1bfd0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  }..} else {...me
1bfe0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
1bff0 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  l, cackey_slots[
1c000 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73  slotID].label, s
1c010 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
1c020 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66  el));....use_def
1c030 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
1c040 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66  .}...if (use_def
1c050 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09  ault_label) {...
1c060 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
1c070 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65  bel, defaultLabe
1c080 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c  l, sizeof(defaul
1c090 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d  tLabel) - 1);..}
1c0a0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1c0b0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1c0c0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1c0d0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1c0e0 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
1c0f0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1c100 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
1c110 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
1c120 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
1c130 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1c140 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69  ->model, ' ', si
1c150 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65  zeof(pInfo->mode
1c160 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  l));..memcpy(pIn
1c170 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c  fo->model, model
1c180 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20  , sizeof(model) 
1c190 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
1c1a0 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62  Info->serialNumb
1c1b0 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  er, ' ', sizeof(
1c1c0 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
1c1d0 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28  ber));...memset(
1c1e0 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20  pInfo->utcTime, 
1c1f0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1c200 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09  o->utcTime));...
1c210 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
1c220 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
1c230 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1c240 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
1c250 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
1c260 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1c270 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1c280 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1c290 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
1c2a0 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
1c2b0 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
1c2c0 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1c2d0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
1c2e0 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  0;...pInfo->flag
1c2f0 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52  s = CKF_WRITE_PR
1c300 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53  OTECTED | CKF_US
1c310 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a  ER_PIN_INITIALIZ
1c320 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49  ED | CKF_TOKEN_I
1c330 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63  NITIALIZED | cac
1c340 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1c350 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a  ].token_flags;..
1c360 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73  .pInfo->ulMaxSes
1c370 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a  sionCount = (siz
1c380 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1c390 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1c3a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1c3b0 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e  )) - 1;..pInfo->
1c3c0 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  ulSessionCount =
1c3d0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
1c3e0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
1c3f0 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73  nfo->ulMaxRwSess
1c400 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70  ionCount = 0;..p
1c410 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f  Info->ulRwSessio
1c420 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
1c430 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1c440 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
1c450 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a  axPinLen = 128;.
1c460 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e  .pInfo->ulMinPin
1c470 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  Len = 0;..pInfo-
1c480 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65  >ulTotalPublicMe
1c490 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1c4a0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1c4b0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
1c4c0 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  ePublicMemory = 
1c4d0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1c4e0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1c4f0 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61  fo->ulTotalPriva
1c500 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
1c510 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1c520 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1c530 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f  lFreePrivateMemo
1c540 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
1c550 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
1c560 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c570 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c580 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c590 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c5a0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1c5b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c5c0 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f  (CK_RV, C_WaitFo
1c5d0 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46  rSlotEvent)(CK_F
1c5e0 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53  LAGS flags, CK_S
1c5f0 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
1c600 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ID, CK_VOID_PTR 
1c610 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41  pReserved) {..CA
1c620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c630 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c640 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
1c650 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1c660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c670 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
1c680 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
1c690 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c6a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c6b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1c6c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1c6d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c6e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1c6f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1c700 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c710 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1c720 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c730 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d  /* XXX: TODO: Im
1c740 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20  plement this... 
1c750 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  */..CACKEY_DEBUG
1c760 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1c770 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1c780 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1c790 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1c7a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1c7b0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1c7c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1c7d0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1c7e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1c7f0 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e  _RV, C_GetMechan
1c800 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54  ismList)(CK_SLOT
1c810 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d  _ID slotID, CK_M
1c820 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54  ECHANISM_TYPE_PT
1c830 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  R pMechanismList
1c840 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1c850 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
1c860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c870 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1c880 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1c890 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1c8a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c8b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1c8c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1c8d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1c8e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1c8f0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
1c900 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
1c910 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c920 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c930 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
1c940 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1c950 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1c960 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
1c970 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e  chanismList == N
1c980 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
1c990 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45  nt = 1;....CACKE
1c9a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c9b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1c9c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1c9d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1c9e0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75  K);..}...if (*pu
1c9f0 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09  lCount < 1) {...
1ca00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ca10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66  NTF("Error.  Buf
1ca20 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29  fer too small.")
1ca30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ca40 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1ca50 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69  );..}...pMechani
1ca60 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f  smList[0] = CKM_
1ca70 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43  RSA_PKCS;..*pulC
1ca80 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  ount = 1;...CACK
1ca90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1caa0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1cab0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1cac0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1cad0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1cae0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1caf0 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
1cb00 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
1cb10 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
1cb20 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20  NISM_TYPE type, 
1cb30 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46  CK_MECHANISM_INF
1cb40 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
1cb50 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1cb60 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1cb70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1cb80 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
1cb90 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1cba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cbb0 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
1cbc0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1cbd0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1cbe0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1cbf0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1cc00 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1cc10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cc20 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1cc30 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1cc40 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1cc50 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1cc60 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
1cc70 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1cc80 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1cc90 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1cca0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1ccb0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1ccc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ccd0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1cce0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1ccf0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1cd00 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1cd10 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1cd20 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1cd30 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
1cd40 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1cd50 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1cd60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1cd70 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1cd80 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1cd90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cda0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1cdb0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1cdc0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1cdd0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1cde0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
1cdf0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
1ce00 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1ce10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ce20 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1ce30 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1ce40 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
1ce50 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
1ce60 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
1ce70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ce80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1ce90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1cea0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1ceb0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1cec0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1ced0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1cee0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1cef0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1cf00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cf10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cf20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1cf30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1cf40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1cf50 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
1cf60 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  (type) {...case 
1cf70 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
1cf80 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79  .pInfo->ulMinKey
1cf90 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70  Size = 512;....p
1cfa0 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69  Info->ulMaxKeySi
1cfb0 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49  ze = 8192;....pI
1cfc0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
1cfd0 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50  _HW | CKF_ENCRYP
1cfe0 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20  T | CKF_DECRYPT 
1cff0 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46  | CKF_SIGN | CKF
1d000 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61  _VERIFY;....brea
1d010 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  k;..}...CACKEY_D
1d020 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1d030 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1d040 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1d050 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1d060 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
1d070 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
1d080 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
1d090 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1d0a0 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b   C_InitToken)(CK
1d0b0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1d0c0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
1d0d0 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
1d0e0 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ulPinLen, CK_UTF
1d0f0 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c  8CHAR_PTR pLabel
1d100 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1d110 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1d120 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1d130 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1d140 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d150 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d160 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1d170 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1d180 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1d190 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1d1a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d1b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1d1c0 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
1d1d0 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
1d1e0 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
1d1f0 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
1d200 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
1d210 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
1d220 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  D);.}../* We don
1d230 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
1d240 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
1d250 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1d260 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28  _RV, C_InitPIN)(
1d270 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1d280 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
1d290 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
1d2a0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
1d2b0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1d2c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d2d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1d2e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1d2f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1d300 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d310 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1d320 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1d330 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1d340 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1d350 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1d360 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d370 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
1d380 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
1d390 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
1d3a0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
1d3b0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
1d3c0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1d3d0 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  CTED);.}../* We 
1d3e0 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
1d3f0 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
1d400 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1d410 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e  (CK_RV, C_SetPIN
1d420 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1d430 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1d440 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f  _UTF8CHAR_PTR pO
1d450 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ldPin, CK_ULONG 
1d460 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f  ulOldPinLen, CK_
1d470 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65  UTF8CHAR_PTR pNe
1d480 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  wPin, CK_ULONG u
1d490 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43  lNewPinLen) {..C
1d4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d4b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1d4c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1d4d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1d4e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d4f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1d500 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1d510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1d520 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1d530 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1d540 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d550 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1d560 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1d570 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1d580 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1d590 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1d5a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1d5b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1d5c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1d5d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1d5e0 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f  OpenSession)(CK_
1d5f0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
1d600 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20  CK_FLAGS flags, 
1d610 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
1d620 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54  lication, CK_NOT
1d630 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53  IFY notify, CK_S
1d640 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54  ESSION_HANDLE_PT
1d650 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  R phSession) {..
1d660 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1d670 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
1d680 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64  tval;..int found
1d690 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09  _session = 0;...
1d6a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d6b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1d6c0 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43  ..if ((flags & C
1d6d0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
1d6e0 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c  N) != CKF_SERIAL
1d6f0 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65  _SESSION) {...re
1d700 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1d710 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55  _PARALLEL_NOT_SU
1d720 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69  PPORTED);..}...i
1d730 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1d740 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1d750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d760 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1d770 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1d780 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1d790 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1d7a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
1d7b0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
1d7c0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
1d7d0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1d7e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1d7f0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
1d800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d810 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1d820 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1d830 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
1d840 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
1d850 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
1d860 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1d870 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1d880 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1d890 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1d8a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d8b0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1d8c0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1d8d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d8e0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1d8f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d900 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d910 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1d920 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1d930 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
1d940 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d950 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d960 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1d970 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1d980 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
1d990 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
1d9a0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1d9b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1d9c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d9d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1d9e0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1d9f0 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
1da00 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20  hat the card is 
1da10 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20  actually in the 
1da20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58  slot. */../* XXX
1da30 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  : Check to make 
1da40 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20  sure this is in 
1da50 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63  the PKCS#11 spec
1da60 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66  ification */..if
1da70 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
1da80 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
1da90 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
1daa0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
1dab0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
1dac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dad0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61  INTF("Error.  Ca
1dae0 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20  rd not present. 
1daf0 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44   Returning CKR_D
1db00 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b  EVICE_REMOVED");
1db10 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1db20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1db30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1db40 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45  rn(CKR_DEVICE_RE
1db50 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  MOVED);..}...for
1db60 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c   (idx = 1; idx <
1db70 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1db80 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1db90 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1dba0 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
1dbb0 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  {...if (!cackey_
1dbc0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
1dbd0 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64  tive) {....found
1dbe0 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09  _session = 1;...
1dbf0 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69  ..*phSession = i
1dc00 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  dx;.....cackey_s
1dc10 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1dc20 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  ive = 1;....cack
1dc30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1dc40 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44  .slotID = slotID
1dc50 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
1dc60 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20  ions[idx].state 
1dc70 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f  = CKS_RO_PUBLIC_
1dc80 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b  SESSION;....cack
1dc90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
1dca0 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  .flags = flags;.
1dcb0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1dcc0 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65  ns[idx].ulDevice
1dcd0 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61  Error = 0;....ca
1dce0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1dcf0 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20  x].pApplication 
1dd00 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a  = pApplication;.
1dd10 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1dd20 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d  ns[idx].Notify =
1dd30 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63   notify;.....cac
1dd40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1dd50 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ].identities = N
1dd60 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ULL;....cackey_s
1dd70 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
1dd80 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
1dd90 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
1dda0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72  ssions[idx].sear
1ddb0 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  ch_active = 0;..
1ddc0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1ddd0 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74  ns[idx].sign_act
1dde0 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
1ddf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1de00 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
1de10 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
1de20 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
1de30 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
1de40 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
1de50 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
1de60 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
1de70 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1de80 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1de90 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1dea0 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
1deb0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1dec0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ded0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1dee0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1def0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1df00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1df10 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1df20 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1df30 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1df40 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1df50 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29  (!found_session)
1df60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1df70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1df80 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  ing CKR_SESSION_
1df90 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52  COUNT (%i)", CKR
1dfa0 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
1dfb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1dfc0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09  ESSION_COUNT);..
1dfd0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1dfe0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1dff0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1e000 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1e010 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1e020 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1e030 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
1e040 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53  Session)(CK_SESS
1e050 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1e060 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
1e070 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1e080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e090 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e0a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1e0b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1e0c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e0d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1e0e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1e0f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1e100 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1e110 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1e120 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1e130 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1e140 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1e150 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1e160 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1e170 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1e180 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e190 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1e1a0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1e1b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1e1c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1e1d0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1e1e0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e1f0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1e200 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e210 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e220 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e240 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1e250 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e260 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e270 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1e280 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1e290 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1e2a0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1e2b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1e2c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1e2d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e2e0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1e2f0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1e300 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1e310 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1e320 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1e330 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1e340 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1e350 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66  e = 0;..cackey_f
1e360 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63  ree_identities(c
1e370 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e380 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1e390 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ies, cackey_sess
1e3a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1e3b0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1e3c0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1e3d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1e3e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1e3f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1e400 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1e410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e430 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1e440 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e450 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1e460 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1e470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1e480 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1e490 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1e4a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1e4b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1e4c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1e4d0 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
1e4e0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1e4f0 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  tID) {..uint32_t
1e500 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
1e510 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1e520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e530 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e540 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e550 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e570 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e580 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e590 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e5a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e5b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1e5c0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1e5d0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1e5e0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1e5f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1e600 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1e610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e620 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1e630 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1e640 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1e650 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1e660 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1e670 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1e680 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1e690 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1e6a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1e6b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e6c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e6d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e6e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e6f0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1e700 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e710 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e720 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1e730 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1e740 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1e750 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e760 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e770 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1e780 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1e790 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1e7a0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1e7b0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1e7c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1e7d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1e7e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1e7f0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1e800 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1e810 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1e820 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1e830 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1e840 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
1e850 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
1e860 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1e870 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
1e880 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1e890 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20  ons[idx].slotID 
1e8a0 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09  != slotID) {....
1e8b0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
1e8c0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1e8d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1e8e0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c  iglock);....C_Cl
1e8f0 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
1e900 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1e910 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1e920 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  lock);...}..}...
1e930 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1e940 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1e950 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1e960 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1e970 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1e980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e990 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1e9a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1e9b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e9c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1e9d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e9e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e9f0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1ea00 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1ea10 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1ea20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1ea30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
1ea40 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53  essionInfo)(CK_S
1ea50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1ea60 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49  ession, CK_SESSI
1ea70 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  ON_INFO_PTR pInf
1ea80 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  o) {..int mutex_
1ea90 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1eaa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1eab0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1eac0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
1ead0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1eae0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1eaf0 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
1eb00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1eb10 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1eb20 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1eb30 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1eb40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eb50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1eb60 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1eb70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1eb80 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1eb90 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1eba0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1ebb0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1ebc0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1ebd0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1ebe0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1ebf0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1ec00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ec10 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1ec20 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1ec30 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ec40 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ec50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1ec60 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1ec70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1ec80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1ec90 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1eca0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1ecb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ecc0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1ecd0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1ece0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1ecf0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1ed00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1ed10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ed20 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1ed30 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1ed40 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1ed50 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1ed60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ed70 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1ed80 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1ed90 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1eda0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1edb0 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c  ;..}...pInfo->sl
1edc0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
1edd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ede0 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d  .slotID;..pInfo-
1edf0 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f  >state = cackey_
1ee00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ee10 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f  n].state;..pInfo
1ee20 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79  ->flags = cackey
1ee30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ee40 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66  on].flags;..pInf
1ee50 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  o->ulDeviceError
1ee60 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1ee70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44  ns[hSession].ulD
1ee80 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75  eviceError;...mu
1ee90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1eea0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1eeb0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1eec0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1eed0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1eee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eef0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1ef00 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1ef10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1ef20 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1ef30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ef40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1ef50 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1ef60 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1ef70 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1ef80 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1ef90 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65  (CK_RV, C_GetOpe
1efa0 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f  rationState)(CK_
1efb0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1efc0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1efd0 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53  _PTR pOperationS
1efe0 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  tate, CK_ULONG_P
1eff0 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53  TR pulOperationS
1f000 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tateLen) {..CACK
1f010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f020 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1f030 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1f040 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1f050 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f060 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1f070 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1f080 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1f090 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1f0a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1f0b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1f0c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1f0d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1f0e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1f0f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f100 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1f110 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1f120 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1f130 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1f140 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
1f150 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
1f160 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f170 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1f180 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
1f190 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
1f1a0 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61  G ulOperationSta
1f1b0 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  teLen, CK_OBJECT
1f1c0 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74  _HANDLE hEncrypt
1f1d0 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ionKey, CK_OBJEC
1f1e0 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e  T_HANDLE hAuthen
1f1f0 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09  ticationKey) {..
1f200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f210 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f220 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f230 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f250 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f260 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f270 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f280 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f290 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f2a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f2b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f2c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f2d0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1f2e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f2f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1f300 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f310 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f320 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1f330 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f340 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49  _Login)(CK_SESSI
1f350 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1f360 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45  on, CK_USER_TYPE
1f370 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54   userType, CK_UT
1f380 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
1f390 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
1f3a0 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  en) {..CK_SLOT_I
1f3b0 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
1f3c0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
1f3d0 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
1f3e0 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65  g;..int login_re
1f3f0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
1f400 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1f410 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1f420 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1f430 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f440 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f450 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1f460 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f470 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1f480 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f490 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1f4a0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1f4b0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1f4c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1f4d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1f4e0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1f4f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f500 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1f510 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1f520 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1f530 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1f540 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1f550 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65  }...if (userType
1f560 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a   != CKU_USER) {.
1f570 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f580 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57  RINTF("Error.  W
1f590 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55  e only support U
1f5a0 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20  SER mode, asked 
1f5b0 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20  for %lu mode.", 
1f5c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1f5d0 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74  userType)....ret
1f5e0 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50  urn(CKR_USER_TYP
1f5f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1f600 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1f610 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1f620 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f630 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1f640 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1f650 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f660 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1f670 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1f680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1f690 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1f6a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1f6b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f6c0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1f6d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1f6e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f6f0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1f700 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f710 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1f720 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1f730 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1f740 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1f750 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
1f760 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f770 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1f780 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
1f790 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
1f7a0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1f7b0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1f7c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1f7d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f7e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f7f0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1f800 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1f810 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
1f820 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
1f830 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f840 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f850 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1f860 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
1f870 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
1f880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f890 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1f8a0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1f8b0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
1f8c0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
1f8d0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
1f8e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1f8f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f900 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
1f910 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1f920 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72  R);..}...login_r
1f930 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  et = cackey_logi
1f940 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  n(&cackey_slots[
1f950 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75  slotID], pPin, u
1f960 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f  lPinLen, &tries_
1f970 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20  remaining);..if 
1f980 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41  (login_ret != CA
1f990 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
1f9a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1f9b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1f9c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28  iglock);....if (
1f9d0 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
1f9e0 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
1f9f0 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
1fa00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fa10 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f  or.  Token is lo
1fa20 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63  cked.");.....cac
1fa30 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1fa40 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
1fa50 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f   CKF_USER_PIN_LO
1fa60 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e  CKED;.....return
1fa70 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
1fa80 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c  ;...} else if (l
1fa90 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
1faa0 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
1fab0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1fac0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fad0 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e  r.  Invalid PIN.
1fae0 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
1faf0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1fb00 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
1fb10 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
1fb20 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  OW;.....if (trie
1fb30 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31  s_remaining == 1
1fb40 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
1fb50 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1fb60 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
1fb70 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
1fb80 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  RY;....}.....ret
1fb90 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
1fba0 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43  RRECT);...}....C
1fbb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fbc0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e  TF("Error.  Unkn
1fbd0 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e  own error return
1fbe0 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c  ed from cackey_l
1fbf0 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f  ogin() (%i)", lo
1fc00 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  gin_ret);....ret
1fc10 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1fc20 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63  ERROR);..}...cac
1fc30 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1fc40 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d  ].token_flags &=
1fc50 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   ~(CKF_USER_PIN_
1fc60 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45  LOCKED | CKF_USE
1fc70 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20  R_PIN_COUNT_LOW 
1fc80 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  | CKF_LOGIN_REQU
1fc90 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f  IRED | CKF_USER_
1fca0 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a  PIN_FINAL_TRY);.
1fcb0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1fcc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
1fcd0 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f  e = CKS_RO_USER_
1fce0 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74  FUNCTIONS;...mut
1fcf0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1fd00 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1fd10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1fd20 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1fd30 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1fd40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fd50 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1fd60 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1fd70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1fd80 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1fd90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fda0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1fdb0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1fdc0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1fdd0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1fde0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1fdf0 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29  CK_RV, C_Logout)
1fe00 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1fe10 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
1fe20 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1fe30 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  D;..int mutex_re
1fe40 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
1fe50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1fe60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1fe70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1fe80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1fe90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fea0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1feb0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1fec0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1fed0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1fee0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1fef0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1ff00 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1ff10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1ff20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1ff30 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
1ff40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ff50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ff60 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
1ff70 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
1ff80 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1ff90 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1ffa0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1ffb0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1ffc0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1ffd0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1ffe0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1fff0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20000 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20010 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
20020 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20030 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20040 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
20050 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20060 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
20070 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20080 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20090 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
200a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
200b0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
200c0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
200d0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
200e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
200f0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
20100 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
20110 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
20120 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
20130 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
20140 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
20150 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
20160 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
20170 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
20180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20190 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
201a0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
201b0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
201c0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
201d0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
201e0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
201f0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
20200 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
20210 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
20220 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20230 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20240 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
20250 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
20260 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
20270 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
20280 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
20290 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
202a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
202b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
202c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
202d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
202e0 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d  Session].state =
202f0 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
20300 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f  ESSION;..cackey_
20310 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
20320 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
20330 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
20340 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
20350 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
20360 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20370 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20380 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
203a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
203b0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
203c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
203d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
203e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
203f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20400 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20410 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
20420 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
20430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
20440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72  TION(CK_RV, C_Cr
20450 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53  eateObject)(CK_S
20460 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
20470 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49  ession, CK_ATTRI
20480 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
20490 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
204a0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
204b0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a  HANDLE_PTR phObj
204c0 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ect) {..CACKEY_D
204d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
204e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
204f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20500 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20510 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20520 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20530 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20540 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20550 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20560 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
20570 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20580 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
20590 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
205a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
205b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
205c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
205d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
205e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
205f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20600 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a  CK_RV, C_CopyObj
20610 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
20620 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20630 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
20640 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
20650 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
20660 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
20670 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
20680 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
20690 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41  NewObject) {..CA
206a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
206b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
206c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
206d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
206e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
206f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20700 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20710 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20720 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20730 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
20740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20750 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20760 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20770 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20780 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20790 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
207a0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
207b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
207c0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
207d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
207e0 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b  estroyObject)(CK
207f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
20800 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
20810 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
20820 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
20830 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
20840 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
20850 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
20860 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20870 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20880 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
20890 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
208a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
208b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
208c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
208d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
208e0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
208f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
20900 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
20910 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20920 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20930 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20940 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
20950 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20960 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63  K_RV, C_GetObjec
20970 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f  tSize)(CK_SESSIO
20980 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20990 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
209a0 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
209b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a  ULONG_PTR pulSiz
209c0 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  e) {..CACKEY_DEB
209d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
209e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
209f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
20a00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20a10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20a20 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20a30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20a40 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20a50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20a60 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20a70 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20a80 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
20a90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
20aa0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
20ab0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
20ac0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
20ad0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20ae0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
20af0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
20b00 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62  _RV, C_GetAttrib
20b10 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53  uteValue)(CK_SES
20b20 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
20b30 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
20b40 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
20b50 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
20b60 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
20b70 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
20b80 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
20b90 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63  urr_attr;..struc
20ba0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
20bb0 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e  y *identity;..un
20bc0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
20bd0 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69  tity_idx, attr_i
20be0 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64  dx, sess_attr_id
20bf0 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74  x, num_ids;..int
20c00 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
20c10 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
20c20 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f  KR_OK;..CK_VOID_
20c30 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f  PTR pValue;..CK_
20c40 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e  ULONG ulValueLen
20c50 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
20c60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20c70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20c80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20c90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20ca0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20cb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20cc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20cd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20ce0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20cf0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
20d00 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
20d10 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
20d20 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
20d30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
20d40 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
20d50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20d60 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
20d70 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
20d80 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
20d90 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
20da0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
20db0 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d  ...if (hObject =
20dc0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20de0 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e  ror.  Object han
20df0 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
20e00 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
20e10 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  (CKR_OBJECT_HAND
20e20 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
20e30 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d  ..if (ulCount ==
20e40 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
20e50 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72   circuit, if zer
20e60 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73  o objects were s
20e70 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20  pecified return 
20e80 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64  zero items immed
20e90 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b  iately */...CACK
20ea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20eb0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20ec0 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
20ed0 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
20ee0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20ef0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  OK);..}...if (pT
20f00 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29  emplate == NULL)
20f10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20f20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20f30 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e    pTemplate is N
20f40 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
20f50 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
20f60 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74  BAD);..}...ident
20f70 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63  ity_idx = hObjec
20f80 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72  t - 1;...mutex_r
20f90 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20fa0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
20fb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20fc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20fd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20ff0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
21000 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21010 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21020 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
21030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21040 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
21050 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
21060 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21070 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
21080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21090 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
210a0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
210b0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
210c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
210d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e  INVALID);..}...n
210e0 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f  um_ids = cackey_
210f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21100 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
21110 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  unt;...if (ident
21120 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69  ity_idx >= num_i
21130 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ds) {...cackey_m
21140 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21150 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21170 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a  NTF("Error.  Obj
21180 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ect handle out o
21190 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69  f range.  identi
211a0 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75  ty_idx = %lu, nu
211b0 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28  m_ids = %lu.", (
211c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
211d0 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e  dentity_idx, (un
211e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d  signed long) num
211f0 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ids);....return
21200 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  (CKR_OBJECT_HAND
21210 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
21220 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  ..identity = &ca
21230 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21240 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
21250 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d  es[identity_idx]
21260 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64  ;...for (attr_id
21270 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20  x = 0; attr_idx 
21280 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f  < ulCount; attr_
21290 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f  idx++) {...curr_
212a0 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74  attr = &pTemplat
212b0 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09  e[attr_idx];....
212c0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
212d0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
212e0 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43  K_LONG) -1;....C
212f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21300 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TF("Looking for 
21310 61 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c  attribute 0x%08l
21320 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29  x (identity:%lu)
21330 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
21340 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
21350 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65  ->type, (unsigne
21360 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
21370 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73  _idx);....for (s
21380 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
21390 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
213a0 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  < identity->attr
213b0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
213c0 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
213d0 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79  ....if (identity
213e0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
213f0 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65  s_attr_idx].type
21400 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74   == curr_attr->t
21410 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ype) {.....CACKE
21420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21430 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70   ... found it, p
21440 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61  Value = %p, ulVa
21450 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69  lueLen = %lu", i
21460 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
21470 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
21480 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74  x].pValue, ident
21490 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
214a0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
214b0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09  lValueLen);.....
214c0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64  .....pValue = id
214d0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
214e0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
214f0 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c  ].pValue;.....ul
21500 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74  ValueLen = ident
21510 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
21520 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
21530 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a  lValueLen;....}.
21540 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f  ..}....if (curr_
21550 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20  attr->pValue && 
21560 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20  pValue) {....if 
21570 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61  (curr_attr->ulVa
21580 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75  lueLen >= ulValu
21590 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63  eLen) {.....memc
215a0 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  py(curr_attr->pV
215b0 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c  alue, pValue, ul
215c0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20  ValueLen);....} 
215d0 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c  else {.....ulVal
215e0 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
215f0 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61  ) -1;......retva
21600 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
21610 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09  OO_SMALL;....}..
21620 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d  .}....curr_attr-
21630 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c  >ulValueLen = ul
21640 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d  ValueLen;..}...m
21650 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21660 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21670 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21680 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
21690 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
216a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
216b0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
216c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
216d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
216e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
216f0 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d  }...if (retval =
21700 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f  = CKR_ATTRIBUTE_
21710 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a  TYPE_INVALID) {.
21720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21730 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21740 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
21750 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29  YPE_INVALID (%i)
21760 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
21770 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
21780 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46  tval == CKR_BUFF
21790 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
217a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
217b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
217c0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
217d0 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e  SMALL (%i)", (in
217e0 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
217f0 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d  lse if (retval =
21800 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
21810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21820 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21830 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29  _OK (%i)", (int)
21840 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73   retval);..} els
21850 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  e {...CACKEY_DEB
21860 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21870 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
21880 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65  retval);..}...re
21890 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
218a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
218b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
218c0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
218d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
218e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
218f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
21900 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
21910 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
21920 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
21930 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  nt) {..CACKEY_DE
21940 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
21950 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
21960 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21970 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21990 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
219a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
219b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
219c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
219d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
219e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
219f0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
21a00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
21a10 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
21a20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21a30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
21a40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21a50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
21a60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
21a70 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
21a80 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ctsInit)(CK_SESS
21a90 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21aa0 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ion, CK_ATTRIBUT
21ab0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
21ac0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
21ad0 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  t) {..CK_SLOT_ID
21ae0 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f   slotID;..CK_ULO
21af0 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  NG idx;..int mut
21b00 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
21b10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21b20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21b30 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21b40 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21b50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21b60 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21b70 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21b80 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21b90 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21ba0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
21bb0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
21bc0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
21bd0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
21be0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
21bf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
21c00 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
21c10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21c20 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
21c30 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
21c40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
21c50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
21c60 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21c70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21c80 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21c90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21ca0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21cb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21cd0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
21ce0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21cf0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21d00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21d10 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
21d20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
21d30 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
21d40 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21d50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21d70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
21d80 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
21d90 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21da0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21db0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
21dc0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
21dd0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21de0 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
21df0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21e00 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21e10 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21e20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21e30 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61  Error.  Search a
21e40 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29  lready active.")
21e50 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
21e60 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
21e70 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  VE);..}...slotID
21e80 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
21e90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
21ea0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
21eb0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21ec0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21ed0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21ee0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21ef0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21f00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21f10 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21f20 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21f30 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21f40 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21f50 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21f60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21f70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21f80 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21f90 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
21fa0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21fb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21fc0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21fd0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
21fe0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
21ff0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
22000 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
22010 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22020 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
22030 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22040 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
22050 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22060 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29  tID].slot_reset)
22070 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22080 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c  G_PRINTF("The sl
22090 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65  ot has been rese
220a0 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20  t since we last 
220b0 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74  looked for ident
220c0 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e  ities -- rescann
220d0 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61  ing");....if (ca
220e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
220f0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
22100 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
22110 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
22120 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
22130 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22140 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
22150 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22160 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
22170 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63  es_count);.....c
22180 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22190 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
221a0 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63  ies = NULL;....c
221b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
221c0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
221d0 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ies_count = 0;..
221e0 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
221f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
22200 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  abel != NULL) {.
22210 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
22220 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
22230 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  el);....cackey_s
22240 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
22250 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  el = NULL;...}..
22260 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
22270 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79  ot_reset(&cackey
22280 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b  _slots[slotID]);
22290 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
222a0 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73  slotID].slot_res
222b0 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  et = 0;..}...if 
222c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
222d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
222e0 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ities == NULL) {
222f0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
22300 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
22310 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
22320 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
22330 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
22340 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f  lotID], &cackey_
22350 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22360 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
22370 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  unt);..}...if (p
22380 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c  Template != NULL
22390 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e  ) {...if (ulCoun
223a0 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63  t != 0) {....cac
223b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
223c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
223d0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f  ery_count = ulCo
223e0 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  unt;....cackey_s
223f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22400 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d  ].search_query =
22410 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20   malloc(ulCount 
22420 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c  * sizeof(*pTempl
22430 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70  ate));.....memcp
22440 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
22450 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
22460 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c  ch_query, pTempl
22470 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73  ate, ulCount * s
22480 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65  izeof(*pTemplate
22490 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20  ));....for (idx 
224a0 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75  = 0; idx < ulCou
224b0 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09  nt; idx++) {....
224c0 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69  .if (pTemplate[i
224d0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  dx].ulValueLen =
224e0 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b  = 0) {......cack
224f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22500 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
22510 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d  ry[idx].pValue =
22520 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e   NULL;.......con
22530 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
22540 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
22550 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
22560 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
22570 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54  alue = malloc(pT
22580 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56  emplate[idx].ulV
22590 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69  alueLen);......i
225a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
225b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
225c0 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
225d0 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65  Value) {......me
225e0 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
225f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22600 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
22610 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61  .pValue, pTempla
22620 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  te[idx].pValue, 
22630 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
22640 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09  lValueLen);.....
22650 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  }....}...} else 
22660 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
22670 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22680 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
22690 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  t = 0;....cackey
226a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
226b0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
226c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20   = NULL;...}..} 
226d0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43  else {...if (ulC
226e0 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
226f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22700 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22710 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ck);.....CACKEY_
22720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22730 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65  ror.  Search que
22740 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ry specified as 
22750 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72  NULL, but number
22760 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20   of query terms 
22770 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
22780 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72   0.");.....retur
22790 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
227a0 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  BAD);...}....cac
227b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
227c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
227d0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ery_count = 0;..
227e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
227f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
22800 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a  h_query = NULL;.
22810 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
22820 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22830 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31  earch_active = 1
22840 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
22850 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
22860 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b  rch_curr_id = 0;
22870 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
22880 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
22890 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
228a0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
228b0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
228c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
228d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
228e0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
228f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22900 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22910 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
22920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
22930 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
22940 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
22950 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
22960 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  }..static int ca
22970 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70  ckey_pkcs11_comp
22980 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 43  are_attributes(C
22990 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20  K_ATTRIBUTE *a, 
229a0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29  CK_ATTRIBUTE *b)
229b0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
229c0 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61  r *smallbuf, *la
229d0 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20  rgebuf;..size_t 
229e0 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61  smallbuf_len, la
229f0 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66  rgebuf_len;...if
22a00 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e   (a->type != b->
22a10 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e  type) {...return
22a20 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  (0);..}...CACKEY
22a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
22a40 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74     ... found mat
22a50 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29  ching type ...")
22a60 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22a70 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e  _PRINTBUF("    .
22a80 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20  .. our value:", 
22a90 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c  a->pValue, a->ul
22aa0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20  ValueLen);...if 
22ab0 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55  (b->pValue == NU
22ac0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
22ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
22ae0 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69      ... found wi
22af0 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a  ldcard match");.
22b00 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
22b10 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65  ...if (a->pValue
22b20 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
22b30 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69  turn(0);..}.. .i
22b40 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  f (b->ulValueLen
22b50 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65   == a->ulValueLe
22b60 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70  n && memcmp(a->p
22b70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65  Value, b->pValue
22b80 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  , b->ulValueLen)
22b90 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
22ba0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22bb0 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
22bc0 20 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a   exact match");.
22bd0 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d  ...return(1);..}
22be0 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79  ...switch (a->ty
22bf0 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41  pe) {...case CKA
22c00 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20  _MODULUS:....if 
22c10 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  (a->ulValueLen =
22c20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  = b->ulValueLen)
22c30 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
22c40 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c  .}.....if (a->ul
22c50 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c  ValueLen > b->ul
22c60 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09  ValueLen) {.....
22c70 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56  smallbuf = b->pV
22c80 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62  alue;.....smallb
22c90 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61  uf_len = b->ulVa
22ca0 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72  lueLen;......lar
22cb0 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75  gebuf = a->pValu
22cc0 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f  e;.....largebuf_
22cd0 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65  len = a->ulValue
22ce0 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  Len;....} else {
22cf0 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20  .....smallbuf = 
22d00 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73  a->pValue;.....s
22d10 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d  mallbuf_len = a-
22d20 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09  >ulValueLen;....
22d30 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e  ..largebuf = b->
22d40 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67  pValue;.....larg
22d50 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c  ebuf_len = b->ul
22d60 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a  ValueLen;....}..
22d70 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62  ...for (; largeb
22d80 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62  uf_len != smallb
22d90 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66  uf_len; largebuf
22da0 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d  ++,largebuf_len-
22db0 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72  -) {.....if (lar
22dc0 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b  gebuf[0] != 0) {
22dd0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
22de0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
22df0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20  largebuf_len != 
22e00 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a  smallbuf_len) {.
22e10 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
22e20 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c  ....if (memcmp(l
22e30 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75  argebuf, smallbu
22e40 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29  f, smallbuf_len)
22e50 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   == 0) {.....CAC
22e60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22e70 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
22e80 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d  nd approximate m
22e90 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74  atch");......ret
22ea0 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09  urn(1);....}....
22eb0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74  .break;..}...ret
22ec0 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  urn(0);.}..CK_DE
22ed0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22ee0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
22ef0 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ts)(CK_SESSION_H
22f00 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
22f10 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
22f20 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43  _PTR phObject, C
22f30 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a  K_ULONG ulMaxObj
22f40 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f  ectCount, CK_ULO
22f50 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74  NG_PTR pulObject
22f60 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74  Count) {..struct
22f70 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
22f80 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41   *curr_id;..CK_A
22f90 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
22fa0 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63  ttr;..CK_ULONG c
22fb0 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72  urr_id_idx, curr
22fc0 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72  _out_id_idx, cur
22fd0 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73  r_attr_idx, sess
22fe0 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55  _attr_idx;..CK_U
22ff0 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75  LONG matched_cou
23000 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64  nt, prev_matched
23010 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74  _count;..int mut
23020 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65  ex_retval;.#ifde
23030 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53  f CACKEY_DEBUG_S
23040 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a  EARCH_SPEEDTEST.
23050 09 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20  .struct timeval 
23060 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e  start, end;..uin
23070 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c  t64_t start_int,
23080 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66   end_int;.#endif
23090 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
230a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
230b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
230c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
230d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
230e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
230f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
23100 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23110 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
23120 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
23130 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f  .if (pulObjectCo
23140 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
23150 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23160 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75  INTF("Error.  pu
23170 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20  lObjectCount is 
23180 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
23190 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
231a0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
231b0 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
231c0 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43   && ulMaxObjectC
231d0 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  ount == 0) {.../
231e0 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c  * Short circuit,
231f0 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73   if zero objects
23200 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20   were specified 
23210 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d  return zero item
23220 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f  s immediately */
23230 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  ...*pulObjectCou
23240 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45  nt = 0;....CACKE
23250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23260 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
23270 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
23280 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
23290 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
232a0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f  K);..}...if (phO
232b0 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  bject == NULL) {
232c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
232d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
232e0 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c  phObject is NULL
232f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23300 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
23310 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61  );..}...if (ulMa
23320 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20  xObjectCount == 
23330 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23340 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23350 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62  r.  Maximum numb
23360 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70  er of objects sp
23370 65 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e  ecified as zero.
23380 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23390 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
233a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
233b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
233c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
233d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
233e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
233f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
23400 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23410 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23420 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
23430 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
23440 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
23450 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
23460 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
23470 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
23480 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
23490 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
234a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
234b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
234c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
234d0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
234e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
234f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23500 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
23510 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23520 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
23530 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
23540 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23550 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
23560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23570 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
23580 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
23590 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
235a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
235b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
235c0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
235d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
235e0 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
235f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23600 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23610 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
23620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23630 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20  or.  Search not 
23640 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
23650 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
23660 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
23670 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65  IZED);..}..#ifde
23680 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53  f CACKEY_DEBUG_S
23690 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a  EARCH_SPEEDTEST.
236a0 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73  .gettimeofday(&s
236b0 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  tart, NULL);.#en
236c0 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69  dif...curr_out_i
236d0 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20  d_idx = 0;..for 
236e0 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63  (curr_id_idx = c
236f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23700 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
23710 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64  curr_id; curr_id
23720 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65  _idx < cackey_se
23730 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23740 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
23750 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  t && ulMaxObject
23760 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69  Count; curr_id_i
23770 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69  dx++) {...curr_i
23780 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  d = &cackey_sess
23790 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
237a0 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69  dentities[curr_i
237b0 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45  d_idx];....CACKE
237c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
237d0 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74  Processing ident
237e0 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67  ity:%lu", (unsig
237f0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69  ned long) curr_i
23800 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68  d_idx);....match
23810 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  ed_count = 0;...
23820 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f  .for (curr_attr_
23830 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74  idx = 0; curr_at
23840 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  tr_idx < cackey_
23850 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23860 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
23870 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72  count; curr_attr
23880 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65  _idx++) {....pre
23890 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  v_matched_count 
238a0 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b  = matched_count;
238b0 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d  .....curr_attr =
238c0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
238d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
238e0 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74  ch_query[curr_at
238f0 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43  tr_idx];.....CAC
23900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23910 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72  ("  Checking for
23920 20 61 74 74 72 69 62 75 74 65 20 25 73 20 28 30   attribute %s (0
23930 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74  x%08lx) in ident
23940 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b  ity:%i...", CACK
23950 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54  EY_DEBUG_FUNC_AT
23960 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63  TRIBUTE_TO_STR(c
23970 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c  urr_attr->type),
23980 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
23990 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
239a0 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
239b0 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  idx);....CACKEY_
239c0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
239d0 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e      Value lookin
239e0 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74  g for:", curr_at
239f0 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72  tr->pValue, curr
23a00 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
23a10 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73  n);.....for (ses
23a20 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  s_attr_idx = 0; 
23a30 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20  sess_attr_idx < 
23a40 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
23a50 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f  tes_count; sess_
23a60 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
23a70 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63  ..if (cackey_pkc
23a80 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72  s11_compare_attr
23a90 69 62 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d  ibutes(&curr_id-
23aa0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
23ab0 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72  _attr_idx], curr
23ac0 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d  _attr)) {......m
23ad0 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a  atched_count++;.
23ae0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
23af0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49  .}....}...../* I
23b00 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65 20  f the attribute 
23b10 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74  could not be mat
23b20 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79  ched, do not try
23b30 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69   to match additi
23b40 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73 20  onal attributes 
23b50 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d  */....if (prev_m
23b60 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20  atched_count == 
23b70 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b  matched_count) {
23b80 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
23b90 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63  ...}....if (matc
23ba0 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63  hed_count == cac
23bb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23bc0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
23bd0 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  ery_count) {....
23be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23bf0 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25  NTF("  ... All %
23c00 69 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65  i attributes che
23c10 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20  cked for found, 
23c20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  adding identity:
23c30 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c  %i to returned l
23c40 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b  ist", (int) cack
23c50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23c60 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
23c70 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ry_count, (int) 
23c80 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09  curr_id_idx);...
23c90 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f  ..phObject[curr_
23ca0 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75  out_id_idx] = cu
23cb0 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a  rr_id_idx + 1;..
23cc0 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  ...ulMaxObjectCo
23cd0 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f  unt--;.....curr_
23ce0 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  out_id_idx++;...
23cf0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
23d00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23d10 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25  "  ... Not all %
23d20 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69  i (only found %i
23d30 29 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65  ) attributes che
23d40 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20  cked for found, 
23d50 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74  not adding ident
23d60 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63  ity:%i", (int) c
23d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23d80 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
23d90 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e  query_count, (in
23da0 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  t) matched_count
23db0 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
23dc0 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61  idx);...}..}..ca
23dd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23de0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
23df0 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64  urr_id = curr_id
23e00 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63  _idx;..*pulObjec
23e10 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75  tCount = curr_ou
23e20 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65  t_id_idx;..#ifde
23e30 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53  f CACKEY_DEBUG_S
23e40 45 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a  EARCH_SPEEDTEST.
23e50 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65  .gettimeofday(&e
23e60 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72  nd, NULL);..star
23e70 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74  t_int = (start.t
23e80 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29  v_sec * 1000000)
23e90 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63   + start.tv_usec
23ea0 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e  ;..end_int = (en
23eb0 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30  d.tv_sec * 10000
23ec0 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65  00) + end.tv_use
23ed0 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65  c;..fprintf(stde
23ee0 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b  rr, "Search took
23ef0 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64   %lu microsecond
23f00 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  s\n", (unsigned 
23f10 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d  long) (end_int -
23f20 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65   start_int));.#e
23f30 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ndif...mutex_ret
23f40 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
23f50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23f60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
23f70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23f80 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23f90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23fa0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
23fb0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23fc0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23fd0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
23fe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23ff0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
24000 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65  K (%i), num obje
24010 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f  cts = %lu", CKR_
24020 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  OK, *pulObjectCo
24030 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
24040 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
24050 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24060 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
24070 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  tsFinal)(CK_SESS
24080 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24090 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47  ion) {..CK_ULONG
240a0 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
240b0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
240c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
240d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
240e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
240f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24110 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24120 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24130 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24140 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24150 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
24160 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
24170 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
24180 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
24190 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
241a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
241b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
241c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
241d0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
241e0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
241f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
24200 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
24210 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
24220 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
24230 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
24240 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
24250 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
24260 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24280 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
24290 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
242a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
242b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
242c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
242d0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
242e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
242f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24300 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
24310 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24320 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
24330 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
24340 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
24350 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
24360 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
24370 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
24380 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24390 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
243a0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
243b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
243c0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
243d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
243e0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
243f0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
24400 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
24410 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
24420 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61  ALIZED);..}...ca
24430 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24440 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
24450 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72  ctive = 0;...for
24460 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
24470 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
24480 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
24490 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69  h_query_count; i
244a0 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
244b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
244c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
244d0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
244e0 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
244f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24500 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
24510 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b  ry[idx].pValue);
24520 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ...}..}...if (ca
24530 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24540 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
24550 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63  uery) {...free(c
24560 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24570 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
24580 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74  query);..}...mut
24590 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
245a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
245b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
245c0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
245d0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
245e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
245f0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
24600 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
24610 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24620 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
24630 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24640 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24650 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
24660 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
24670 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
24680 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
24690 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
246a0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
246b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
246c0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
246d0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
246e0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
246f0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
24700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24710 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24720 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24730 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24740 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24750 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24760 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24770 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24780 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24790 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
247a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
247b0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
247c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
247d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
247e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
247f0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
24800 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24810 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
24820 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
24830 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
24840 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
24850 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
24860 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
24870 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
24880 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
24890 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  R pEncryptedData
248a0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
248b0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
248c0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
248d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
248e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
248f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
24900 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24910 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24920 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
24930 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24940 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
24950 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
24960 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24970 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24980 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
24990 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
249a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
249b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
249c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
249d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
249e0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
249f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24a00 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55  K_RV, C_EncryptU
24a10 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
24a20 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24a30 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
24a40 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
24a50 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
24a60 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
24a70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
24a80 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
24a90 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
24aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24ab0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
24ac0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24ad0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24ae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24af0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24b00 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24b10 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24b20 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24b30 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
24b40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24b50 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
24b60 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24b70 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
24b80 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24b90 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
24ba0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24bb0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
24bc0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24bd0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
24be0 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
24bf0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24c00 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
24c10 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64  R pLastEncrypted
24c20 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
24c30 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70  TR pulLastEncryp
24c40 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
24c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24c60 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24c70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24c80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24ca0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24cb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24cc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24cd0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24ce0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
24cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24d00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24d10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24d20 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
24d30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24d40 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
24d50 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
24d60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24d70 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24d80 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24d90 44 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f  DecryptInit)(CK_
24da0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24db0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
24dc0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
24dd0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
24de0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
24df0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
24e00 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
24e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24e20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24e30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24e40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24e60 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24e70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24e80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24e90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24ea0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
24eb0 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
24ec0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
24ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24ee0 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
24ef0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
24f00 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
24f10 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
24f20 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
24f30 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
24f40 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
24f50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24f60 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
24f70 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
24f80 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
24f90 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a  CKM_RSA_PKCS");.
24fa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45  ...return(CKR_ME
24fb0 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e  CHANISM_PARAM_IN
24fc0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
24fd0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
24fe0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
24ff0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
25000 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
25010 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25020 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
25030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25040 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
25050 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
25060 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
25070 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
25080 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
25090 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
250a0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
250b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
250c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
250d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
250e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
250f0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
25100 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25110 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25120 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
25130 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
25140 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
25150 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
25160 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25170 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25180 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25190 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
251a0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
251b0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
251c0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
251d0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
251e0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
251f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25200 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
25210 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
25220 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25230 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
25240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25250 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
25260 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72  pt already in pr
25270 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09  ogress.");......
25280 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
25290 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d  TION_ACTIVE);..}
252a0 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63  ...if (hKey >= c
252b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
252c0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
252d0 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63  ies_count) {...c
252e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
252f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25300 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
25310 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25320 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f  r.  Key handle o
25330 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71  ut of range (req
25340 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20  uested key %lu, 
25350 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74  only %lu identit
25360 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22  ies available)."
25370 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25380 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65  ) hKey, (unsigne
25390 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73  d long) cackey_s
253a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
253b0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
253c0 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
253d0 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e  KR_KEY_HANDLE_IN
253e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
253f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25400 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
25410 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
25420 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25430 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
25440 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68  echanism = pMech
25450 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
25460 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
25470 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
25480 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d  rypt_mech_parm =
25490 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61   pMechanism->pPa
254a0 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79  rameter;..cackey
254b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
254c0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
254d0 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68  _parmlen = pMech
254e0 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74  anism->ulParamet
254f0 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73  erLen;..cackey_s
25500 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25510 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69  ].decrypt_identi
25520 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  ty = &cackey_ses
25530 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25540 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d  identities[hKey]
25550 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
25560 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
25570 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25580 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
25590 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
255a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
255b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
255c0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
255d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
255e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
255f0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
25600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
25610 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
25620 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
25630 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
25640 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
25650 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25660 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Decrypt)(CK_SESS
25670 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
25680 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
25690 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
256a0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
256b0 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b  yptedDataLen, CK
256c0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
256d0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
256e0 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f  lDataLen) {..CK_
256f0 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70  ULONG datalen_up
25700 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69  date, datalen_fi
25710 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72  nal;..CK_RV decr
25720 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  ypt_ret;..int mu
25730 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
25740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25750 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25760 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25770 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25790 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
257a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
257b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
257c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
257d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
257e0 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55  pulDataLen == NU
257f0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
25800 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25810 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69  or. pulDataLen i
25820 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
25830 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
25840 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61  TS_BAD);..}...da
25850 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a  talen_update = *
25860 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65  pulDataLen;...de
25870 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65  crypt_ret = C_De
25880 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73  cryptUpdate(hSes
25890 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64  sion, pEncrypted
258a0 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65  Data, ulEncrypte
258b0 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c  dDataLen, pData,
258c0 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65   &datalen_update
258d0 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
258e0 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
258f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25900 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25910 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20  DecryptUpdate() 
25920 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
25930 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
25940 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
25950 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
25960 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
25970 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  != CKR_BUFFER_TO
25980 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a  O_SMALL) {..../*
25990 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79   Terminate decry
259a0 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ption operation 
259b0 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  */.....mutex_ret
259c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
259d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
259e0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
259f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
25a00 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
25a10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25a20 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
25a30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
25a40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
25a50 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09  _ERROR);....}...
25a60 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
25a70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25a80 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
25a90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
25aa0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25ab0 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
25ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25ad0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
25ae0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
25af0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
25b00 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
25b10 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  VALID);....}....
25b20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
25b30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25b40 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
25b50 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
25b60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25b70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
25b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25b90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
25ba0 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
25bb0 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
25bc0 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
25bd0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25be0 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
25bf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25c00 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
25c10 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74  ive = 0;.....mut
25c20 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
25c30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25c40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25c50 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
25c60 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
25c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25c80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25c90 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
25ca0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
25cb0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25cc0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  );....}...}....r
25cd0 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
25ce0 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61  t);..}...if (pDa
25cf0 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d  ta) {...pData +=
25d00 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
25d10 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e  ..}..datalen_fin
25d20 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  al = *pulDataLen
25d30 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   - datalen_updat
25d40 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74  e;...decrypt_ret
25d50 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61   = C_DecryptFina
25d60 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74  l(hSession, pDat
25d70 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61  a, &datalen_fina
25d80 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74  l);..if (decrypt
25d90 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
25da0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25db0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25dc0 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20   DecryptFinal() 
25dd0 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
25de0 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
25df0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
25e00 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
25e10 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
25e20 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61  et);..}...*pulDa
25e30 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f  taLen = datalen_
25e40 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e  update + datalen
25e50 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  _final;...CACKEY
25e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
25e70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
25e80 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
25e90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
25ea0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25eb0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25ec0 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28  _DecryptUpdate)(
25ed0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
25ee0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
25ef0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
25f00 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
25f10 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
25f20 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
25f30 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
25f40 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
25f50 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
25f60 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09  TE buf[16384];..
25f70 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a  ssize_t buflen;.
25f80 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
25f90 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  ID;..CK_RV retva
25fa0 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
25fb0 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65  ERROR;..int mute
25fc0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
25fd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25fe0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25ff0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26000 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26020 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26030 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26040 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26050 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26060 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
26070 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
26080 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
26090 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
260a0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
260b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
260c0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
260d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
260e0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
260f0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
26100 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
26110 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
26120 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
26130 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
26140 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79   NULL && ulEncry
26150 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30  ptedPartLen == 0
26160 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
26170 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
26180 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70   asked to decryp
26190 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  t nothing... */.
261a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
261b0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
261c0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
261d0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
261e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
261f0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
26200 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
26210 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
26220 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26230 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63  NTF("Error. pEnc
26240 72 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55  ryptedPart is NU
26250 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70  LL, but ulEncryp
26260 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f  tedPartLen is no
26270 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  t 0.");....retur
26280 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
26290 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
262a0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
262b0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  n == 0) {...CACK
262c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
262d0 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70  "Error. ulEncryp
262e0 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c  tedPartLen is 0,
262f0 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
26300 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
26310 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
26320 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
26330 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20   (pulPartLen == 
26340 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
26350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26360 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e  rror. pulPartLen
26370 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
26380 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
26390 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
263a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
263b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
263c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
263d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
263e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
263f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26400 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
26410 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
26420 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
26430 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
26440 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
26450 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26460 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
26470 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26480 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26490 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
264a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
264b0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
264c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
264d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
264e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
264f0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
26500 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26510 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
26520 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
26530 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26540 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
26550 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26560 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
26570 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
26580 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
26590 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
265a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
265b0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
265c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
265d0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
265e0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
265f0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
26600 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
26610 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
26620 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
26630 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26640 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26650 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
26660 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
26670 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
26680 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
26690 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
266a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
266b0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
266c0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
266d0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
266e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
266f0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
26700 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
26710 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
26720 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
26730 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
26740 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26750 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26760 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
26770 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26780 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
26790 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
267a0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
267b0 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  t_mechanism) {..
267c0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
267d0 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61  CS:..../* Ask ca
267e0 72 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f  rd to decrypt */
267f0 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63  ....buflen = cac
26800 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
26810 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
26820 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
26830 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26840 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
26850 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  y, pEncryptedPar
26860 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  t, ulEncryptedPa
26870 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65  rtLen, buf, size
26880 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a  of(buf), 0, 1);.
26890 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c  ....if (buflen <
268a0 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63   0) {...../* Dec
268b0 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20  ryption failed. 
268c0 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65  */.....if (bufle
268d0 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
268e0 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a  _E_NEEDLOGIN) {.
268f0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
26900 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45  R_USER_NOT_LOGGE
26910 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65  D_IN;.....} else
26920 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43   if (buflen == C
26930 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
26940 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
26950 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45  .retval = CKR_DE
26960 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09  VICE_REMOVED;...
26970 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
26980 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
26990 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
269a0 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
269b0 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
269c0 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50   buflen) > *pulP
269d0 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29  artLen && pPart)
269e0 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
269f0 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ted data too lar
26a00 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  ge */.....retval
26a10 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
26a20 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c  O_SMALL;....} el
26a30 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61  se {.....if (pPa
26a40 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  rt) {......memcp
26a50 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75  y(pPart, buf, bu
26a60 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  flen);.....}....
26a70 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20  ..*pulPartLen = 
26a80 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
26a90 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
26aa0 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
26ab0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
26ac0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
26ad0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26ae0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
26af0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
26b00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26b10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26b20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
26b30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26b40 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26b50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
26b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26b70 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
26b80 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
26b90 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
26ba0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26bb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
26bc0 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
26bd0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26be0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
26bf0 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f  R pLastPart, CK_
26c00 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
26c10 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  tPartLen) {..int
26c20 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
26c30 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65  int terminate_de
26c40 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43  crypt = 1;...CAC
26c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26c60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
26c70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26c80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26c90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26ca0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26cb0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26cc0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26cd0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26ce0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
26cf0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
26d00 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
26d10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
26d20 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
26d30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
26d40 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
26d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26d60 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
26d70 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
26d80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26d90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
26da0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
26db0 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
26dc0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
26dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26de0 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50  "Error. pulLastP
26df0 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
26e00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26e10 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
26e20 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26e30 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26e40 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
26e50 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
26e60 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
26e70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26e80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26e90 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
26ea0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26eb0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
26ec0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
26ed0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26ee0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
26ef0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26f00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26f10 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
26f20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26f30 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
26f40 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
26f50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
26f60 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
26f70 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
26f80 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
26f90 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
26fa0 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
26fb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26fc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26fd0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
26fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26ff0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
27000 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27010 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
27020 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
27030 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  IZED);..}...*pul
27040 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b  LastPartLen = 0;
27050 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74  ...if (pLastPart
27060 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65   == NULL) {...te
27070 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
27080 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  = 0;..}...if (te
27090 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29  rminate_decrypt)
270a0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
270b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
270c0 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
270d0 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
270e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
270f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27100 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
27110 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
27120 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
27130 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27140 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
27150 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
27160 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27170 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
27180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27190 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
271a0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
271b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
271c0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
271d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
271e0 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28  , C_DigestInit)(
271f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27200 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
27210 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
27220 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b  chanism) {..CACK
27230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27240 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27250 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27260 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27280 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27290 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
272a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
272b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
272c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
272d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
272e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
272f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27300 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
27310 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27320 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
27330 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
27340 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
27350 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27360 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
27370 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  est)(CK_SESSION_
27380 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
27390 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
273a0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
273b0 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
273c0 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
273d0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
273e0 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
273f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27400 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
27410 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
27420 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
27430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27440 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27450 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27460 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27470 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27480 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
27490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
274a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
274b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
274c0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
274d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
274e0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
274f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27500 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
27510 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27520 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
27530 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
27540 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
27550 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
27560 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
27570 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
27580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27590 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
275a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
275b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
275c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
275d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
275e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
275f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27600 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27610 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
27620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27630 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
27640 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27650 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
27660 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27670 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
27680 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
27690 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
276a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
276b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
276c0 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53  _DigestKey)(CK_S
276d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
276e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
276f0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
27700 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27710 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27720 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27730 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27750 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27760 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27770 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27780 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27790 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
277a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
277b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
277c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
277d0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
277e0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
277f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
27800 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
27810 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27820 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
27830 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27840 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28   C_DigestFinal)(
27850 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27860 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
27870 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
27880 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
27890 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
278a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
278b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
278c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
278d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
278e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
278f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27900 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27910 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27920 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27930 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
27940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27950 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27960 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27970 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
27980 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27990 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
279a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
279b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
279c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
279d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
279e0 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53  SignInit)(CK_SES
279f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
27a00 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
27a10 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
27a20 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
27a30 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
27a40 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
27a50 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
27a60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27a70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
27a80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
27a90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
27aa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27ab0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27ac0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27ad0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27ae0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27af0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
27b00 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
27b10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27b20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27b30 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
27b40 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
27b50 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
27b60 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
27b70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
27b80 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
27b90 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
27ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27bb0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
27bc0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
27bd0 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
27be0 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
27bf0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
27c00 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
27c10 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
27c20 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
27c30 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
27c40 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
27c50 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
27c60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
27c70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
27c80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27c90 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
27ca0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
27cb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
27cc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
27cd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
27ce0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
27cf0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
27d00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
27d10 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
27d20 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
27d30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27d40 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
27d50 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
27d60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
27d70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
27d80 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
27d90 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
27da0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
27db0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27dc0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
27dd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27de0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
27df0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
27e00 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27e10 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27e20 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27e30 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
27e40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
27e50 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
27e60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
27e70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27e80 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
27e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27ea0 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64  or.  Sign alread
27eb0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
27ec0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
27ed0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
27ee0 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
27ef0 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
27f00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27f10 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
27f20 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
27f30 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
27f40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
27f50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27f60 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
27f70 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
27f80 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
27f90 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
27fa0 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
27fb0 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
27fc0 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
27fd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
27fe0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27ff0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
28000 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
28010 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
28020 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28030 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
28040 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
28050 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  gn_active = 1;..
28060 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
28070 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
28080 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
28090 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
280a0 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  m;...cackey_sess
280b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
280c0 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38  ign_buflen = 128
280d0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
280e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
280f0 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09  n_bufused = 0;..
28100 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28110 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
28120 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  uf = malloc(size
28130 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
28140 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
28150 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
28160 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28170 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
28180 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
28190 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e  _PRINTF("Session
281a0 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69   %lu sign_identi
281b0 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69  ty is %p (identi
281c0 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69  ty #%lu)", (unsi
281d0 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
281e0 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63  ion, (void *) &c
281f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28200 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
28210 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69  ies[hKey], (unsi
28220 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29  gned long) hKey)
28230 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
28240 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
28250 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  n_identity = &ca
28260 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28270 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
28280 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65  es[hKey];...mute
28290 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
282a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
282b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
282c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
282d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
282e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
282f0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
28300 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28310 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28320 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28330 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28340 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28350 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
28360 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
28370 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
28380 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
28390 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b  K_RV, C_Sign)(CK
283a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
283b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
283c0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
283d0 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
283e0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
283f0 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
28400 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
28410 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  reLen) {..unsign
28420 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69  ed long start_si
28430 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f  gn_bufused;..CK_
28440 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e  RV sign_ret;..in
28450 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
28460 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28470 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
28480 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
28490 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
284a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
284b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
284c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
284d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
284e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
284f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
28500 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
28510 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
28520 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
28530 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
28540 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
28550 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
28560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28570 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
28580 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
28590 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
285a0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
285b0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
285c0 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75  .start_sign_bufu
285d0 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  sed = cackey_ses
285e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
285f0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
28600 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
28610 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  nUpdate(hSession
28620 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c  , pData, ulDataL
28630 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
28640 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
28650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28660 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
28670 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75  ignUpdate() retu
28680 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
28690 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
286a0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
286b0 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67  ret);....if (sig
286c0 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  n_ret != CKR_BUF
286d0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
286e0 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
286f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
28700 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28710 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
28720 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
28730 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
28740 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28750 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
28760 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
28770 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
28780 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
28790 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
287a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
287b0 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
287c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
287d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
287e0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
287f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28800 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
28810 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
28820 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
28830 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
28840 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
28850 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
28860 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
28870 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  n_active) {.....
28880 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28890 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
288a0 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
288b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
288c0 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
288d0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
288e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
288f0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
28900 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
28910 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
28920 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
28930 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
28940 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
28950 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28960 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28970 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
28980 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
28990 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
289a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
289b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
289c0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
289d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
289e0 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
289f0 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
28a00 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72  et);..}...sign_r
28a10 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  et = C_SignFinal
28a20 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e  (hSession, pSign
28a30 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74  ature, pulSignat
28a40 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ureLen);..if (si
28a50 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
28a60 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  ) {...if (sign_r
28a70 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  et == CKR_BUFFER
28a80 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
28a90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28aa0 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28  INTF("SignFinal(
28ab0 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42  ) returned CKR_B
28ac0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
28ad0 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f  (rv = %lu), undo
28ae0 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
28af0 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ()", (unsigned l
28b00 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
28b10 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
28b20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
28b30 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
28b40 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
28b50 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e  .....return(sign
28b60 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  _ret);...}....CA
28b70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28b80 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
28b90 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
28ba0 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
28bb0 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
28bc0 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
28bd0 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
28be0 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
28bf0 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c  Signature == NUL
28c00 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
28c10 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67  BUG_PRINTF("pSig
28c20 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64  nature specified
28c30 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e   as NULL, undoin
28c40 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
28c50 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ");....cackey_se
28c60 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28c70 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
28c80 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
28c90 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ed;....return(si
28ca0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
28cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28cc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
28cd0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
28ce0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
28cf0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
28d00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28d10 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
28d20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
28d30 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
28d40 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
28d50 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
28d60 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
28d70 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
28d80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28d90 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28da0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28db0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28dc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28dd0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28de0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28df0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28e00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28e10 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
28e20 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
28e30 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
28e40 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28e50 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28e60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
28e70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28e80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28e90 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
28ea0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
28eb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
28ec0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
28ed0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
28ee0 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
28ef0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
28f00 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
28f10 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
28f20 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
28f30 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
28f40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28f50 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
28f60 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
28f70 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
28f80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28f90 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
28fa0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
28fb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28fc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
28fd0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
28fe0 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
28ff0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
29000 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
29010 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
29020 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
29030 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29040 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
29050 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
29060 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
29070 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
29080 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
29090 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
290a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
290b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
290c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
290d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
290e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
290f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29100 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
29110 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
29120 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29130 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
29140 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
29150 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
29160 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29170 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29180 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
291a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
291b0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
291c0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
291d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
291e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
291f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
29200 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29210 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
29220 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
29230 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29240 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
29250 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29260 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
29270 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
29280 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
29290 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
292a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
292b0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
292c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
292d0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
292e0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
292f0 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
29300 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
29310 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
29320 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29330 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
29340 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
29350 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29360 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
29370 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b  flen) {.....cack
29380 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29390 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
293a0 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63  n *= 2;......cac
293b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
293c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
293d0 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79  = realloc(cackey
293e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
293f0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69  on].sign_buf, si
29400 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
29410 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29420 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
29430 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29440 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
29450 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  n);....}.....mem
29460 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
29470 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
29480 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
29490 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
294a0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
294b0 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
294c0 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
294d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
294e0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
294f0 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
29500 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
29510 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
29520 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
29530 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
29540 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
29550 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
29560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29570 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
29580 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
29590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
295a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
295b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
295c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
295d0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
295e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
295f0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
29600 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29610 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e  CK_RV, C_SignFin
29620 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
29630 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
29640 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
29650 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
29660 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
29670 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  eLen) {..static 
29680 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31  CK_BYTE sigbuf[1
29690 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73  024];..ssize_t s
296a0 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c  igbuflen;..CK_SL
296b0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
296c0 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
296d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
296e0 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
296f0 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  sign = 1;..int m
29700 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
29710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29720 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29730 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29740 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29760 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
29770 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
29780 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
29790 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
297a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
297b0 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  (pulSignatureLen
297c0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
297d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
297e0 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67  F("Error. pulSig
297f0 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c  natureLen is NUL
29800 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
29810 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
29820 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
29830 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
29840 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
29850 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
29860 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
29870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
29880 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29890 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
298a0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
298b0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
298c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
298d0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
298e0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
298f0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
29900 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
29910 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
29920 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
29930 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
29940 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29950 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
29960 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
29970 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
29980 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
29990 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
299a0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
299b0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
299c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
299d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
299e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
299f0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
29a00 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
29a10 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
29a20 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
29a30 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
29a40 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
29a50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
29a60 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
29a70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29a80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29a90 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
29aa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29ab0 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
29ac0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
29ad0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
29ae0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
29af0 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
29b00 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
29b10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
29b20 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
29b30 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
29b40 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
29b50 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
29b60 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
29b70 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
29b80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29b90 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
29ba0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
29bb0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
29bc0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
29bd0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
29be0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
29bf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
29c00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
29c10 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
29c20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29c30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
29c40 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
29c50 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
29c60 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
29c70 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
29c80 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
29c90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29ca0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
29cb0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29cc0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
29cd0 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
29ce0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
29cf0 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
29d00 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
29d10 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
29d20 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
29d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29d40 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
29d50 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
29d60 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
29d70 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29  n %lu", (void *)
29d80 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
29d90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
29da0 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67  identity, (unsig
29db0 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
29dc0 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65  on);....sigbufle
29dd0 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
29de0 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
29df0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
29e00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29e10 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
29e20 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
29e30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29e40 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
29e50 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29e60 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
29e70 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
29e80 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
29e90 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
29ea0 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f  len < 0) {...../
29eb0 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64  * Signing failed
29ec0 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67  . */.....if (sig
29ed0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
29ee0 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
29ef0 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  N) {......retval
29f00 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f   = CKR_USER_NOT_
29f10 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d  LOGGED_IN;.....}
29f20 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66   else if (sigbuf
29f30 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
29f40 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
29f50 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
29f60 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
29f70 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
29f80 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
29f90 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
29fa0 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  OR;.....}....} e
29fb0 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
29fc0 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
29fd0 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74  en) > *pulSignat
29fe0 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61  ureLen && pSigna
29ff0 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53  ture) {...../* S
2a000 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  igned data too l
2a010 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b  arge */.....CACK
2a020 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a030 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  "retval = CKR_BU
2a040 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20  FFER_TOO_SMALL; 
2a050 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75   sigbuflen = %lu
2a060 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
2a070 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  n = %lu", (unsig
2a080 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
2a090 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
2a0a0 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75  ong) *pulSignatu
2a0b0 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74  reLen);......ret
2a0c0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
2a0d0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09  _TOO_SMALL;.....
2a0e0 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
2a0f0 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  = 0;....} else {
2a100 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
2a110 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66  ign = 0;......if
2a120 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a   (pSignature) {.
2a130 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67  .....memcpy(pSig
2a140 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20  nature, sigbuf, 
2a150 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  sigbuflen);.....
2a160 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
2a170 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   = 1;.....}.....
2a180 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  .*pulSignatureLe
2a190 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a  n = sigbuflen;..
2a1a0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2a1b0 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
2a1c0 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  eak;..}...if (te
2a1d0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a  rminate_sign) {.
2a1e0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
2a1f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a200 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66  sign_buf) {....f
2a210 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
2a220 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2a230 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09  gn_buf);...}....
2a240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a250 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2a260 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
2a270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2a280 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a290 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a2a0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2a2b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2a2c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a2d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2a2e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2a2f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a300 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2a310 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a320 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a330 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
2a340 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
2a350 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2a360 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a370 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
2a380 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
2a390 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a3a0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2a3b0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2a3c0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2a3d0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
2a3e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a3f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a400 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a410 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a420 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a430 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a440 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a450 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a460 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a470 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a480 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a490 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2a4a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a4b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2a4c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a4d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2a4e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2a4f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2a500 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a510 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2a520 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  gnRecover)(CK_SE
2a530 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2a540 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2a550 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2a560 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
2a570 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2a580 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
2a590 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
2a5a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2a5b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a5c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a5d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a5e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a5f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a600 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a610 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a620 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a630 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a640 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a650 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a660 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2a670 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2a680 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2a690 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a6a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2a6b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a6c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2a6d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2a6e0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e  K_RV, C_VerifyIn
2a6f0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2a700 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2a710 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2a720 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2a730 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2a740 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2a750 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a760 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a770 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a780 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a790 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a7a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a7b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a7c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a7d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a7e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a7f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a800 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2a810 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2a820 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2a830 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a840 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2a850 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a860 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2a870 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2a880 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28  K_RV, C_Verify)(
2a890 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2a8a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2a8b0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2a8c0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
2a8d0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a8e0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2a8f0 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
2a900 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2a910 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a920 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a930 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a940 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a960 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a970 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a980 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a990 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a9a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a9b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a9c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2a9d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2a9e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2a9f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2aa00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2aa10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2aa20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2aa30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2aa40 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70  K_RV, C_VerifyUp
2aa50 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2aa60 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2aa70 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2aa80 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2aa90 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2aaa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2aab0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2aac0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2aad0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2aae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2aaf0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2ab00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2ab10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2ab20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2ab30 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2ab40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2ab50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2ab60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ab70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2ab80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ab90 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2aba0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2abb0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2abc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2abd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2abe0 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ifyFinal)(CK_SES
2abf0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ac00 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2ac10 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2ac20 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
2ac30 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2ac40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2ac50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2ac60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2ac70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2ac80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ac90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2aca0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2acb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2acc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2acd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2ace0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2acf0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2ad00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ad10 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2ad20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ad30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2ad40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ad50 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2ad60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2ad70 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2ad80 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b  yRecoverInit)(CK
2ad90 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2ada0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2adb0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2adc0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2add0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2ade0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2adf0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2ae00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2ae10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2ae20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ae30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ae40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ae50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ae60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ae70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2ae80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ae90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2aea0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2aeb0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2aec0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2aed0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2aee0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2aef0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2af00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2af10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2af20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29  C_VerifyRecover)
2af30 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2af40 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2af50 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2af60 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
2af70 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b  SignatureLen, CK
2af80 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2af90 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2afa0 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  lDataLen) {..CAC
2afb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2afc0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2afd0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2afe0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2aff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b000 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2b010 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2b020 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2b030 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2b040 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2b050 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b060 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2b070 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2b080 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2b090 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b0a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2b0b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2b0c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2b0d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b0e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2b0f0 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
2b100 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2b110 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2b120 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2b130 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2b140 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2b150 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2b160 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2b170 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2b180 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2b190 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2b1a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2b1b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2b1c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b1d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b1e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2b1f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b200 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2b210 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2b220 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2b230 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2b240 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2b250 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2b260 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2b270 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b280 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2b290 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b2a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2b2b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2b2c0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44  K_RV, C_DecryptD
2b2d0 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
2b2e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b2f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2b300 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2b310 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2b320 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2b330 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2b340 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2b350 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
2b360 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b370 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b380 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b390 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b3a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b3b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b3c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b3d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b3e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b3f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2b400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b410 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2b420 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b430 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2b440 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2b450 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2b460 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2b470 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b480 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2b490 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2b4a0 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
2b4b0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2b4c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2b4d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2b4e0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2b4f0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2b500 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2b510 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2b520 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2b530 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2b540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2b550 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2b560 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2b570 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2b580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b590 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2b5a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2b5b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2b5c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2b5d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2b5e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2b5f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2b600 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b610 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2b620 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2b630 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2b640 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b650 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2b660 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2b670 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
2b680 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  tVerifyUpdate)(C
2b690 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2b6a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2b6b0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2b6c0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2b6d0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2b6e0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2b6f0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2b700 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2b710 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2b720 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2b730 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2b740 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2b750 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b760 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2b770 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2b780 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b790 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2b7a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2b7b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b7c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2b7d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2b7e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2b7f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2b800 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2b810 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2b820 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2b830 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2b840 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2b850 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29  , C_GenerateKey)
2b860 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2b870 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2b880 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2b890 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
2b8a0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
2b8b0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2b8c0 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
2b8d0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2b8e0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2b8f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2b900 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2b910 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2b920 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b930 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b940 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2b950 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b960 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2b970 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2b980 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2b990 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2b9a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2b9b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2b9c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2b9d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b9e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2b9f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ba00 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2ba10 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ba20 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
2ba30 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53  KeyPair)(CK_SESS
2ba40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ba50 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2ba60 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2ba70 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
2ba80 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d  TR pPublicKeyTem
2ba90 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2baa0 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69  ulPublicKeyAttri
2bab0 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54  buteCount, CK_AT
2bac0 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69  TRIBUTE_PTR pPri
2bad0 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c  vateKeyTemplate,
2bae0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76   CK_ULONG ulPriv
2baf0 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43  ateKeyAttributeC
2bb00 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
2bb10 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62  HANDLE_PTR phPub
2bb20 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  licKey, CK_OBJEC
2bb30 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
2bb40 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41  rivateKey) {..CA
2bb50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bb60 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2bb70 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2bb80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2bb90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bba0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2bbb0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2bbc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2bbd0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2bbe0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2bbf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bc00 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2bc10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2bc20 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2bc30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2bc40 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2bc50 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2bc60 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2bc70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2bc80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
2bc90 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
2bca0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2bcb0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2bcc0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2bcd0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2bce0 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20  E hWrappingKey, 
2bcf0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2bd00 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50   hKey, CK_BYTE_P
2bd10 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
2bd20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2bd30 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b  WrappedKeyLen) {
2bd40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bd50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2bd60 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2bd70 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2bd80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bd90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2bda0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2bdb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2bdc0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2bdd0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2bde0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bdf0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2be00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2be10 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2be20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2be30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2be40 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2be50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2be60 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2be70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2be80 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b   C_UnwrapKey)(CK
2be90 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2bea0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2beb0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2bec0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2bed0 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70  _HANDLE hUnwrapp
2bee0 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  ingKey, CK_BYTE_
2bef0 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
2bf00 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70   CK_ULONG ulWrap
2bf10 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54  pedKeyLen, CK_AT
2bf20 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
2bf30 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2bf40 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
2bf50 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2bf60 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
2bf70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bf80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2bf90 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2bfa0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2bfb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bfc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2bfd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2bfe0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2bff0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2c000 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2c010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c020 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2c030 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c040 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2c050 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c060 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2c070 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2c080 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c090 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2c0a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2c0b0 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f  C_DeriveKey)(CK_
2c0c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2c0d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2c0e0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2c0f0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2c100 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c  HANDLE hBaseKey,
2c110 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2c120 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
2c130 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
2c140 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
2c150 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2c160 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2c170 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2c180 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2c190 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2c1a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c1b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c1c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2c1d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2c1e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2c1f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2c200 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2c210 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2c220 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2c230 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2c240 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2c250 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c260 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2c270 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c280 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2c290 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2c2a0 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64  K_RV, C_SeedRand
2c2b0 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
2c2c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2c2d0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65  CK_BYTE_PTR pSee
2c2e0 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65  d, CK_ULONG ulSe
2c2f0 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  edLen) {..CACKEY
2c300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c310 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c320 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c330 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c350 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c360 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c370 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c380 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c390 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2c3a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c3b0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2c3c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c3d0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2c3e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2c3f0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2c400 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c410 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2c420 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c430 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
2c440 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  ateRandom)(CK_SE
2c450 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2c460 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2c470 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20  TR pRandomData, 
2c480 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f  CK_ULONG ulRando
2c490 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  mLen) {..CACKEY_
2c4a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2c4b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2c4c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2c4d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2c4e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c4f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2c500 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2c510 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2c520 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2c530 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2c540 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2c550 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2c560 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2c570 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2c580 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c590 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2c5a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2c5b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  UPPORTED);.}../*
2c5c0 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
2c5d0 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
2c5e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c5f0 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  , C_GetFunctionS
2c600 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f  tatus)(CK_SESSIO
2c610 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2c620 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2c630 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2c640 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
2c650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2c660 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2c670 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2c680 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2c690 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2c6a0 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
2c6b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2c6c0 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
2c6d0 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
2c6e0 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
2c6f0 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
2c700 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72  ng */.}../* Depr
2c710 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
2c720 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
2c730 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
2c740 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43  ancelFunction)(C
2c750 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2c760 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
2c770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c780 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2c790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c7a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2c7b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c7c0 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
2c7d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c7e0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
2c7f0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2c800 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
2c810 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
2c820 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
2c830 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
2c840 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
2c850 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2c860 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
2c870 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b  FunctionList)(CK
2c880 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
2c890 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f  TR_PTR ppFunctio
2c8a0 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e  nList) {..CK_FUN
2c8b0 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70  CTION_LIST_PTR p
2c8c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2c8d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c8e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c8f0 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e  ..if (ppFunction
2c900 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
2c910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c920 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70  RINTF("Error. pp
2c930 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20  FunctionList is 
2c940 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2c950 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2c960 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  _BAD);..}...pFun
2c970 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
2c980 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
2c990 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
2c9a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
2c9b0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
2c9c0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
2c9d0 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
2c9e0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
2c9f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
2ca00 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
2ca10 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
2ca20 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
2ca30 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
2ca40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
2ca50 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
2ca60 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
2ca70 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
2ca80 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
2ca90 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2caa0 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
2cab0 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
2cac0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
2cad0 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
2cae0 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
2caf0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
2cb00 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
2cb10 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
2cb20 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
2cb30 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
2cb40 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
2cb50 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
2cb60 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
2cb70 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
2cb80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2cb90 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
2cba0 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
2cbb0 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
2cbc0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
2cbd0 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
2cbe0 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
2cbf0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2cc00 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
2cc10 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
2cc20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2cc30 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
2cc40 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
2cc50 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
2cc60 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
2cc70 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
2cc80 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
2cc90 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
2cca0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
2ccb0 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
2ccc0 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
2ccd0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
2cce0 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
2ccf0 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
2cd00 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2cd10 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
2cd20 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
2cd30 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
2cd40 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
2cd50 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
2cd60 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2cd70 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2cd80 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
2cd90 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
2cda0 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
2cdb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
2cdc0 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
2cdd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2cde0 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
2cdf0 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
2ce00 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
2ce10 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
2ce20 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2ce30 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
2ce40 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
2ce50 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2ce60 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
2ce70 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
2ce80 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
2ce90 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
2cea0 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
2ceb0 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
2cec0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
2ced0 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
2cee0 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
2cef0 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
2cf00 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
2cf10 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
2cf20 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
2cf30 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2cf40 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
2cf50 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
2cf60 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2cf70 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
2cf80 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
2cf90 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
2cfa0 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
2cfb0 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
2cfc0 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
2cfd0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2cfe0 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
2cff0 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
2d000 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
2d010 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
2d020 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
2d030 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
2d040 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
2d050 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2d060 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
2d070 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
2d080 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
2d090 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
2d0a0 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
2d0b0 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
2d0c0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
2d0d0 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
2d0e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2d0f0 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
2d100 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
2d110 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2d120 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
2d130 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
2d140 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2d150 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
2d160 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
2d170 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2d180 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
2d190 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
2d1a0 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
2d1b0 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
2d1c0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2d1d0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
2d1e0 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
2d1f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2d200 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
2d210 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
2d220 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2d230 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
2d240 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
2d250 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
2d260 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
2d270 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
2d280 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
2d290 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2d2a0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
2d2b0 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
2d2c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2d2d0 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
2d2e0 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
2d2f0 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
2d300 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
2d310 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
2d320 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
2d330 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
2d340 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
2d350 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2d360 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
2d370 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
2d380 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2d390 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
2d3a0 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
2d3b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
2d3c0 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
2d3d0 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
2d3e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
2d3f0 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
2d400 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
2d410 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2d420 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
2d430 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
2d440 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
2d450 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
2d460 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
2d470 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
2d480 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2d490 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
2d4a0 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
2d4b0 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
2d4c0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2d4d0 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79  ist->C_SignEncry
2d4e0 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  ptUpdate = C_Sig
2d4f0 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  nEncryptUpdate;.
2d500 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2d510 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
2d520 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
2d530 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  tVerifyUpdate;..
2d540 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2d550 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43  _GenerateKey = C
2d560 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70  _GenerateKey;..p
2d570 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2d580 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20  GenerateKeyPair 
2d590 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  = C_GenerateKeyP
2d5a0 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  air;..pFunctionL
2d5b0 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d  ist->C_WrapKey =
2d5c0 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75   C_WrapKey;..pFu
2d5d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e  nctionList->C_Un
2d5e0 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72  wrapKey = C_Unwr
2d5f0 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
2d600 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b  nList->C_DeriveK
2d610 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79  ey = C_DeriveKey
2d620 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2d630 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d  ->C_SeedRandom =
2d640 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09   C_SeedRandom;..
2d650 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2d660 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20  _GenerateRandom 
2d670 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  = C_GenerateRand
2d680 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
2d690 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
2d6a0 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46  nStatus = C_GetF
2d6b0 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09  unctionStatus;..
2d6c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2d6d0 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20  _CancelFunction 
2d6e0 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  = C_CancelFuncti
2d6f0 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
2d700 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
2d710 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e  nList = C_GetFun
2d720 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70  ctionList;...*pp
2d730 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70  FunctionList = p
2d740 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
2d750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d760 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d770 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2d780 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2d790 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a                 KR_OK);.}..