Hex Artifact Content

Artifact 4c31fc86bf2f62ab951920ce40bbbd582ef1db62:


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 0a 23 64 65 66 69  if.#endif..#defi
02f0: 6e 65 20 43 4b 5f 50 54 52 20 2a 0a 23 64 65 66  ne CK_PTR *.#def
0300: 69 6e 65 20 43 4b 5f 44 45 46 49 4e 45 5f 46 55  ine CK_DEFINE_FU
0310: 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70  NCTION(returnTyp
0320: 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54  e, name) returnT
0330: 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65  ype name.#define
0340: 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43   CK_DECLARE_FUNC
0350: 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c  TION(returnType,
0360: 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70   name) returnTyp
0370: 65 20 6e 61 6d 65 0a 23 64 65 66 69 6e 65 20 43  e name.#define C
0380: 4b 5f 44 45 43 4c 41 52 45 5f 46 55 4e 43 54 49  K_DECLARE_FUNCTI
0390: 4f 4e 5f 50 4f 49 4e 54 45 52 28 72 65 74 75 72  ON_POINTER(retur
03a0: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
03b0: 75 72 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29  urnType (* name)
03c0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 43 41 4c 4c  .#define CK_CALL
03d0: 42 41 43 4b 5f 46 55 4e 43 54 49 4f 4e 28 72 65  BACK_FUNCTION(re
03e0: 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20  turnType, name) 
03f0: 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e 61  returnType (* na
0400: 6d 65 29 0a 23 69 66 6e 64 65 66 20 4e 55 4c 4c  me).#ifndef NULL
0410: 5f 50 54 52 0a 23 20 20 64 65 66 69 6e 65 20 4e  _PTR.#  define N
0420: 55 4c 4c 5f 50 54 52 20 30 0a 23 65 6e 64 69 66  ULL_PTR 0.#endif
0430: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73  ..#include "pkcs
0440: 31 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  11.h".#include "
0450: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 0a 23 69  asn1-x509.h"..#i
0460: 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43 52 59  fndef CACKEY_CRY
0470: 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
0480: 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  DE.#  define CAC
0490: 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
04a0: 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32 31 65  SION_CODE 0x021e
04b0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
04c0: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52  ef CKA_TRUST_SER
04d0: 56 45 52 5f 41 55 54 48 0a 23 20 20 64 65 66 69  VER_AUTH.#  defi
04e0: 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52  ne CKA_TRUST_SER
04f0: 56 45 52 5f 41 55 54 48 20 30 78 63 65 35 33 36  VER_AUTH 0xce536
0500: 33 35 38 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  358.#endif.#ifnd
0510: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  ef CKA_TRUST_CLI
0520: 45 4e 54 5f 41 55 54 48 0a 23 20 20 64 65 66 69  ENT_AUTH.#  defi
0530: 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  ne CKA_TRUST_CLI
0540: 45 4e 54 5f 41 55 54 48 20 30 78 63 65 35 33 36  ENT_AUTH 0xce536
0550: 33 35 39 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  359.#endif.#ifnd
0560: 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44  ef CKA_TRUST_COD
0570: 45 5f 53 49 47 4e 49 4e 47 0a 23 20 20 64 65 66  E_SIGNING.#  def
0580: 69 6e 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f  ine CKA_TRUST_CO
0590: 44 45 5f 53 49 47 4e 49 4e 47 20 30 78 63 65 35  DE_SIGNING 0xce5
05a0: 33 36 33 35 61 0a 23 65 6e 64 69 66 0a 23 69 66  3635a.#endif.#if
05b0: 6e 64 65 66 20 43 4b 41 5f 54 52 55 53 54 5f 45  ndef CKA_TRUST_E
05c0: 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  MAIL_PROTECTION.
05d0: 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54 52  #  define CKA_TR
05e0: 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
05f0: 54 49 4f 4e 20 30 78 63 65 35 33 36 33 35 62 0a  TION 0xce53635b.
0600: 23 65 6e 64 69 66 0a 0a 2f 2a 20 47 53 43 2d 49  #endif../* GSC-I
0610: 53 20 76 32 2e 31 20 44 65 66 69 6e 69 74 69 6f  S v2.1 Definitio
0620: 6e 73 20 2a 2f 0a 2f 2a 2a 20 43 6c 61 73 73 65  ns */./** Classe
0630: 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53  s **/.#define GS
0640: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
0650: 36 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30  6           0x00
0660: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 43  .#define GSCIS_C
0670: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
0680: 46 4f 52 4d 20 20 20 30 78 38 30 0a 0a 2f 2a 2a  FORM   0x80../**
0690: 20 49 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2a   Instructions **
06a0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
06b0: 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e  INSTR_GET_RESPON
06c0: 53 45 20 20 20 20 20 20 30 78 43 30 0a 23 64 65  SE      0xC0.#de
06d0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
06e0: 5f 52 45 41 44 5f 42 49 4e 41 52 59 20 20 20 20  _READ_BINARY    
06f0: 20 20 20 30 78 42 30 0a 23 64 65 66 69 6e 65 20     0xB0.#define 
0700: 47 53 43 49 53 5f 49 4e 53 54 52 5f 55 50 44 41  GSCIS_INSTR_UPDA
0710: 54 45 5f 42 49 4e 41 52 59 20 20 20 20 20 30 78  TE_BINARY     0x
0720: 44 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  D6.#define GSCIS
0730: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 20 20 20  _INSTR_SELECT   
0740: 20 20 20 20 20 20 20 20 20 30 78 41 34 0a 23 64           0xA4.#d
0750: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0760: 52 5f 45 58 54 45 52 4e 41 4c 5f 41 55 54 48 20  R_EXTERNAL_AUTH 
0770: 20 20 20 20 30 78 38 32 0a 23 64 65 66 69 6e 65      0x82.#define
0780: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54   GSCIS_INSTR_GET
0790: 5f 43 48 41 4c 4c 45 4e 47 45 20 20 20 20 20 30  _CHALLENGE     0
07a0: 78 38 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x84.#define GSCI
07b0: 53 5f 49 4e 53 54 52 5f 49 4e 54 45 52 4e 41 4c  S_INSTR_INTERNAL
07c0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 38 0a 23  _AUTH     0x88.#
07d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
07e0: 54 52 5f 56 45 52 49 46 59 20 20 20 20 20 20 20  TR_VERIFY       
07f0: 20 20 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e       0x20.#defin
0800: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49  e GSCIS_INSTR_SI
0810: 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GN              
0820: 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x2A.#define GSC
0830: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52 4f  IS_INSTR_GET_PRO
0840: 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36 0a  P          0x56.
0850: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0860: 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20 20  STR_GET_ACR     
0870: 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66 69        0x4C.#defi
0880: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  ne GSCIS_INSTR_R
0890: 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20 20  EAD_BUFFER      
08a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
08b0: 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45  CIS_INSTR_SIGNDE
08c0: 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34 32  CRYPT       0x42
08d0: 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  ..#define GSCIS_
08e0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
08f0: 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f 2a  LET     0x04../*
0900: 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a 20  * Tags **/./*** 
0910: 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23 64  CCC Tags ***/.#d
0920: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0930: 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20 20  CARDID          
0940: 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e 65      0xF0.#define
0950: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56   GSCIS_TAG_CCC_V
0960: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
0970: 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF1.#define GSCI
0980: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20 20  S_TAG_CCG_VER   
0990: 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a 23            0xF2.#
09a0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09b0: 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20 20  _CARDURL        
09c0: 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69 6e       0xF3.#defin
09d0: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
09e0: 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  15              
09f0: 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF4.#define GSC
0a00: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
0a10: 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35 0a  MODEL      0xF5.
0a20: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a30: 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20 20  G_ACR_TABLE     
0a40: 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66 69        0xF6.#defi
0a50: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
0a60: 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20 20  D_APDU          
0a70: 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47 53   0xF7.#define GS
0a80: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
0a90: 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46 41  ION         0xFA
0aa0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ab0: 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20 20  AG_CT           
0ac0: 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65 66         0xFB.#def
0ad0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ine GSCIS_TAG_ST
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20 47    0xFC.#define G
0b00: 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43  SCIS_TAG_NEXTCCC
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0b20: 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c 20  D../*** General 
0b30: 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a 23  - EF 2200 ***/.#
0b40: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b50: 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _FNAME          
0b60: 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e       0x01.#defin
0b70: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
0b80: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0b90: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0x02.#define GSC
0ba0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20 20  IS_TAG_LNAME    
0bb0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33 0a             0x03.
0bc0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0bd0: 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20 20  G_SUFFIX        
0be0: 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66 69        0x04.#defi
0bf0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56  ne GSCIS_TAG_GOV
0c00: 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20 20  T_AGENCY        
0c10: 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47 53   0x05.#define GS
0c20: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20 20  CIS_TAG_BUREAU  
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 36              0x06
0c40: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c50: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20 20  AG_BUREAU_CODE  
0c60: 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65 66         0x07.#def
0c70: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ine GSCIS_TAG_DE
0c80: 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20 20  PT_CODE         
0c90: 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20 47    0x08.#define G
0ca0: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20 20  SCIS_TAG_TITLE  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0cc0: 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  9.#define GSCIS_
0cd0: 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20 20  TAG_BUILDING    
0ce0: 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64 65          0x10.#de
0cf0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d00: 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20 20  FFICE_ADDR1     
0d10: 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65 20     0x11.#define 
0d20: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d30: 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30 78  _ADDR2        0x
0d40: 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  12.#define GSCIS
0d50: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59  _TAG_OFFICE_CITY
0d60: 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23 64           0x13.#d
0d70: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d80: 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20 20  OFFICE_STATE    
0d90: 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e 65      0x14.#define
0da0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0db0: 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20 30  E_ZIP          0
0dc0: 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x15.#define GSCI
0dd0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
0de0: 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a 23  NTRY      0x16.#
0df0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e00: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20 20  _OFFICE_PHONE   
0e10: 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69 6e       0x17.#defin
0e20: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e30: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20 20  CE_PHONE_EXT    
0e40: 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x18.#define GSC
0e50: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41  IS_TAG_OFFICE_FA
0e60: 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39 0a  X          0x19.
0e70: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e80: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20 20  G_OFFICE_EMAIL  
0e90: 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66 69        0x1A.#defi
0ea0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0eb0: 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20 20  ICE_ROOM        
0ec0: 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47 53   0x1B.#define GS
0ed0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
0ee0: 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31 43  GENCY       0x1C
0ef0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f00: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
0f10: 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a 2a  R      0x1D../**
0f20: 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30 20  * PII - EF 2100 
0f30: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
0f40: 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20 20  IS_TAG_SSN      
0f50: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0f60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0f70: 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20 20  G_DOB           
0f80: 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66 69        0x21.#defi
0f90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  ne GSCIS_TAG_GEN
0fa0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
0fb0: 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 69   0x22../*** Logi
0fc0: 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  n Information - 
0fd0: 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64 65  EF 4000 ***/.#de
0fe0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 55  fine GSCIS_TAG_U
0ff0: 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20 20  SERID           
1000: 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 20     0x40.#define 
1010: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
1030: 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  41.#define GSCIS
1040: 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20 20  _TAG_PASSWORD   
1050: 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a 2f           0x42../
1060: 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d 61  *** Card Informa
1070: 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20 2a  tion - EF 5000 *
1080: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
1090: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20 20  S_TAG_ISSUERID  
10a0: 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a 23            0x50.#
10b0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10c0: 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20 20  _SERNO          
10d0: 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69 6e       0x51.#defin
10e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
10f0: 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 20  E_DATE          
1100: 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0x52.#define GSC
1110: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41  IS_TAG_EXPIRE_DA
1120: 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33 0a  TE         0x53.
1130: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1140: 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20 20  G_CARD_TYPE     
1150: 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66 69        0x54.#defi
1160: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43  ne GSCIS_TAG_SEC
1170: 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20 20  URITY_CODE      
1180: 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47 53   0x57.#define GS
1190: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
11a0: 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35 38  ID          0x58
11b0: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
11c0: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
11d0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
11e0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
11f0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1200: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1210: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1220: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
1230: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
1240: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
1250: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
1260: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
1270: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
12a0: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
12b0: 78 44 42 2c 20 30 78 30 30 0a 0a 2f 2a 20 4d 61  xDB, 0x00../* Ma
12c0: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64 61  ximum size of da
12d0: 74 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41 50  ta portion of AP
12e0: 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e 6f  DUs */./** Do no
12f0: 74 20 73 65 74 20 74 68 69 73 20 61 62 6f 76 65  t set this above
1300: 20 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   250 **/.#define
1310: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
1330: 35 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  50..#ifdef CACKE
1340: 59 5f 44 45 42 55 47 0a 0a 23 20 20 64 65 66 69  Y_DEBUG..#  defi
1350: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
1360: 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 66  PRINTF(x...) { f
1370: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1380: 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66 75  %s():%i: ", __fu
1390: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  nc__, __LINE__);
13a0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
13b0: 20 78 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64   x); fprintf(std
13c0: 65 72 72 2c 20 22 5c 6e 22 29 3b 20 66 66 6c 75  err, "\n"); fflu
13d0: 73 68 28 73 74 64 65 72 72 29 3b 20 7d 0a 23 20  sh(stderr); }.# 
13e0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
13f0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c  EBUG_PRINTBUF(f,
1400: 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67 6e 65   x, y) { unsigne
1410: 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46 3b 20  d char *TMPBUF; 
1420: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1430: 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75 6e 73  x; TMPBUF = (uns
1440: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78  igned char *) (x
1450: 29 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  ); fprintf(stder
1460: 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 25 73 20  r, "%s():%i: %s 
1470: 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78   (%s/%lu = {%02x
1480: 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  ", __func__, __L
1490: 49 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75  INE__, f, #x, (u
14a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79  nsigned long) (y
14b0: 29 2c 20 54 4d 50 42 55 46 5b 30 5d 29 3b 20 66  ), TMPBUF[0]); f
14c0: 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
14d0: 20 3c 20 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b   < (y); idx++) {
14e0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14f0: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1500: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69  F[idx]); }; fpri
1510: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7d 29 5c  ntf(stderr, "})\
1520: 6e 22 29 3b 20 66 66 6c 75 73 68 28 73 74 64 65  n"); fflush(stde
1530: 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65  rr); }.#  define
1540: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45   CACKEY_DEBUG_PE
1550: 52 52 4f 52 28 78 29 20 7b 20 66 70 72 69 6e 74  RROR(x) { fprint
1560: 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a  f(stderr, "%s():
1570: 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c  %i: ", __func__,
1580: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 70 65 72 72   __LINE__); perr
1590: 6f 72 28 78 29 3b 20 66 66 6c 75 73 68 28 73 74  or(x); fflush(st
15a0: 64 65 72 72 29 3b 20 7d 0a 23 20 20 64 65 66 69  derr); }.#  defi
15b0: 6e 65 20 66 72 65 65 28 78 29 20 7b 20 43 41 43  ne free(x) { CAC
15c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15d0: 28 22 46 52 45 45 28 25 70 29 20 28 25 73 29 22  ("FREE(%p) (%s)"
15e0: 2c 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78  , x, #x); free(x
15f0: 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  ); }..static voi
1600: 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  d *CACKEY_DEBUG_
1610: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65  FUNC_MALLOC(size
1620: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
1630: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
1640: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
1650: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
1660: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a   malloc(size);..
1670: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
1680: 20 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 66 75   "%s():%i: ", fu
1690: 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66 70 72 69  nc, line);..fpri
16a0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4d 41 4c  ntf(stderr, "MAL
16b0: 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65 74  LOC() = %p", ret
16c0: 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28 73  val);..fprintf(s
16d0: 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 09 66  tderr, "\n");..f
16e0: 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b 0a 0a  flush(stderr);..
16f0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1700: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1710: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
1720: 4e 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20  NC_REALLOC(void 
1730: 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a  *ptr, size_t siz
1740: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  e, const char *f
1750: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
1760: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
1770: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1780: 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a  oc(ptr, size);..
1790: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70  .if (retval != p
17a0: 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  tr) {...fprintf(
17b0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 25 69  stderr, "%s():%i
17c0: 3a 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29  : ", func, line)
17d0: 3b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64 65  ;...fprintf(stde
17e0: 72 72 2c 20 22 52 45 41 4c 4c 4f 43 28 25 70 29  rr, "REALLOC(%p)
17f0: 20 3d 20 25 70 22 2c 20 70 74 72 2c 20 72 65 74   = %p", ptr, ret
1800: 76 61 6c 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  val);...fprintf(
1810: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 09  stderr, "\n");..
1820: 09 66 66 6c 75 73 68 28 73 74 64 65 72 72 29 3b  .fflush(stderr);
1830: 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ..}...if (retval
1840: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1850: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1860: 46 28 22 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a  F(" *** ERROR **
1870: 2a 20 72 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e  * realloc return
1880: 65 64 20 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20  ed NULL (size = 
1890: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
18a0: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d   long) size);..}
18b0: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
18c0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  );.}..static cha
18d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
18e0: 46 55 4e 43 5f 53 54 52 44 55 50 28 63 6f 6e 73  FUNC_STRDUP(cons
18f0: 74 20 63 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e  t char *ptr, con
1900: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
1910: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72  nt line) {..char
1920: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
1930: 61 6c 20 3d 20 73 74 72 64 75 70 28 70 74 72 29  al = strdup(ptr)
1940: 3b 0a 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65  ;...fprintf(stde
1950: 72 72 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  rr, "%s():%i: ",
1960: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 66   func, line);..f
1970: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1980: 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20  STRDUP_MALLOC() 
1990: 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a  = %p", retval);.
19a0: 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
19b0: 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28   "\n");..fflush(
19c0: 73 74 64 65 72 72 29 3b 0a 0a 09 72 65 74 75 72  stderr);...retur
19d0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
19e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
19f0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
1a00: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e  NC_TAG_TO_STR(un
1a10: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29  signed char tag)
1a20: 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29   {..switch (tag)
1a30: 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f   {...case GSCIS_
1a40: 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72  TAG_CARDID:....r
1a50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1a60: 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73  _CARDID");...cas
1a70: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
1a80: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1a90: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
1aa0: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
1ab0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09  S_TAG_CCG_VER:..
1ac0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1ad0: 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09  TAG_CCG_VER");..
1ae0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1af0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75  CARDURL:....retu
1b00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1b10: 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20  RDURL");...case 
1b20: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
1b30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b40: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b  IS_TAG_PKCS15");
1b50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1b60: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
1b70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1b80: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
1b90: 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  MODEL");...case 
1ba0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
1bb0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
1bc0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
1bd0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  BLE");...case GS
1be0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
1bf0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
1c00: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
1c10: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1c20: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
1c30: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
1c40: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
1c50: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ION");...case GS
1c60: 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72  CIS_TAG_CT:....r
1c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1c80: 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _CT");...case GS
1c90: 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72  CIS_TAG_ST:....r
1ca0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1cb0: 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _ST");...case GS
1cc0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a  CIS_TAG_NEXTCCC:
1cd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1ce0: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b  S_TAG_NEXTCCC");
1cf0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d00: 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_FNAME:....retu
1d10: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e  rn("GSCIS_TAG_FN
1d20: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1d30: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09  CIS_TAG_MNAME:..
1d40: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1d50: 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_MNAME");...c
1d60: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e  ase GSCIS_TAG_LN
1d70: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1d80: 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22  GSCIS_TAG_LNAME"
1d90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1da0: 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72  TAG_SUFFIX:....r
1db0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1dc0: 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73  _SUFFIX");...cas
1dd0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  e GSCIS_TAG_GOVT
1de0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
1df0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f  rn("GSCIS_TAG_GO
1e00: 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  VT_AGENCY");...c
1e10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
1e20: 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  REAU:....return(
1e30: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
1e40: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1e50: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
1e60: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1e70: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
1e80: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
1e90: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1ea0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1eb0: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1ec0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1ed0: 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09  S_TAG_TITLE:....
1ee0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ef0: 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73  G_TITLE");...cas
1f00: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
1f10: 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28  DING:....return(
1f20: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44  "GSCIS_TAG_BUILD
1f30: 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ING");...case GS
1f40: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
1f50: 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  DDR1:....return(
1f60: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1f70: 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73  E_ADDR1");...cas
1f80: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1f90: 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74  CE_ADDR2:....ret
1fa0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1fb0: 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09  FFICE_ADDR2");..
1fc0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1fd0: 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09  OFFICE_CITY:....
1fe0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ff0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b  G_OFFICE_CITY");
2000: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2010: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a  G_OFFICE_STATE:.
2020: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2030: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
2040: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2050: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
2060: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2070: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
2080: 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  P");...case GSCI
2090: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
20a0: 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  NTRY:....return(
20b0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
20c0: 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63  E_COUNTRY");...c
20d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
20e0: 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72  FICE_PHONE:....r
20f0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2100: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b  _OFFICE_PHONE");
2110: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2120: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
2130: 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  XT:....return("G
2140: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2150: 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63  PHONE_EXT");...c
2160: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2170: 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74  FICE_FAX:....ret
2180: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2190: 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63  FFICE_FAX");...c
21a0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
21b0: 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72  FICE_EMAIL:....r
21c0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21d0: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b  _OFFICE_EMAIL");
21e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
21f0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09  G_OFFICE_ROOM:..
2200: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2210: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22  TAG_OFFICE_ROOM"
2220: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2230: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
2240: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2250: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2260: 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20  GENCY");...case 
2270: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
2280: 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74  SIGNATOR:....ret
2290: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
22a0: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b  SN_DESIGNATOR");
22b0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22c0: 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e  G_SSN:....return
22d0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22  ("GSCIS_TAG_SSN"
22e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
22f0: 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75  TAG_DOB:....retu
2300: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2310: 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  B");...case GSCI
2320: 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09  S_TAG_GENDER:...
2330: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2340: 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63  AG_GENDER");...c
2350: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53  ase GSCIS_TAG_US
2360: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2370: 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49  "GSCIS_TAG_USERI
2380: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2390: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09  S_TAG_DOMAIN:...
23a0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
23b0: 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63  AG_DOMAIN");...c
23c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41  ase GSCIS_TAG_PA
23d0: 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72  SSWORD:....retur
23e0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53  n("GSCIS_TAG_PAS
23f0: 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20  SWORD");...case 
2400: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2410: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2420: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2430: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2440: 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09  S_TAG_SERNO:....
2450: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2460: 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73  G_SERNO");...cas
2470: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2480: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
2490: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
24a0: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
24b0: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
24c0: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
24d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58  rn("GSCIS_TAG_EX
24e0: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  PIRE_DATE");...c
24f0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2500: 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  RD_TYPE:....retu
2510: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2520: 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  RD_TYPE");...cas
2530: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55  e GSCIS_TAG_SECU
2540: 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65  RITY_CODE:....re
2550: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2560: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b  SECURITY_CODE");
2570: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2580: 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09  G_CARDID_AID:...
2590: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
25a0: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b  AG_CARDID_AID");
25b0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
25c0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
25d0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25e0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22  TAG_CERTIFICATE"
25f0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2600: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2630: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2640: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
2650: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  RT_EXPIRE_DATE:.
2660: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2670: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
2680: 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  _DATE");..}...re
2690: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
26a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
26b0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
26c0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
26d0: 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65  R_TO_STR(LONG re
26e0: 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68  tcode) {..switch
26f0: 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63   (retcode) {...c
2700: 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43  ase SCARD_S_SUCC
2710: 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ESS:....return("
2720: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22  SCARD_S_SUCCESS"
2730: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2740: 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  E_CANCELLED:....
2750: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2760: 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63  CANCELLED");...c
2770: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54  ase SCARD_E_CANT
2780: 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74  _DISPOSE:....ret
2790: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
27a0: 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63  T_DISPOSE");...c
27b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ase SCARD_E_INSU
27c0: 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a  FFICIENT_BUFFER:
27d0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
27e0: 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
27f0: 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73  _BUFFER");...cas
2800: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2810: 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e  D_ATR:....return
2820: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
2830: 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20  D_ATR");...case 
2840: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2850: 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72  HANDLE:....retur
2860: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2870: 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63  ID_HANDLE");...c
2880: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2890: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09  LID_PARAMETER:..
28a0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
28b0: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
28c0: 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TER");...case SC
28d0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
28e0: 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RGET:....return(
28f0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
2900: 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73  _TARGET");...cas
2910: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2920: 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  D_VALUE:....retu
2930: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
2940: 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63  LID_VALUE");...c
2950: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  ase SCARD_E_NO_M
2960: 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  EMORY:....return
2970: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  ("SCARD_E_NO_MEM
2980: 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ORY");...case SC
2990: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
29a0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
29b0: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
29c0: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
29d0: 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  e SCARD_E_TIMEOU
29e0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
29f0: 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b  ARD_E_TIMEOUT");
2a00: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2a10: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
2a20: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  N:....return("SC
2a30: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2a40: 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  OLATION");...cas
2a50: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  e SCARD_E_NO_SMA
2a60: 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  RTCARD:....retur
2a70: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  n("SCARD_E_NO_SM
2a80: 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ARTCARD");...cas
2a90: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
2aa0: 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  N_CARD:....retur
2ab0: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
2ac0: 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  WN_CARD");...cas
2ad0: 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  e SCARD_E_PROTO_
2ae0: 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74  MISMATCH:....ret
2af0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f  urn("SCARD_E_PRO
2b00: 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09  TO_MISMATCH");..
2b10: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
2b20: 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75  T_READY:....retu
2b30: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
2b40: 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20  READY");...case 
2b50: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
2b60: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
2b70: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53  urn("SCARD_E_SYS
2b80: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  TEM_CANCELLED");
2b90: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2ba0: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a  NOT_TRANSACTED:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2bc0: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
2bd0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2be0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
2bf0: 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  ILABLE:....retur
2c00: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2c10: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b  R_UNAVAILABLE");
2c20: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2c30: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
2c40: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2c50: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
2c60: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2c70: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
2c80: 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65  SIVE_CARD:....re
2c90: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
2ca0: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22  RESPONSIVE_CARD"
2cb0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2cc0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
2cd0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2ce0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
2cf0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
2d00: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
2d10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2d20: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22  RD_W_RESET_CARD"
2d30: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d40: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a  W_REMOVED_CARD:.
2d50: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2d60: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22  _W_REMOVED_CARD"
2d70: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2d80: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a  E_PCI_TOO_SMALL:
2d90: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2da0: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
2db0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  L");...case SCAR
2dc0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
2dd0: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
2de0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2df0: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  R_UNSUPPORTED");
2e00: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2e10: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
2e20: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2e30: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
2e40: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
2e50: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
2e60: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
2e70: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52  urn("SCARD_E_CAR
2e80: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  D_UNSUPPORTED");
2e90: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2ea0: 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72  NO_SERVICE:....r
2eb0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
2ec0: 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63  O_SERVICE");...c
2ed0: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56  ase SCARD_E_SERV
2ee0: 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09  ICE_STOPPED:....
2ef0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2f00: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22  SERVICE_STOPPED"
2f10: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2f20: 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45  E_UNSUPPORTED_FE
2f30: 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e  ATURE:....return
2f40: 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50  ("SCARD_E_UNSUPP
2f50: 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b  ORTED_FEATURE");
2f60: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f  .#ifdef SCARD_W_
2f70: 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09  INSERTED_CARD...
2f80: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53  case SCARD_W_INS
2f90: 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ERTED_CARD:....r
2fa0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49  eturn("SCARD_W_I
2fb0: 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a  NSERTED_CARD");.
2fc0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43  #endif.#ifdef SC
2fd0: 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53  ARD_E_NO_READERS
2fe0: 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73  _AVAILABLE...cas
2ff0: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  e SCARD_E_NO_REA
3000: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a  DERS_AVAILABLE:.
3010: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3020: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3030: 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69  AILABLE");.#endi
3040: 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55  f..}...return("U
3050: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
3060: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3070: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3080: 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75  C_OBJID_TO_STR(u
3090: 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b  int16_t objid) {
30a0: 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29  ..switch (objid)
30b0: 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30 30   {...case 0x2000
30c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
30d0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
30e0: 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  NERALINFO");...c
30f0: 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72  ase 0x2100:....r
3100: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3110: 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f  V_OBJID_PROPERSO
3120: 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  NALINFO");...cas
3130: 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74  e 0x3000:....ret
3140: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3150: 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54  OBJID_ACCESSCONT
3160: 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ROL");...case 0x
3170: 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  4000:....return(
3180: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3190: 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73  D_LOGIN");...cas
31a0: 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74  e 0x5000:....ret
31b0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
31c0: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29  OBJID_CARDINFO")
31d0: 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30 3a  ;...case 0x6000:
31e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
31f0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
3200: 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73  METRICS");...cas
3210: 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74  e 0x7000:....ret
3220: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3230: 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47  OBJID_DIGITALSIG
3240: 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30  CERT");...case 0
3250: 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x0200:....return
3260: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3270: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b  ID_CAC_PERSON");
3280: 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a  ...case 0x0202:.
3290: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
32a0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
32b0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
32c0: 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65  se 0x0203:....re
32d0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
32e0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52  _OBJID_CAC_OTHER
32f0: 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61  BENEFITS");...ca
3300: 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65  se 0x0201:....re
3310: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3320: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3330: 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  NNEL");...case 0
3340: 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e  x02FE:....return
3350: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3360: 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29  ID_CAC_PKICERT")
3370: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22  ;..}....return("
3380: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
3390: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
33a0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
33b0: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
33c0: 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70  R(uint8_t apptyp
33d0: 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70  e) {..switch (ap
33e0: 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  ptype) {...case 
33f0: 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x00:....return(
3400: 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20  "NONE");...case 
3410: 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x01:....return(
3420: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3430: 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73  GENERIC");...cas
3440: 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72  e 0x02:....retur
3450: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3460: 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_SKI");...case 
3470: 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x03:....return(
3480: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3490: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
34a0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a  _TLV_APP_SKI");.
34b0: 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09  ..case 0x04:....
34c0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
34d0: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
34e0: 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65  case 0x05:....re
34f0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3500: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3510: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3520: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36  I");...case 0x06
3530: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3540: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
3550: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
3560: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
3570: 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x07:....return("
3580: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
3590: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
35a0: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41  TLV_APP_SKI | CA
35b0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
35c0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
35d0: 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 23  "INVALID");.}..#
35e0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
35f0: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
3600: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
3610: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
3620: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
3630: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
3640: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
3650: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
3660: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
3670: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
3680: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
3690: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
36a0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
36b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
36c0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
36d0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
36e0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
36f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
3700: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
3710: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
3720: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
3730: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
3740: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
3750: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
3760: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
3770: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
3780: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
3790: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
37a0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
37b0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
37c0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
37d0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
37e0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
37f0: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3800: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
3810: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
3820: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
3830: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
3840: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
3850: 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a  SABLED".#endif..
3860: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
3870: 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75  sc_identity {..u
3880: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70  nsigned char app
3890: 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f  let[7];..uint16_
38a0: 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f 74  t file;...size_t
38b0: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
38c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
38d0: 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a   *certificate;..
38e0: 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65  .ssize_t keysize
38f0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3900: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  key_identity {..
3910: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
3920: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
3930: 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b  c_identity;...CK
3940: 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72  _ATTRIBUTE *attr
3950: 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e  ibutes;..CK_ULON
3960: 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  G attributes_cou
3970: 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  nt;.};..struct c
3980: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a  ackey_session {.
3990: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43  .int active;...C
39a0: 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
39b0: 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61  ;...CK_STATE sta
39c0: 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c  te;..CK_FLAGS fl
39d0: 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  ags;..CK_ULONG u
39e0: 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43  lDeviceError;..C
39f0: 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
3a00: 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54  ication;..CK_NOT
3a10: 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74  IFY Notify;...st
3a20: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
3a30: 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
3a40: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
3a50: 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
3a60: 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f  t;...int search_
3a70: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52  active;..CK_ATTR
3a80: 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68  IBUTE_PTR search
3a90: 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e  _query;..CK_ULON
3aa0: 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  G search_query_c
3ab0: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
3ac0: 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72  long search_curr
3ad0: 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f  _id;...int sign_
3ae0: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
3af0: 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f  ANISM_TYPE sign_
3b00: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42  mechanism;..CK_B
3b10: 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66  YTE_PTR sign_buf
3b20: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
3b30: 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75   sign_buflen;..u
3b40: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
3b50: 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75  n_bufused;..stru
3b60: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
3b70: 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74  ty *sign_identit
3b80: 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74  y;...int decrypt
3b90: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
3ba0: 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72  HANISM_TYPE decr
3bb0: 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ypt_mechanism;..
3bc0: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72  CK_VOID_PTR decr
3bd0: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09  ypt_mech_parm;..
3be0: 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74  CK_ULONG decrypt
3bf0: 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09  _mech_parmlen;..
3c00: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
3c10: 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f  entity *decrypt_
3c20: 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74  identity;.};..st
3c30: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
3c40: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
3c50: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
3c60: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
3c70: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
3c80: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
3c90: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
3ca0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
3cb0: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
3cc0: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a  n_need_hw_lock;.
3cd0: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
3ce0: 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b  ;...CK_FLAGS tok
3cf0: 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69  en_flags;...unsi
3d00: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
3d10: 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  ;...DWORD protoc
3d20: 6f 6c 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20  ol;.};..typedef 
3d30: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54  enum {..CACKEY_T
3d40: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d  LV_APP_GENERIC =
3d50: 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54   0x01,..CACKEY_T
3d60: 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d  LV_APP_SKI     =
3d70: 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54   0x02,..CACKEY_T
3d80: 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d  LV_APP_PKI     =
3d90: 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74   0x04.} cackey_t
3da0: 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70  lv_apptype;..typ
3db0: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
3dc0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
3dd0: 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20  NERALINFO       
3de0: 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x2000,..CACKE
3df0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50  Y_TLV_OBJID_PROP
3e00: 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20  ERSONALINFO   = 
3e10: 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2100,..CACKEY_
3e20: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53  TLV_OBJID_ACCESS
3e30: 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78  CONTROL     = 0x
3e40: 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  3000,..CACKEY_TL
3e50: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20  V_OBJID_LOGIN   
3e60: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30            = 0x40
3e70: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
3e80: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20  OBJID_CARDINFO  
3e90: 20 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30          = 0x5000
3ea0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
3eb0: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20  JID_BIOMETRICS  
3ec0: 20 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a        = 0x6000,.
3ed0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
3ee0: 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54  D_DIGITALSIGCERT
3ef0: 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43      = 0x7000,..C
3f00: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3f10: 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20  CAC_PERSON      
3f20: 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43    = 0x0200,..CAC
3f30: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3f40: 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20  C_BENEFITS      
3f50: 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45  = 0x0202,..CACKE
3f60: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3f70: 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20  OTHERBENEFITS = 
3f80: 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f  0x0203,..CACKEY_
3f90: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
3fa0: 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78  RSONNEL     = 0x
3fb0: 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0201,..CACKEY_TL
3fc0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43  V_OBJID_CAC_PKIC
3fd0: 45 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32  ERT       = 0x02
3fe0: 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  FE.} cackey_tlv_
3ff0: 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64  objectid;..typed
4000: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
4010: 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
4020: 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43  ESENT    = 1,..C
4030: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30               = 0
4050: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
4060: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20  _GENERIC        
4070: 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50   = -1,..CACKEY_P
4080: 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20  CSC_E_BADPIN    
4090: 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43        = -2,..CAC
40a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
40b0: 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c  D          = -3,
40c0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
40d0: 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20  NEEDLOGIN       
40e0: 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -4,..CACKEY_PC
40f0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
4100: 20 20 20 20 20 3d 20 2d 36 0a 7d 20 63 61 63 6b       = -6.} cack
4110: 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20  ey_ret;..struct 
4120: 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75  cackey_tlv_cardu
4130: 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  rl {..unsigned c
4140: 68 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35  har        rid[5
4150: 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61  ];..cackey_tlv_a
4160: 70 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65  pptype   apptype
4170: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  ;..cackey_tlv_ob
4180: 6a 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64  jectid  objectid
4190: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  ;..cackey_tlv_ob
41a0: 6a 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09  jectid  appid;..
41b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20  unsigned char   
41c0: 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a       pinid;.};..
41d0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
41e0: 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74  v_entity;.struct
41f0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
4200: 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61  ty {..uint8_t ta
4210: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74  g;..size_t lengt
4220: 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76  h;...union {...v
4230: 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74  oid *value;...st
4240: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
4250: 63 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63  cardurl *value_c
4260: 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f  ardurl;...uint8_
4270: 74 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d  t value_byte;..}
4280: 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
4290: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e  y_tlv_entity *_n
42a0: 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b  ext;.};../* CACK
42b0: 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65  EY Global Handle
42c0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
42d0: 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b   *cackey_biglock
42e0: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
42f0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
4300: 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73  ssion cackey_ses
4310: 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74  sions[128];.stat
4320: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
4330: 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f  _slot cackey_slo
4340: 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ts[128];.static 
4350: 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69  int cackey_initi
4360: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74  alized = 0;.stat
4370: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69  ic int cackey_bi
4380: 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a  glock_init = 0;.
4390: 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f  CK_C_INITIALIZE_
43a0: 41 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73  ARGS cackey_args
43b0: 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61  ;../* PCSC Globa
43c0: 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61  l Handles */.sta
43d0: 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45  tic LPSCARDCONTE
43e0: 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  XT cackey_pcsc_h
43f0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73  andle = NULL;..s
4400: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
4410: 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65  ong cackey_getve
4420: 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73  rsion(void) {..s
4430: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
4440: 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35  ong retval = 255
4450: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
4460: 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73   major = 0;..uns
4470: 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72  igned long minor
4480: 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a   = 0;..char *maj
4490: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09  or_str = NULL;..
44a0: 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20  char *minor_str 
44b0: 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59  = NULL;...CACKEY
44c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
44d0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
44e0: 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b  retval != 255) {
44f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4500: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
4510: 67 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29  g 0x%lx (cached)
4520: 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  .", retval);....
4530: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
4540: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b  .}...retval = 0;
4550: 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45  ..#ifdef PACKAGE
4560: 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20  _VERSION.       
4570: 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43   major_str = PAC
4580: 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69  KAGE_VERSION;..i
4590: 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a  f (major_str) {.
45a0: 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d  .        major =
45b0: 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73   strtoul(major_s
45c0: 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20  tr, &minor_str, 
45d0: 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f  10);....if (mino
45e0: 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f  r_str) {....mino
45f0: 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f  r = strtoul(mino
4600: 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c  r_str + 1, NULL,
4610: 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72   10);...}..}...r
4620: 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c  etval = (major <
4630: 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c  < 16) | (minor <
4640: 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  < 8);.#endif...C
4650: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4660: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78  TF("Returning 0x
4670: 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  %lx", retval);..
4680: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
4690: 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c  .}../* PC/SC Rel
46a0: 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a  ated Functions *
46b0: 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  /./*. * SYNPOSIS
46c0: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63  . *     void cac
46d0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
46e0: 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a  nect_all(void);.
46f0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
4700: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
4710: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
4720: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
4730: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
4740: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63  is function disc
4750: 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c  onnects from all
4760: 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73   cards.. *. */.s
4770: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
4780: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
4790: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09  ct_all(void) {..
47a0: 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09  uint32_t idx;...
47b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
47c0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
47d0: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
47e0: 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
47f0: 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
4800: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
4810: 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
4820: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
4830: 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61  ots[idx].pcsc_ca
4840: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
4850: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4860: 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69 73  PRINTF("SCardDis
4870: 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61 6c  connect(%lu) cal
4880: 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  led", (unsigned 
4890: 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09 09  long) idx);.....
48a0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
48b0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
48c0: 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ].pcsc_card, SCA
48d0: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
48e0: 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
48f0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
4900: 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  el) {....free(ca
4910: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
4920: 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b  label);.....cack
4930: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
4940: 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  bel = NULL;...}.
4950: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
4960: 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63  idx].pcsc_card_c
4970: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09  onnected = 0;...
4980: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
4990: 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ].transaction_de
49a0: 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  pth = 0;...cacke
49b0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
49c0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
49d0: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66  _lock = 0;....if
49e0: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
49f0: 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
4a00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
4a10: 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63  INTF("Marking ac
4a20: 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73  tive slot %lu as
4a30: 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28   being reset", (
4a40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
4a50: 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  dx);...}....cack
4a60: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c  ey_slots[idx].sl
4a70: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d  ot_reset = 1;..}
4a80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4a90: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
4aa0: 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  g");...return;.}
4ab0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
4ac0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
4ad0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  et cackey_pcsc_c
4ae0: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a  onnect(void);. *
4af0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
4b00: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
4b10: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
4b20: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
4b30: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
4b40: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
4b50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
4b60: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
4b70: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
4b80: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
4b90: 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68  n connects to th
4ba0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
4bb0: 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75  on Manager and u
4bc0: 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20  pdates the. *   
4bd0: 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e    global handle.
4be0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
4bf0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
4c00: 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f  _pcsc_connect(vo
4c10: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72  id) {..LONG scar
4c20: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4c30: 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  t;.#ifdef HAVE_S
4c40: 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45  CARDISVALIDCONTE
4c50: 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69  XT..LONG scard_i
4c60: 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64  svalid_ret;.#end
4c70: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
4c80: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
4c90: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
4ca0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
4cb0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
4cc0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
4cd0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
4ce0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
4cf0: 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65  e));...if (cacke
4d00: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
4d10: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b   NULL) {....CACK
4d20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4d30: 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28  "Call to malloc(
4d40: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  ) failed, return
4d50: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
4d60: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
4d70: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
4d80: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
4d90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
4da0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
4db0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4dc0: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69  TF("SCardEstabli
4dd0: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  shContext() call
4de0: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73  ed");...scard_es
4df0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  t_context_ret = 
4e00: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
4e10: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50  ntext(SCARD_SCOP
4e20: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20  E_SYSTEM, NULL, 
4e30: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73  NULL, cackey_pcs
4e40: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20  c_handle);...if 
4e50: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
4e60: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
4e70: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
4e80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4e90: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61  NTF("Call to SCa
4ea0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
4eb0: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72  xt failed (retur
4ec0: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74  ned %s/%li), ret
4ed0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
4ee0: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e", CACKEY_DEBUG
4ef0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4f00: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f  O_STR(scard_est_
4f10: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c  context_ret), (l
4f20: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63  ong) scard_est_c
4f30: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09  ontext_ret);....
4f40: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
4f50: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61  c_handle);....ca
4f60: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
4f70: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63   = NULL;.....cac
4f80: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
4f90: 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09  nect_all();.....
4fa0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
4fb0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
4fc0: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41  .}..}..#ifdef HA
4fd0: 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43  VE_SCARDISVALIDC
4fe0: 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44  ONTEXT..CACKEY_D
4ff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
5000: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
5010: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63  () called");..sc
5020: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20  ard_isvalid_ret 
5030: 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f  = SCardIsValidCo
5040: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63  ntext(*cackey_pc
5050: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20  sc_handle);..if 
5060: 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72  (scard_isvalid_r
5070: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
5080: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
5090: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
50a0: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d  Handle has becom
50b0: 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64  e invalid (SCard
50c0: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d  IsValidContext =
50d0: 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67   %s/%li), trying
50e0: 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68   to re-establish
50f0: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ...", CACKEY_DEB
5100: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
5110: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73  _TO_STR(scard_is
5120: 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e  valid_ret), (lon
5130: 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  g) scard_isvalid
5140: 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  _ret);....CACKEY
5150: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
5160: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
5170: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
5180: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  ...scard_est_con
5190: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
51a0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
51b0: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53  (SCARD_SCOPE_SYS
51c0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  TEM, NULL, NULL,
51d0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
51e0: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72  dle);...if (scar
51f0: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
5200: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
5210: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
5220: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5230: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74  Call to SCardEst
5240: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61  ablishContext fa
5250: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25  iled (returned %
5260: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e  s/%li), returnin
5270: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43  g in failure", C
5280: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
5290: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
52a0: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
52b0: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  xt_ret), (long) 
52c0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
52d0: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65  t_ret);.....free
52e0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
52f0: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  dle);....cackey_
5300: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
5310: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  LL;.....cackey_s
5320: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
5330: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
5340: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
5350: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
5360: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5370: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73  INTF("Handle has
5380: 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69   been re-establi
5390: 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69  shed");..}.#endi
53a0: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
53b0: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
53c0: 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74  ully connected t
53d0: 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69  o PC/SC, returni
53e0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
53f0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5400: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
5410: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
5420: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
5430: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73   cackey_pcsc_dis
5440: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20  connect(void);. 
5450: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
5460: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
5470: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
5480: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
5490: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
54a0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
54b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
54c0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
54d0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
54e0: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
54f0: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66  on disconnects f
5500: 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f  rom the PC/SC Co
5510: 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72  nnection manager
5520: 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20   and updates. * 
5530: 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68      the global h
5540: 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  andle.. *. */.st
5550: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
5560: 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
5570: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09  onnect(void) {..
5580: 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63  LONG scard_rel_c
5590: 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41  ontext_ret;...CA
55a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
55b0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
55c0: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
55d0: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
55e0: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  {...return(CACKE
55f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
5600: 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  ...scard_rel_con
5610: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
5620: 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a  ReleaseContext(*
5630: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5640: 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  le);...if (cacke
5650: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b  y_pcsc_handle) {
5660: 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
5670: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09  csc_handle);....
5680: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
5690: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  dle = NULL;..}..
56a0: 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f 63  .if (scard_rel_c
56b0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
56c0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
56d0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
56e0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
56f0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41  ;..}...return(CA
5700: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
5710: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
5720: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
5730: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
5740: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
5750: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
5760: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
5770: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
5780: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
5790: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
57a0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
57b0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
57c0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
57d0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
57e0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
57f0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
5800: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
5810: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
5820: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
5830: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
5840: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
5850: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
5860: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5870: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
5880: 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
5890: 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72  t_ret;..DWORD pr
58a0: 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63  otocol;..LONG sc
58b0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
58c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
58d0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
58e0: 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09  ..if (!slot) {..
58f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5900: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c  INTF("Invalid sl
5910: 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  ot specified, re
5920: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
5930: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
5940: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5950: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
5960: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
5970: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
5980: 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63  ect();..if (pcsc
5990: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
59a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
59b0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
59c0: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
59d0: 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
59e0: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
59f0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
5a00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5a10: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
5a20: 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74  ..}.../* Connect
5a30: 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e   to reader, if n
5a40: 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73  eeded */..if (!s
5a50: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
5a60: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 73 6c  onnected) {...sl
5a70: 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 30  ot->protocol = 0
5a80: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
5a90: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
5aa0: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
5ab0: 64 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  d", slot->pcsc_r
5ac0: 65 61 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f  eader);...scard_
5ad0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
5ae0: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
5af0: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
5b00: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
5b10: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
5b20: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
5b30: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
5b40: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
5b50: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
5b60: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
5b70: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
5b80: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
5b90: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43  MISMATCH) {....C
5ba0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5bb0: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
5bc0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
5bd0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
5be0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
5bf0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 73 63  just T=0")....sc
5c00: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
5c10: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
5c20: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
5c30: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
5c40: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
5c50: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
5c60: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
5c70: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
5c80: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20  otocol);.....if 
5c90: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
5ca0: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
5cb0: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
5cc0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5cd0: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
5ce0: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
5cf0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
5d00: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
5d10: 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09  h just T=1")....
5d20: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
5d30: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
5d40: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
5d50: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
5d60: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
5d70: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
5d80: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
5d90: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
5da0: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d  &protocol);....}
5db0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
5dc0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
5dd0: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
5de0: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
5df0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5e00: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
5e10: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 57 5f  eturned SCARD_W_
5e20: 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 2c 20  UNPOWERED_CARD, 
5e30: 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e  trying to re-con
5e40: 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  nect...");.....s
5e50: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
5e60: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
5e70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5e80: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
5e90: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
5ea0: 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44 5f 50  _DIRECT, SCARD_P
5eb0: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
5ec0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
5ed0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
5ee0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
5ef0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
5f00: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
5f10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
5f20: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
5f30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
5f40: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
5f50: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
5f60: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
5f70: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
5f80: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
5f90: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
5fa0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
5fb0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
5fc0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
5fd0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
5fe0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
5ff0: 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  0, &slot->pcsc_c
6000: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
6010: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
6020: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
6030: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
6040: 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  CH) {......CACKE
6050: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6060: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
6070: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
6080: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
6090: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
60a0: 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63 61 72   T=1")......scar
60b0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
60c0: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
60d0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
60e0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
60f0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
6100: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
6110: 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e  OCOL_T1, &slot->
6120: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74  pcsc_card, &prot
6130: 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  ocol);.....}....
6140: 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  }.....scard_conn
6150: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f  _ret = SCardReco
6160: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
6170: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41  _card, SCARD_SHA
6180: 52 45 5f 53 48 41 52 45 44 2c 20 70 72 6f 74 6f  RE_SHARED, proto
6190: 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54  col, SCARD_RESET
61a0: 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f 63 6f 6c  _CARD, &protocol
61b0: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
61c0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
61d0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
61e0: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
61f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6200: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
6210: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
6220: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
6230: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
6240: 73 74 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61  st T=0").....sca
6250: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
6260: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
6270: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
6280: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
6290: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
62a0: 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T0, SCARD_RESET
62b0: 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f 63 6f 6c  _CARD, &protocol
62c0: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
62d0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
62e0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
62f0: 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43  ATCH) {......CAC
6300: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6310: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
6320: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
6330: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
6340: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
6350: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09  just T=1")......
6360: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
6370: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
6380: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
6390: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
63a0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
63b0: 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45  COL_T1, SCARD_RE
63c0: 53 45 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f  SET_CARD, &proto
63d0: 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  col);.....}....}
63e0: 0a 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ....}....if (sca
63f0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53  rd_conn_ret != S
6400: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
6410: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
6420: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
6430: 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69  tion to card fai
6440: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
6450: 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64  n failure (SCard
6460: 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25  Connect() = %s/%
6470: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
6480: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
6490: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f  _TO_STR(scard_co
64a0: 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  nn_ret), (long) 
64b0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
64c0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
64d0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
64e0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d  C);...}....slot-
64f0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
6500: 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74  cted = 1;...slot
6510: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
6520: 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d  pth = 0;...slot-
6530: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
6540: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
6550: 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20  .slot->protocol 
6560: 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a  = protocol;..}..
6570: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6580: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6590: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
65a0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
65b0: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
65c0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
65d0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
65e0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
65f0: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
6600: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
6610: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
6620: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
6630: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
6640: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
6650: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
6660: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
6670: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
6680: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
6690: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
66a0: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
66b0: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
66c0: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
66d0: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
66e0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
66f0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
6700: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
6710: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
6720: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6730: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
6740: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
6750: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
6760: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
6770: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6780: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
6790: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
67a0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
67b0: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
67c0: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
67d0: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
67e0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
67f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6800: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
6810: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
6820: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
6830: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
6840: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6850: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
6860: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
6870: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
6880: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
6890: 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f  epth > 1 && !slo
68a0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
68b0: 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09  eed_hw_lock) {..
68c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
68d0: 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e  INTF("Already in
68e0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
68f0: 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63  performing no ac
6900: 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20  tion (new depth 
6910: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
6920: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
6930: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6940: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
6950: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
6960: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
6970: 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f  ck = 0;...scard_
6980: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
6990: 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  dBeginTransactio
69a0: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
69b0: 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  d);..if (scard_t
69c0: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
69d0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
69e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
69f0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
6a00: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
6a10: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
6a20: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
6a30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6a40: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
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 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
6a70: 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69   began transacti
6a80: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22  on on slot (%s)"
6a90: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
6aa0: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  der);...return(C
6ab0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
6ac0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
6ad0: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
6ae0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64  y_ret cackey_end
6af0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
6b00: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
6b10: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
6b20: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
6b30: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6b40: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
6b50: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
6b60: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
6b70: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
6b80: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
6b90: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
6ba0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
6bb0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
6bc0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
6bd0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71  his function req
6bf0: 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65  uires "cackey_be
6c00: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  gin_transaction"
6c10: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69   to be called fi
6c20: 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rst. *. */.stati
6c30: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
6c40: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
6c50: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
6c60: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
6c70: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e  .LONG scard_tran
6c80: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  s_ret;...CACKEY_
6c90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6ca0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
6cb0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
6cc0: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43  connected) {...C
6cd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6ce0: 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20  TF("Card is not 
6cf0: 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c  connected, unabl
6d00: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63  e to end transac
6d10: 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a  tion on card");.
6d20: 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
6d30: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
6d40: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
6d50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65  DEBUG_PRINTF("De
6d60: 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63  creasing transac
6d70: 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61  tion depth and a
6d80: 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64  sking for a hard
6d90: 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ware lock on the
6da0: 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e   next begin tran
6db0: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74  saction (current
6dc0: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
6dd0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
6de0: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f  _depth);.....slo
6df0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
6e00: 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28  epth--;.....if (
6e10: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
6e20: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
6e30: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
6e40: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
6e50: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a  k = 1;....}...}.
6e60: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6e70: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
6e80: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
6e90: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
6ea0: 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  th == 0) {...CAC
6eb0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6ec0: 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20  ("Terminating a 
6ed0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
6ee0: 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22   has not begun!"
6ef0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
6f00: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6f10: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
6f20: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
6f30: 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h--;...if (slot-
6f40: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
6f50: 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b  th > 0) {...CACK
6f60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6f70: 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74  "Transactions st
6f80: 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ill in progress,
6f90: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67   not terminating
6fa0: 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63   on-card Transac
6fb0: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
6fc0: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
6fd0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
6fe0: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
6ff0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7000: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72  );..}...scard_tr
7010: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ans_ret = SCardE
7020: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  ndTransaction(sl
7030: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7040: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
7050: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
7060: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
7070: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
7080: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7090: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e  TF("Unable to en
70a0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  d transaction, r
70b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
70c0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
70d0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
70e0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
70f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7100: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72  "Sucessfully ter
7110: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74  minated transact
7120: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
7130: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
7140: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
7150: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7160: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65  );.}../* APDU Re
7170: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
7180: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
7190: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
71a0: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
71b0: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
71c0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
71d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
71e0: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
71f0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
7200: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
7210: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
7220: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  2, unsigned char
7230: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   lc, unsigned ch
7240: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e  ar *data, unsign
7250: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74  ed char le, uint
7260: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
7270: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
7280: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
7290: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  *respdata_len);.
72a0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
72b0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
72c0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
72d0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
72e0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
72f0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
7300: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20  char class. *   
7310: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73        APDU Class
7320: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53   (GSCIS_CLASS_IS
7330: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43  O7816 or GSCIS_C
7340: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
7350: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20  FORM. *         
7360: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a  usually), (CLA).
7370: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
7380: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
7390: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41  ion. *         A
73a0: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20  PDU Instruction 
73b0: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20  (INS). *. *     
73c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
73d0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
73e0: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31   Parameter 1 (P1
73f0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
7400: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20  gned char p2. * 
7410: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
7420: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a  ameter 2 (P2). *
7430: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
7440: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20   char lc. *     
7450: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
7460: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20  of Content (Lc) 
7470: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
7480: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a  ength of "data".
7490: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d   *         param
74a0: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22  eter.  If "data"
74b0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
74c0: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61   NULL, this para
74d0: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20  meter will. *   
74e0: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64        be ignored
74f0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
7500: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a  gned char *data.
7510: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74   *         Point
7520: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20  er to buffer to 
7530: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64  send.  It should
7540: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c   be "Lc" bytes l
7550: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ong.  If. *     
7560: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
7570: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c   NULL, "Lc" will
7580: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e   not be sent, an
7590: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69  d this buffer wi
75a0: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20  ll be. *        
75b0: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20   ignored.. *. * 
75c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
75d0: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20  r le. *         
75e0: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45  APDU Length of E
75f0: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20  xpectation (Le) 
7600: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
7610: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20  ength of the. * 
7620: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64          expected
7630: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73   reply.  If this
7640: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
7650: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20   0 then it will 
7660: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62  not. *         b
7670: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20  e sent.. *. *   
7680: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70    uint16_t *resp
7690: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20  code. *         
76a0: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
76b0: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
76c0: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20   response code. 
76d0: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
76e0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
76f0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
7700: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c  sponse code will
7710: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
7720: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
7730: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
7740: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
7750: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
7760: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
7770: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20  ponse data.  If 
7780: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
7790: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
77a0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
77b0: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20  se data will be 
77c0: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20  discarded.  If. 
77d0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72  *         the "r
77e0: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72  espdata_len" par
77f0: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66  ameter is specif
7800: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69  ied as NULL, thi
7810: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20  s buffer. *     
7820: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20      will not be 
7830: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20  updated.. *. *  
7840: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64     size_t *respd
7850: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  ata_len. *      
7860: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69     [IN, OUT] Poi
7870: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20  nter initialing 
7880: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
7890: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70  ize of the "resp
78a0: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20  data". *        
78b0: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65   buffer.  Before
78c0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20   returning, the 
78d0: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65  pointed to value
78e0: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74   is updated to t
78f0: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75  he. *         nu
7900: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
7910: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66  itten to the buf
7920: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73  fer.  If this is
7930: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a   specified as. *
7940: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69           NULL, i
7950: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  t will not be up
7960: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70  dated, and "resp
7970: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67  data" will be ig
7980: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a  nored causing. *
7990: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
79a0: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65  ponse data to be
79b0: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
79c0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
79d0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
79e0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  C_S_OK          
79f0: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
7a00: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
7a10: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e  _GENERIC      On
7a20: 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41   error. *     CA
7a30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
7a40: 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65 20  NABSENT  If the 
7a50: 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62  sending failed b
7a60: 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e  ecause the token
7a70: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20   is. *          
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a90: 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a        absent. *.
7aa0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
7ab0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  This function wi
7ac0: 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68  ll connect to th
7ad0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
7ae0: 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20  on Manager via. 
7af0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73  *     cackey_pcs
7b00: 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e  c_connect() if n
7b10: 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  eeded.. *. *    
7b20: 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74   It will connect
7b30: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20   to the card in 
7b40: 74 68 65 20 72 65 61 64 65 72 20 61 74 74 61 63  the reader attac
7b50: 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a  hed to the slot.
7b60: 20 2a 20 20 20 20 20 73 70 65 63 69 66 69 65 64   *     specified
7b70: 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e  .  It will recon
7b80: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
7b90: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
7ba0: 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61  on. *     goes a
7bb0: 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  way.. *. */.stat
7bc0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
7bd0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
7be0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7bf0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
7c00: 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e  d char class, un
7c10: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
7c20: 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65  ruction, unsigne
7c30: 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67  d char p1, unsig
7c40: 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73  ned char p2, uns
7c50: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75  igned char lc, u
7c60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7c70: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ta, unsigned cha
7c80: 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  r le, uint16_t *
7c90: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
7ca0: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
7cb0: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
7cc0: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74  ata_len) {..uint
7cd0: 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69  8_t major_rc, mi
7ce0: 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20  nor_rc;..size_t 
7cf0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74  bytes_to_copy, t
7d00: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
7d10: 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52 45  ..LPCSCARD_IO_RE
7d20: 51 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63 69  QUEST pioSendPci
7d30: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
7d40: 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c  l;..DWORD xmit_l
7d50: 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c  en, recv_len;..L
7d60: 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ONG scard_xmit_r
7d70: 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e  et, scard_reconn
7d80: 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74  _ret;..BYTE xmit
7d90: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76  _buf[1024], recv
7da0: 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74  _buf[1024];..int
7db0: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
7dc0: 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f  t, pcsc_getresp_
7dd0: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 2c 20 72  ret;..int idx, r
7de0: 65 74 72 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  etry;...CACKEY_D
7df0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
7e00: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
7e10: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
7e20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
7e30: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
7e40: 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  fied.");....retu
7e50: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7e60: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
7e70: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7e80: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
7e90: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
7ea0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
7eb0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
7ec0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
7ed0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7ee0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
7ef0: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
7f00: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7f10: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7f20: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7f30: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  ERIC);..}.../* D
7f40: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70  etermine which p
7f50: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
7f60: 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68  using */..switch
7f70: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
7f80: 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ) {...case SCARD
7f90: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
7fa0: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
7fb0: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
7fc0: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43  break;...case SC
7fd0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a  ARD_PROTOCOL_T1:
7fe0: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
7ff0: 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a   SCARD_PCI_T1;..
8000: 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61  ...break;...defa
8010: 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ult:....CACKEY_D
8020: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
8030: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f  alid protocol fo
8040: 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29  und, aborting.")
8050: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
8060: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8070: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61  IC);..}.../* Tra
8080: 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c  nsmit */..xmit_l
8090: 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75  en = 0;..xmit_bu
80a0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
80b0: 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66  class;..xmit_buf
80c0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69  [xmit_len++] = i
80d0: 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69  nstruction;..xmi
80e0: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
80f0: 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75  ] = p1;..xmit_bu
8100: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
8110: 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b  p2;..if (data) {
8120: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
8130: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
8140: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
8150: 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b  x < lc; idx++) {
8160: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
8170: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b  t_len++] = data[
8180: 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  idx];...}..}...i
8190: 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b  f (le != 0x00) {
81a0: 0a 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
81b0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d  _len++] = le;..}
81c0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
81d0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
81e0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
81f0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
8200: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73  lot);...if (clas
8210: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  s == GSCIS_CLASS
8220: 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74  _ISO7816 && inst
8230: 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53  ruction == GSCIS
8240: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26  _INSTR_VERIFY &&
8250: 20 70 31 20 3d 3d 20 30 78 30 30 20 26 26 20 70   p1 == 0x00 && p
8260: 32 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43  2 == 0x00) {...C
8270: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8280: 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  TF("Sending APDU
8290: 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29  : <<censored>>")
82a0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
82b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
82c0: 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44  BUF("Sending APD
82d0: 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  U:", xmit_buf, x
82e0: 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  mit_len);..}...r
82f0: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
8300: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 66 6f 72  (recv_buf);..for
8310: 20 28 72 65 74 72 79 20 3d 20 30 3b 20 72 65 74   (retry = 0; ret
8320: 72 79 20 3c 20 31 30 3b 20 72 65 74 72 79 2b 2b  ry < 10; retry++
8330: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
8340: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
8350: 6e 67 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74  ng SCardTransmit
8360: 28 29 22 29 3b 0a 09 09 73 63 61 72 64 5f 78 6d  ()");...scard_xm
8370: 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72  it_ret = SCardTr
8380: 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73  ansmit(slot->pcs
8390: 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50  c_card, pioSendP
83a0: 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  ci, xmit_buf, xm
83b0: 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65  it_len, NULL, re
83c0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
83d0: 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  n);....if (scard
83e0: 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41  _xmit_ret == SCA
83f0: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
8400: 54 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  TED) {....CACKEY
8410: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
8420: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
8430: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
8440: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
8450: 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 72 65 74 72  /%lx), will retr
8460: 79 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  y...", CACKEY_DE
8470: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
8480: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
8490: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
84a0: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
84b0: 78 6d 69 74 5f 72 65 74 29 3b 0a 09 09 7d 20 65  xmit_ret);...} e
84c0: 6c 73 65 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a  lse {....break;.
84d0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  ..}..}...if (sca
84e0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
84f0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
8500: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8510: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
8520: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
8530: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
8540: 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22  mit() = %s/%lx)"
8550: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
8560: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
8570: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
8580: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et), (unsigned l
8590: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
85a0: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
85b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
85c0: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61  rking slot as ha
85d0: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22  ving been reset"
85e0: 29 3b 0a 09 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f  );...slot->slot_
85f0: 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 69 66  reset = 1;....if
8600: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
8610: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45   == SCARD_W_RESE
8620: 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  T_CARD) {....CAC
8630: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8640: 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64  ("Reset required
8650: 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e  , please hold...
8660: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65  ");.....scard_re
8670: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
8680: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
8690: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
86a0: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
86b0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
86c0: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
86d0: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T1, SCARD_RESE
86e0: 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f 63 6f  T_CARD, &protoco
86f0: 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64  l);....if (scard
8700: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
8710: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
8720: 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20  {...../* Update 
8730: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09  protocol */.....
8740: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
8750: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73   protocol;.....s
8760: 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f  witch (slot->pro
8770: 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61  tocol) {......ca
8780: 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  se SCARD_PROTOCO
8790: 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70 69 6f 53  L_T0:.......pioS
87a0: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
87b0: 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62 72  CI_T0;........br
87c0: 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 53  eak;......case S
87d0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
87e0: 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50  :.......pioSendP
87f0: 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54  ci = SCARD_PCI_T
8800: 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  1;........break;
8810: 0a 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  ......default:..
8820: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
8830: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
8840: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
8850: 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74 65 20 74  , but too late t
8860: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 62  o do anything ab
8870: 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72  out it now -- tr
8880: 79 69 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a  ying anyway.");.
8890: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
88a0: 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65  ..}....../* Re-e
88b0: 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63  stablish transac
88c0: 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20  tion, if it was 
88d0: 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69  present */.....i
88e0: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
88f0: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8900: 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  {......slot->tra
8910: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
8920: 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  ;......slot->tra
8930: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8940: 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09  _lock = 1;......
8950: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
8960: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
8970: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
8980: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8990: 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c  Reset successful
89a0: 2c 20 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67  , retransmitting
89b0: 22 29 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65  ");......recv_le
89c0: 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f  n = sizeof(recv_
89d0: 62 75 66 29 3b 0a 09 09 09 09 73 63 61 72 64 5f  buf);.....scard_
89e0: 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64  xmit_ret = SCard
89f0: 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70  Transmit(slot->p
8a00: 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e  csc_card, pioSen
8a10: 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20  dPci, xmit_buf, 
8a20: 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20  xmit_len, NULL, 
8a30: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
8a40: 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  len);......if (s
8a50: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d  card_xmit_ret !=
8a60: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
8a70: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
8a80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
8a90: 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c  transmit failed,
8aa0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
8ab0: 69 6c 75 72 65 20 61 66 74 65 72 20 64 69 73 63  ilure after disc
8ac0: 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61  onnecting the ca
8ad0: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
8ae0: 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41  t = %s/%li)", CA
8af0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
8b00: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
8b10: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
8b20: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d   (long) scard_xm
8b30: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53  it_ret);.......S
8b40: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
8b50: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8b60: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
8b70: 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63  );......slot->pc
8b80: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
8b90: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20  d = 0;......./* 
8ba0: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
8bb0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
8bc0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
8bd0: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
8be0: 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
8bf0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
8c00: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43  ;.......return(C
8c10: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
8c20: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d  ENABSENT);.....}
8c30: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
8c40: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8c50: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
8c60: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
8c70: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
8c80: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
8c90: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
8ca0: 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70  RD);.....slot->p
8cb0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
8cc0: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20  ed = 0;....../* 
8cd0: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
8ce0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
8cf0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8d00: 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09  on_depth = 1;...
8d10: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
8d20: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
8d30: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
8d40: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
8d50: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8d60: 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
8d70: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
8d80: 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09  ABSENT);....}...
8d90: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
8da0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8db0: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
8dc0: 61 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64  ard");.....SCard
8dd0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
8de0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
8df0: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
8e00: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
8e10: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
8e20: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
8e30: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
8e40: 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72  n */....slot->tr
8e50: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8e60: 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65  = 1;....cackey_e
8e70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8e80: 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  lot);.....CACKEY
8e90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
8ea0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
8eb0: 75 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e  ure");....return
8ec0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
8ed0: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
8ee0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
8ef0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74  UG_PRINTBUF("Ret
8f00: 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72  urned Value:", r
8f10: 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65  ecv_buf, recv_le
8f20: 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c  n);...if (recv_l
8f30: 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d  en < 2) {.../* M
8f40: 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20  inimal response 
8f50: 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79 74 65  length is 2 byte
8f60: 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  s, returning in 
8f70: 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43  failure */...CAC
8f80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8f90: 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73  ("Response too s
8fa0: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
8fb0: 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63 76  in failure (recv
8fc0: 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75  _len = %lu)", (u
8fd0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
8fe0: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45  cv_len);..../* E
8ff0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
9000: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
9010: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
9020: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72  tion(slot);....r
9030: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9040: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9050: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
9060: 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09  result code */..
9070: 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f  major_rc = recv_
9080: 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32  buf[recv_len - 2
9090: 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72  ];..minor_rc = r
90a0: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
90b0: 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70   - 1];..if (resp
90c0: 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63  code) {...*respc
90d0: 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20  ode = (major_rc 
90e0: 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63  << 8) | minor_rc
90f0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74  ;..}.../* Adjust
9100: 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72 20   message buffer 
9110: 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20  */..recv_len -= 
9120: 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65  2;.../* Add byte
9130: 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75  s to return valu
9140: 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61  e */..tmp_respda
9150: 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20  ta_len = 0;..if 
9160: 28 72 65 73 70 64 61 74 61 20 26 26 20 72 65 73  (respdata && res
9170: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74  pdata_len) {...t
9180: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  mp_respdata_len 
9190: 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  = *respdata_len;
91a0: 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
91b0: 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  y = *respdata_le
91c0: 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  n;....if (recv_l
91d0: 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  en < bytes_to_co
91e0: 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  py) {....bytes_t
91f0: 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65  o_copy = recv_le
9200: 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  n;...}....CACKEY
9210: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
9220: 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73  opying %lu bytes
9230: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 28   to the buffer (
9240: 72 65 63 76 27 64 20 25 6c 75 20 62 79 74 65 73  recv'd %lu bytes
9250: 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62  , but only %lu b
9260: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72  ytes left in our
9270: 20 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69   buffer)", (unsi
9280: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73  gned long) bytes
9290: 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67  _to_copy, (unsig
92a0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
92b0: 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
92c0: 6e 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  ng) *respdata_le
92d0: 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65  n);....memcpy(re
92e0: 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66  spdata, recv_buf
92f0: 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
9300: 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20  ;...respdata += 
9310: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
9320: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
9330: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
9340: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
9350: 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f  len -= bytes_to_
9360: 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  copy;..} else {.
9370: 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21  ..if (recv_len !
9380: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
9390: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
93a0: 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75  hrowing away %lu
93b0: 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20   bytes, nowhere 
93c0: 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28  to put them!", (
93d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
93e0: 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d  ecv_len);...}..}
93f0: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
9400: 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20  == 0x61) {.../* 
9410: 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20  We need to READ 
9420: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
9430: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
9440: 20 72 65 61 64 20 72 65 71 75 69 72 65 64 22 29   read required")
9450: 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72  ;....if (minor_r
9460: 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  c == 0x00) {....
9470: 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45  minor_rc = CACKE
9480: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a  Y_APDU_MTU;...}.
9490: 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f  ...pcsc_getresp_
94a0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
94b0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
94c0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
94d0: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  , GSCIS_INSTR_GE
94e0: 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30  T_RESPONSE, 0x00
94f0: 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c  , 0x00, 0, NULL,
9500: 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63   minor_rc, respc
9510: 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26  ode, respdata, &
9520: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
9530: 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65  );...if (pcsc_ge
9540: 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43  tresp_ret != CAC
9550: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
9560: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9570: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
9580: 72 65 61 64 20 66 61 69 6c 65 64 21 20 20 52 65  read failed!  Re
9590: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
95a0: 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64  re");...../* End
95b0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
95c0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
95d0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
95e0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72  ion(slot);.....r
95f0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9600: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
9610: 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74  }....if (respdat
9620: 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73  a_len) {....*res
9630: 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70  pdata_len += tmp
9640: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09  _respdata_len;..
9650: 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  .}..../* End Sma
9660: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
9670: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
9680: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
9690: 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  lot);....CACKEY_
96a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
96b0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
96c0: 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20  ss (buffer read 
96d0: 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72  complete)");...r
96e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
96f0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a  C_S_OK);..}.../*
9700: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
9710: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
9720: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
9730: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
9740: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30  f (major_rc == 0
9750: 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63  x90) {.../* Succ
9760: 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ess */...CACKEY_
9770: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
9780: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
9790: 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30  ss (major_rc = 0
97a0: 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  x90)");....retur
97b0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
97c0: 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  OK);..}....CACKE
97d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
97e0: 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e  APDU Returned an
97f0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e   error, returnin
9800: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
9810: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9820: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
9830: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
9840: 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f  IS. *     ssize_
9850: 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  t cackey_read_bu
9860: 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b  ffer(struct cack
9870: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
9880: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
9890: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75  ffer, size_t cou
98a0: 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nt, unsigned cha
98b0: 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74  r t_or_v, size_t
98c0: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29   initial_offset)
98d0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
98e0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
98f0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
9900: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
9910: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
9920: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
9930: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
9940: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
9950: 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a   [OUT] Buffer. *
9960: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63  . *     size_t c
9970: 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20  ount. *         
9980: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9990: 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  to attempt to re
99a0: 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  ad. *. *     uns
99b0: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
99c0: 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c  v. *         Sel
99d0: 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 65 72  ect the T-buffer
99e0: 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65   (01) or V-buffe
99f0: 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 20 66  r (02) to read f
9a00: 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20  rom.  . *. *    
9a10: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f   size_t initial_
9a20: 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20  offset. *       
9a30: 20 20 53 70 65 63 69 66 79 20 74 68 65 20 6f 66    Specify the of
9a40: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68  fset to begin th
9a50: 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20  e read from. *. 
9a60: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
9a70: 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  E. *     This fu
9a80: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
9a90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
9aa0: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
9ab0: 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72  , or -1 on error
9ac0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
9ad0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
9ae0: 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
9af0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
9b00: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
9b10: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
9b20: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
9b30: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
9b40: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9b50: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
9b60: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b  nitial_offset) {
9b70: 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20  ..size_t offset 
9b80: 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c  = 0, max_offset,
9b90: 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73   max_count;..uns
9ba0: 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32  igned char cmd[2
9bb0: 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  ];..uint16_t res
9bc0: 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64  pcode;..int send
9bd0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
9be0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
9bf0: 6c 65 64 2e 22 29 3b 0a 0a 09 6d 61 78 5f 6f 66  led.");...max_of
9c00: 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d  fset = count;..m
9c10: 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45  ax_count = CACKE
9c20: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66  Y_APDU_MTU;...if
9c30: 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26   (t_or_v != 1 &&
9c40: 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a   t_or_v != 2) {.
9c50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9c60: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54  RINTF("Invalid T
9c70: 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20   or V parameter 
9c80: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72  specified, retur
9c90: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
9ca0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
9cb0: 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20  ;..}...cmd[0] = 
9cc0: 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20  t_or_v;...while 
9cd0: 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73  (1) {...if (offs
9ce0: 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74  et >= max_offset
9cf0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
9d00: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
9d10: 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  er too small, re
9d20: 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20  turning what we 
9d30: 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72  got...");.....br
9d40: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e  eak;...}....coun
9d50: 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d  t = max_offset -
9d60: 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63   offset;...if (c
9d70: 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74  ount > max_count
9d80: 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d  ) {....count = m
9d90: 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09  ax_count;...}...
9da0: 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b  .cmd[1] = count;
9db0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
9dc0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9dd0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
9de0: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
9df0: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  M, GSCIS_INSTR_R
9e00: 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e  EAD_BUFFER, ((in
9e10: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
9e20: 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30  ffset) >> 8) & 0
9e30: 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66  xff, (initial_of
9e40: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26  fset + offset) &
9e50: 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d   0xff, sizeof(cm
9e60: 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26  d), cmd, 0x00, &
9e70: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72  respcode, buffer
9e80: 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e   + offset, &coun
9e90: 74 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  t);...if (send_r
9ea0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
9eb0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20  C_S_OK) {....if 
9ec0: 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
9ed0: 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d  A86) {.....if (m
9ee0: 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b  ax_count == 1) {
9ef0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
9f00: 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e  .}......max_coun
9f10: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20  t = max_count / 
9f20: 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  2;......continue
9f30: 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
9f40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9f50: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
9f60: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
9f70: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
9f80: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
9f90: 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74  );...}....offset
9fa0: 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66   += count;....if
9fb0: 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f   (count < max_co
9fc0: 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  unt) {....CACKEY
9fd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
9fe0: 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75  hort read -- cou
9ff0: 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20  nt = %i, cmd[1] 
a000: 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75  = %i", (int) cou
a010: 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d  nt, (int) cmd[1]
a020: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
a030: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  }..}..#ifdef CAC
a040: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
a050: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
a060: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73  ZE_MAX..if (offs
a070: 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
a080: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
a090: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a0a0: 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d  Offset exceeds m
a0b0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
a0c0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
a0d0: 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
a0e0: 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20  offset = %lu)", 
a0f0: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
a100: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
a110: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29  ed long) offset)
a120: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
a130: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
a140: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
a150: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
a160: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
a170: 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22   read %lu bytes"
a180: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
a190: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74  ) offset);...ret
a1a0: 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a  urn(offset);.}..
a1b0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
a1c0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
a1d0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
a1e0: 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63  pplet(struct cac
a1f0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
a200: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
a210: 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c  id, size_t aid_l
a220: 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  en);. *. * ARGUM
a230: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
a240: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
a250: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
a260: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
a270: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
a280: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
a290: 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20   *aid. *        
a2a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
a2b0: 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20  ng Applet ID to 
a2c0: 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20  select. *. *    
a2d0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a   size_t aid_len.
a2e0: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
a2f0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
a300: 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20  e "aid" (Applet 
a310: 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a  ID) parameter. *
a320: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
a330: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
a340: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
a350: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
a360: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
a370: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
a380: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
a390: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
a3a0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
a3b0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
a3c0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
a3d0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
a3e0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
a3f0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
a400: 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20  aid_len) {..int 
a410: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
a420: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a430: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
a440: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a450: 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61  BUF("Selecting a
a460: 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69  pplet:", aid, ai
a470: 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72  d_len);...send_r
a480: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
a490: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
a4a0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
a4b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
a4c0: 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d  ECT, GSCIS_PARAM
a4d0: 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20  _SELECT_APPLET, 
a4e0: 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61  0x00, aid_len, a
a4f0: 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  id, 0x00, NULL, 
a500: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
a510: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
a520: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
a530: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a540: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
a550: 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20  to open applet, 
a560: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
a570: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
a580: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
a590: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
a5a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a5b0: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
a5c0: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29   selected file")
a5d0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
a5e0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
a5f0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
a600: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
a610: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
a620: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
a630: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
a640: 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a  int16_t ef);. *.
a650: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
a660: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
a670: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
a680: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
a690: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
a6a0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31  . *. *     uint1
a6b0: 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20  6_t ef. *       
a6c0: 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65    Elemental File
a6d0: 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a   to select. *. *
a6e0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
a6f0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
a700: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
a710: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
a720: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
a730: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
a740: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
a750: 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 74       This select
a760: 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20  s an Elementary 
a770: 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20  File (EF) under 
a780: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65  the currently se
a790: 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65  lected. *     De
a7a0: 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 46  dicated File (DF
a7b0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69  ). *. *     Typi
a7c0: 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61  cally this is ca
a7d0: 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 63  lled after selec
a7e0: 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74  ting the correct
a7f0: 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20   Applet (using. 
a800: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c  *     cackey_sel
a810: 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20  ect_applet) for 
a820: 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a  VM cards. *. */.
a830: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
a840: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
a850: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
a860: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
a870: 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75  int16_t ef) {..u
a880: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 64  nsigned char fid
a890: 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65  _buf[2];..int se
a8a0: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
a8b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
a8c0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f  alled.");.../* O
a8d0: 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61  pen the elementa
a8e0: 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f  ry file */..fid_
a8f0: 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20  buf[0] = (ef >> 
a900: 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f  8) & 0xff;..fid_
a910: 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78  buf[1] = ef & 0x
a920: 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ff;...CACKEY_DEB
a930: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63  UG_PRINTF("Selec
a940: 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78  ting file: %04lx
a950: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
a960: 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72  g) ef);...send_r
a970: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
a980: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
a990: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
a9a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
a9b0: 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c  ECT, 0x02, 0x0C,
a9c0: 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29   sizeof(fid_buf)
a9d0: 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c  , fid_buf, 0x00,
a9e0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
a9f0: 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  L);..if (send_re
aa00: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
aa10: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
aa20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
aa30: 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66  Failed to open f
aa40: 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ile, returning i
aa50: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
aa60: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
aa70: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
aa80: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
aa90: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
aaa0: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
aab0: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
aac0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
aad0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
aae0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
aaf0: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76   cackey_free_tlv
ab00: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  (struct cackey_t
ab10: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29  lv_entity *root)
ab20: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
ab30: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
ab40: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
ab50: 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20  y *root. *      
ab60: 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54     Root of the T
ab70: 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74  LV list to start
ab80: 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52   freeing. *. * R
ab90: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
aba0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f     None. *. * NO
abb0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
abc0: 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74  function frees t
abd0: 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69  he TLV linked li
abe0: 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 72  sted returned fr
abf0: 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65  om. *     "cacke
ac00: 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20  y_read_tlv". *. 
ac10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
ac20: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
ac30: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
ac40: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b  _entity *root) {
ac50: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
ac60: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
ac70: 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72  , *next;...if (r
ac80: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
ac90: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
aca0: 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20  r (curr = root; 
acb0: 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78  curr; curr = nex
acc0: 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75  t) {...next = cu
acd0: 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77  rr->_next;....sw
ace0: 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29  itch (curr->tag)
acf0: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
ad00: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
ad10: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ad20: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
ad30: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
ad40: 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  ue) {......free(
ad50: 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09  curr->value);...
ad60: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
ad70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
ad80: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66  _CARDURL:.....if
ad90: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61   (curr->value_ca
ada0: 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72  rdurl) {......fr
adb0: 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  ee(curr->value_c
adc0: 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09  ardurl);.....}..
add0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
ade0: 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a  .free(curr);..}.
adf0: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
ae00: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
ae10: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
ae20: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
ae30: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
ae40: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
ae50: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
ae60: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
ae70: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
ae80: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
ae90: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
aea0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
aeb0: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75  t *slot) {..stru
aec0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
aed0: 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74  tity *curr_entit
aee0: 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c  y, *root = NULL,
aef0: 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09   *last = NULL;..
af00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c  unsigned char tl
af10: 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f  en_buf[2], tval_
af20: 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c  buf[1024], *tval
af30: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
af40: 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76   vlen_buf[2], vv
af50: 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76  al_buf[8192], *v
af60: 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  val;..unsigned c
af70: 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e  har *tmpbuf;..un
af80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62  signed long tmpb
af90: 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20  uflen;..ssize_t 
afa0: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
afb0: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
afc0: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
afd0: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
afe0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
aff0: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
b000: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
b010: 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63  VE_LIBZ..int unc
b020: 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e  ompress_ret;.#en
b030: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
b040: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
b050: 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74  d.");...read_ret
b060: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
b070: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e  uffer(slot, tlen
b080: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65  _buf, sizeof(tle
b090: 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65  n_buf), 1, offse
b0a0: 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_t);..if (read_
b0b0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c  ret != sizeof(tl
b0c0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
b0d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b0e0: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
b0f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b100: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
b110: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65  (NULL);..}...tle
b120: 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d  n = (tlen_buf[1]
b130: 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75   << 8) | tlen_bu
b140: 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74  f[0];...read_ret
b150: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
b160: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e  uffer(slot, vlen
b170: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65  _buf, sizeof(vle
b180: 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65  n_buf), 2, offse
b190: 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_v);..if (read_
b1a0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c  ret != sizeof(vl
b1b0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
b1c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b1d0: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
b1e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b1f0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
b200: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65  (NULL);..}...vle
b210: 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d  n = (vlen_buf[1]
b220: 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75   << 8) | vlen_bu
b230: 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  f[0];...CACKEY_D
b240: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
b250: 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61   Length = %i, Va
b260: 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22  lue Length = %i"
b270: 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a  , tlen, vlen);..
b280: 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a  .offset_t += 2;.
b290: 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a  .offset_v += 2;.
b2a0: 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a  ..if (tlen > siz
b2b0: 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b  eof(tval_buf)) {
b2c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b2d0: 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67  PRINTF("Tag leng
b2e0: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
b2f0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b300: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
b310: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
b320: 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (vlen > sizeof
b330: 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (vval_buf)) {...
b340: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b350: 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74  NTF("Value lengt
b360: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
b370: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b380: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b390: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
b3a0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
b3b0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
b3c0: 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e  , tval_buf, tlen
b3d0: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
b3e0: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
b3f0: 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   tlen) {...CACKE
b400: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b410: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
b420: 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20  ntire T-buffer, 
b430: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b440: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b450: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
b460: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
b470: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
b480: 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e  , vval_buf, vlen
b490: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
b4a0: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
b4b0: 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   vlen) {...CACKE
b4c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b4d0: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
b4e0: 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20  ntire V-buffer, 
b4f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b500: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
b510: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76  n(NULL);..}...tv
b520: 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09  al = tval_buf;..
b530: 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b  vval = vval_buf;
b540: 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20  ..while (tlen > 
b550: 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b  0 && vlen > 0) {
b560: 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a  ...tag = *tval;.
b570: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e  ..tval++;...tlen
b580: 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c  --;....if (*tval
b590: 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c   == 0xff) {....l
b5a0: 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d  ength = (tval[2]
b5b0: 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d   << 8) | tval[1]
b5c0: 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a  ;....tval += 3;.
b5d0: 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09  ...tlen -= 3;...
b5e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67  } else {....leng
b5f0: 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74  th = *tval;....t
b600: 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d  val++;....tlen--
b610: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
b620: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
b630: 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43  g: %s (%02x)", C
b640: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b650: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29  _TAG_TO_STR(tag)
b660: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
b670: 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f   tag);...CACKEY_
b680: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
b690: 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c  Value:", vval, l
b6a0: 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f  ength);....curr_
b6b0: 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
b6c0: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
b6d0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
b6e0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63  G_CARDURL:.....c
b6f0: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
b700: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
b710: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63  _entity));.....c
b720: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
b730: 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c  e_cardurl = mall
b740: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
b750: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
b760: 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65  rdurl));......me
b770: 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79  mcpy(curr_entity
b780: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
b790: 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a  >rid, vval, 5);.
b7a0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
b7b0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
b7c0: 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35  apptype = vval[5
b7d0: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
b7e0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
b7f0: 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76  l->objectid = (v
b800: 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76  val[6] << 8) | v
b810: 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72  val[7];.....curr
b820: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
b830: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20  ardurl->appid = 
b840: 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c  (vval[8] << 8) |
b850: 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63   vval[9];......c
b860: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
b870: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
b880: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
b890: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
b8a0: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
b8b0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
b8c0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
b8d0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
b8e0: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09  curr_entity));..
b8f0: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
b900: 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  oc(length);.....
b910: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
b920: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
b930: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
b940: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
b950: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e  curr_entity->len
b960: 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  gth = length;...
b970: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
b980: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
b990: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
b9a0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
b9b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
b9c0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
b9d0: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72  IFICATE:.....cur
b9e0: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
b9f0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
ba00: 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66  ntity));..#ifdef
ba10: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74   HAVE_LIBZ.....t
ba20: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
ba30: 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75  h * 2;.....tmpbu
ba40: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
ba50: 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f  flen);......unco
ba60: 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63  mpress_ret = unc
ba70: 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20  ompress(tmpbuf, 
ba80: 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c  &tmpbuflen, vval
ba90: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69  , length);.....i
baa0: 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
bab0: 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t != Z_OK) {....
bac0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bad0: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
bae0: 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63   decompress, unc
baf0: 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
bb00: 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69  ed %i -- resorti
bb10: 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70  ng to direct cop
bb20: 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  y", uncompress_r
bb30: 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75  et);.......tmpbu
bb40: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
bb50: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
bb60: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
bb70: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
bb80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
bb90: 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
bba0: 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
bbb0: 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65  mpbuflen);.#else
bbc0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
bbd0: 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e  G_PRINTF("Missin
bbe0: 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20  g ZLIB Support, 
bbf0: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
bc00: 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65   is likely usele
bc10: 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d  ss...");......tm
bc20: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
bc30: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ;.....memcpy(tmp
bc40: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
bc50: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09  h);.#endif......
bc60: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
bc70: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
bc80: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
bc90: 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
bca0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
bcb0: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
bcc0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
bcd0: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
bce0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
bcf0: 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31   GSCIS_TAG_PKCS1
bd00: 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  5:.....curr_enti
bd10: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
bd20: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
bd30: 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  );......curr_ent
bd40: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
bd50: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
bd60: 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76  >value_byte = vv
bd70: 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[0];.....curr_
bd80: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
bd90: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
bda0: 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d  ;...}....vval +=
bdb0: 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20   length;...vlen 
bdc0: 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66  -= length;....if
bdd0: 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d   (curr_entity !=
bde0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
bdf0: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
be00: 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f  ....root = curr_
be10: 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09  entity;....}....
be20: 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c  .if (last != NUL
be30: 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f  L) {.....last->_
be40: 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  next = curr_enti
be50: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73  ty;....}.....las
be60: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
be70: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
be80: 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (root);.}../*. *
be90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
bea0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
beb0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
bec0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
bed0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
bee0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
bef0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
bf00: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
bf10: 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74  ree_certs(struct
bf20: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
bf30: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
bf40: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20  ze_t count, int 
bf50: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73  free_start) {..s
bf60: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 66 6f 72  ize_t idx;...for
bf70: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
bf80: 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b   count; idx++) {
bf90: 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78  ...if (start[idx
bfa0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b  ].certificate) {
bfb0: 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69  ....free(start[i
bfc0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29  dx].certificate)
bfd0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66  ;...}..}...if (f
bfe0: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66  ree_start) {...f
bff0: 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a  ree(start);..}..
c000: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
c010: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
c020: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
c030: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
c040: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
c050: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
c060: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c070: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
c080: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
c090: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
c0a0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72  *cackey_read_cer
c0b0: 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
c0c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
c0d0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
c0e0: 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c  identity *certs,
c0f0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
c100: 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74  count) {..struct
c110: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
c120: 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
c130: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
c140: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74  lv_entity *ccc_t
c150: 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a  lv, *ccc_curr, *
c160: 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75  app_tlv, *app_cu
c170: 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  rr;..unsigned ch
c180: 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b  ar ccc_aid[] = {
c190: 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a  GSCIS_AID_CCC};.
c1a0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
c1b0: 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73  urr_aid[7];..uns
c1c0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64  igned long outid
c1d0: 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72  x = 0;..cackey_r
c1e0: 65 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  et transaction_r
c1f0: 65 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72  et;..int certs_r
c200: 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73  esizable;..int s
c210: 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f  end_ret, select_
c220: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c230: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c240: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75  ed.");...if (cou
c250: 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
c260: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c270: 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55  NTF("count is NU
c280: 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  LL, returning in
c290: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
c2a0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c2b0: 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e  ..if (certs != N
c2c0: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f  ULL) {...if (*co
c2d0: 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43  unt == 0) {....C
c2e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c2f0: 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77 65  TF("Requested we
c300: 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74   return 0 object
c310: 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  s, short-circuit
c320: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
c330: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
c340: 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74  /* Begin a Smart
c350: 43 61 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  Card transaction
c360: 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e   */..transaction
c370: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65  _ret = cackey_be
c380: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
c390: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e  slot);..if (tran
c3a0: 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43  saction_ret != C
c3b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c3c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
c3d0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
c3e0: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
c3f0: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
c400: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
c410: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c420: 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
c430: 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ULL) {...certs =
c440: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
c450: 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a  certs) * 5);...*
c460: 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72  count = 5;...cer
c470: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31  ts_resizable = 1
c480: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65  ;..} else {...ce
c490: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
c4a0: 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63  0;..}.../* Selec
c4b0: 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74  t the CCC Applet
c4c0: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
c4d0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
c4e0: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
c4f0: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
c500: 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  id));..if (send_
c510: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
c520: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
c530: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c540: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
c550: 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72  ct CCC Applet, r
c560: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
c570: 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20 54 65 72  ure");..../* Ter
c580: 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
c590: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
c5a0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
c5b0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
c5c0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c5d0: 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64 20 61 6c  ..}.../* Read al
c5e0: 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72  l the applets fr
c5f0: 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56  om the CCC's TLV
c600: 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20 3d 20 63   */..ccc_tlv = c
c610: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
c620: 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20  lot);.../* Look 
c630: 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61  for CARDURLs tha
c640: 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20  t coorespond to 
c650: 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09  PKI applets */..
c660: 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20  for (ccc_curr = 
c670: 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72  ccc_tlv; ccc_cur
c680: 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r; ccc_curr = cc
c690: 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  c_curr->_next) {
c6a0: 0a 09 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 46 6f 75 6e 64 20 74 61  PRINTF("Found ta
c6c0: 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43  g: %s ... ", CAC
c6d0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
c6e0: 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  AG_TO_STR(ccc_cu
c6f0: 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 69 66  rr->tag));....if
c700: 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20   (ccc_curr->tag 
c710: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  != GSCIS_TAG_CAR
c720: 44 55 52 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  DURL) {....CACKE
c730: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c740: 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
c750: 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
c760: 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
c770: 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
c780: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 63 63 63  ...}....if ((ccc
c790: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
c7a0: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20  durl->apptype & 
c7b0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
c7c0: 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c  KI) != CACKEY_TL
c7d0: 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09  V_APP_PKI) {....
c7e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c7f0: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
c800: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
c810: 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
c820: 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
c830: 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
c840: 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
c850: 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
c860: 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
c870: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
c880: 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
c890: 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
c8a0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
c8b0: 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
c8c0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
c8d0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c8e0: 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
c8f0: 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
c900: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
c910: 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
c920: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
c930: 72 69 64 29 29 3b 0a 09 09 43 41 43 4b 45 59 5f  rid));...CACKEY_
c940: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70  DEBUG_PRINTF("Ap
c950: 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  pID = %s/%04lx",
c960: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
c970: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
c980: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
c990: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c  cardurl->appid),
c9a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c9b0: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
c9c0: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
c9d0: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
c9e0: 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49  _PRINTF("ObjectI
c9f0: 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43  D = %s/%04lx", C
ca00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
ca10: 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63  _OBJID_TO_STR(cc
ca20: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
ca30: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
ca40: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
ca50: 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
ca60: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
ca70: 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28  tid);....memcpy(
ca80: 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75  curr_aid, ccc_cu
ca90: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
caa0: 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
cab0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
cac0: 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
cad0: 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
cae0: 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20  (curr_aid) - 2] 
caf0: 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  = (ccc_curr->val
cb00: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
cb10: 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  d >> 8) & 0xff;.
cb20: 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
cb30: 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d  f(curr_aid) - 1]
cb40: 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
cb50: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
cb60: 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 2f 2a 20  d & 0xff;..../* 
cb70: 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70  Select found app
cb80: 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 73 65 6c  let ... */...sel
cb90: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
cba0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
cbb0: 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73  lot, curr_aid, s
cbc0: 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29  izeof(curr_aid))
cbd0: 3b 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ;...if (select_r
cbe0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
cbf0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
cc00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
cc10: 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
cc20: 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
cc30: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
cc40: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
cc50: 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
cc60: 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64  .}..../* ... and
cc70: 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a   object (file) *
cc80: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  /...select_ret =
cc90: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
cca0: 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
ccb0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
ccc0: 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
ccd0: 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
cce0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
ccf0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
cd00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
cd10: 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66  iled to select f
cd20: 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72  ile, skipping pr
cd30: 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73  ocessing of this
cd40: 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63   object");.....c
cd50: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
cd60: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20  /* Process this 
cd70: 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69  file's TLV looki
cd80: 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61  ng for certifica
cd90: 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f 74 6c 76  tes */...app_tlv
cda0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
cdb0: 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 66 6f 72  lv(slot);....for
cdc0: 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70   (app_curr = app
cdd0: 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20  _tlv; app_curr; 
cde0: 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63  app_curr = app_c
cdf0: 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
ce00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ce10: 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
ce20: 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
ce30: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
ce40: 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  TR(app_curr->tag
ce50: 29 29 3b 0a 09 09 09 69 66 20 28 61 70 70 5f 63  ));....if (app_c
ce60: 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49  urr->tag != GSCI
ce70: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
ce80: 45 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  E) {.....CACKEY_
ce90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
cea0: 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
ceb0: 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
cec0: 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73  out CERTIFICATEs
ced0: 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  )");......contin
cee0: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
cef0: 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
cf00: 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
cf10: 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ++;.....memcpy(c
cf20: 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20  urr_id->applet, 
cf30: 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
cf40: 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
cf50: 29 29 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  ));....curr_id->
cf60: 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d  file = ccc_curr-
cf70: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
cf80: 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 63 75 72  objectid;....cur
cf90: 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  r_id->keysize = 
cfa0: 2d 31 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  -1;.....CACKEY_D
cfb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
cfc0: 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70  ling curr_id->ap
cfd0: 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25  plet (%p) with %
cfe0: 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72  lu bytes:", curr
cff0: 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e  _id->applet, (un
d000: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
d010: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
d020: 6c 65 74 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  let));....CACKEY
d030: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
d040: 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d  "VAL:", curr_id-
d050: 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28  >applet, sizeof(
d060: 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29  curr_id->applet)
d070: 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  );.....curr_id->
d080: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
d090: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67  = app_curr->leng
d0a0: 74 68 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  th;.....curr_id-
d0b0: 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
d0c0: 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
d0d0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
d0e0: 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
d0f0: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
d100: 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65   app_curr->value
d110: 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
d120: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
d130: 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
d140: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 69 66 20  count) {.....if 
d150: 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
d160: 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20  ) {......*count 
d170: 2a 3d 20 32 3b 0a 09 09 09 09 09 63 65 72 74 73  *= 2;......certs
d180: 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73   = realloc(certs
d190: 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  , sizeof(*certs)
d1a0: 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09   * (*count));...
d1b0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
d1c0: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09  break;.....}....
d1d0: 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  }...}....cackey_
d1e0: 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76  free_tlv(app_tlv
d1f0: 29 3b 0a 0a 09 09 69 66 20 28 6f 75 74 69 64 78  );....if (outidx
d200: 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
d210: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
d220: 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
d230: 28 63 63 63 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f  (ccc_tlv);...*co
d240: 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
d250: 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
d260: 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
d270: 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
d280: 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
d290: 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
d2a0: 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
d2b0: 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
d2c0: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
d2d0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
d2e0: 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63  lot);...return(c
d2f0: 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  erts);.}../*. * 
d300: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
d310: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
d320: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
d330: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
d340: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
d350: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
d360: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
d370: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
d380: 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72  _signdecrypt(str
d390: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d3a0: 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61  *slot, struct ca
d3b0: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
d3c0: 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
d3d0: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a  d char *buf, siz
d3e0: 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69  e_t buflen, unsi
d3f0: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
d400: 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66  f, size_t outbuf
d410: 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75  len, int padInpu
d420: 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70  t, int unpadOutp
d430: 75 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ut) {..unsigned 
d440: 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74  char *tmpbuf, *t
d450: 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66  mpbuf_s, *outbuf
d460: 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  _s;..unsigned ch
d470: 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ar bytes_to_send
d480: 2c 20 70 31 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , p1;..unsigned 
d490: 63 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a  char blocktype;.
d4a0: 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64  .cackey_ret send
d4b0: 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20  _ret;..uint16_t 
d4c0: 72 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65  respcode;..ssize
d4d0: 5f 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75  _t retval = 0, u
d4e0: 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a  npadoffset;..siz
d4f0: 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70  e_t tmpbuflen, p
d500: 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66  adlen, tmpoutbuf
d510: 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74  len;..int free_t
d520: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20  mpbuf = 0;..int 
d530: 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  le;...CACKEY_DEB
d540: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
d550: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
d560: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
d570: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d580: 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
d590: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
d5a0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
d5b0: 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
d5c0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
d5d0: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
d5e0: 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
d5f0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d600: 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
d610: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
d620: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d630: 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
d640: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
d650: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
d660: 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
d670: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
d680: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
d690: 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
d6a0: 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
d6b0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
d6c0: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
d6d0: 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
d6e0: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
d6f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
d700: 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
d710: 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
d720: 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
d730: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
d740: 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
d750: 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
d760: 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
d770: 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
d780: 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
d790: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
d7a0: 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
d7b0: 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
d7c0: 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
d7d0: 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
d7e0: 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
d7f0: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
d800: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
d810: 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
d820: 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
d830: 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
d840: 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
d850: 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
d860: 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
d870: 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
d880: 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
d890: 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
d8a0: 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
d8b0: 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
d8c0: 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
d8d0: 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20  ->keysize + 3)) 
d8e0: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
d8f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
d900: 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
d910: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
d920: 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
d930: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
d940: 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
d950: 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
d960: 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
d970: 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
d980: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
d990: 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
d9a0: 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
d9b0: 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
d9c0: 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
d9d0: 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b  ;....../* RSA PK
d9e0: 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d  CS#1 EMSA-PKCS1-
d9f0: 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a  v1_5 Padding */.
da00: 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20  ....tmpbuf[0] = 
da10: 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66  0x00;.....tmpbuf
da20: 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09  [1] = 0x01;.....
da30: 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32  memset(&tmpbuf[2
da40: 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29  ], 0xFF, padlen)
da50: 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64  ;.....tmpbuf[pad
da60: 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a  len + 2]= 0x00;.
da70: 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62  ....memcpy(&tmpb
da80: 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20  uf[padlen + 3], 
da90: 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  buf, buflen);...
daa0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dab0: 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
dac0: 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65  ed:", buf, bufle
dad0: 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  n);.....CACKEY_D
dae0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
daf0: 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c  added:", tmpbuf,
db00: 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09   tmpbuflen);....
db10: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70  } else {.....tmp
db20: 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74  buf = buf;.....t
db30: 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
db40: 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  n;.....free_tmpb
db50: 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c  uf = 0;.....padl
db60: 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  en = 0;....}...}
db70: 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
db80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
db90: 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
dba0: 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
dbb0: 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
dbc0: 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
dbd0: 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62  ded!");.....tmpb
dbe0: 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70  uf = buf;....tmp
dbf0: 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
dc00: 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
dc10: 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d  = 0;....padlen =
dc20: 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20   0;...}..} else 
dc30: 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  {...tmpbuf = buf
dc40: 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ;...tmpbuflen = 
dc50: 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74  buflen;...free_t
dc60: 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64  mpbuf = 0;...pad
dc70: 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  len = 0;..}.../*
dc80: 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   Begin transacti
dc90: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
dca0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
dcb0: 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65  slot);.../* Sele
dcc0: 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65  ct correct apple
dcd0: 74 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  t */..CACKEY_DEB
dce0: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63  UG_PRINTF("Selec
dcf0: 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e  ting applet foun
dd00: 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64  d at %p ...", id
dd10: 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
dd20: 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29 3b 0a  ntity->applet);.
dd30: 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61  .cackey_select_a
dd40: 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e  pplet(slot, iden
dd50: 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
dd60: 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a  ity->applet, siz
dd70: 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  eof(identity->pc
dd80: 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
dd90: 6c 65 74 29 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65  let));.../* Sele
dda0: 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20  ct correct file 
ddb0: 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  */..cackey_selec
ddc0: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65  t_file(slot, ide
ddd0: 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
dde0: 74 69 74 79 2d 3e 66 69 6c 65 29 3b 0a 0a 09 74  tity->file);...t
ddf0: 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66  mpbuf_s = tmpbuf
de00: 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
de10: 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d  tbuf;..while (tm
de20: 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20  pbuflen) {...if 
de30: 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35  (tmpbuflen > 245
de40: 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
de50: 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 70  send = 245;....p
de60: 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 6c 65 20  1 = 0x80;....le 
de70: 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65  = 0x00;...} else
de80: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
de90: 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b  end = tmpbuflen;
dea0: 0a 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09  ....p1 = 0x00;..
deb0: 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 7d  ..le = 0x00;...}
dec0: 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e  ....tmpoutbuflen
ded0: 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09   = outbuflen;...
dee0: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
def0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
df00: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
df10: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
df20: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e  GSCIS_INSTR_SIGN
df30: 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30  DECRYPT, p1, 0x0
df40: 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  0, bytes_to_send
df50: 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
df60: 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
df70: 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
df80: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
df90: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
dfa0: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
dfb0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
dfc0: 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c  DPU Sending Fail
dfd0: 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20  ed -- returning 
dfe0: 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
dff0: 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66  .if (free_tmpbuf
e000: 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62  ) {.....if (tmpb
e010: 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65  uf_s) {......fre
e020: 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09  e(tmpbuf_s);....
e030: 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45  .}....}...../* E
e040: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
e050: 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
e060: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
e070: 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63  );.....if (respc
e080: 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 29 20 7b  ode == 0x6982) {
e090: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e0a0: 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69  G_PRINTF("Securi
e0b0: 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61  ty status not sa
e0c0: 74 69 73 69 66 69 65 64 2e 20 20 52 65 74 75 72  tisified.  Retur
e0d0: 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 29  ning NEEDLOGIN")
e0e0: 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 73 6c 6f  ;......slot->slo
e0f0: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09  t_reset = 1;....
e100: 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
e110: 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
e120: 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65  EQUIRED;......re
e130: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e140: 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09  _E_NEEDLOGIN);..
e150: 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64  ..}.....if (send
e160: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
e170: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
e180: 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  T) {.....CACKEY_
e190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
e1a0: 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74  ken absent.  Ret
e1b0: 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45  urning TOKENABSE
e1c0: 4e 54 22 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d  NT");......slot-
e1d0: 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  >slot_reset = 1;
e1e0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e  .....slot->token
e1f0: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
e200: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09  IN_REQUIRED;....
e210: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e220: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
e230: 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  NT);....}.....re
e240: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
e250: 09 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73  .tmpbuf += bytes
e260: 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62  _to_send;...tmpb
e270: 75 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74  uflen -= bytes_t
e280: 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75  o_send;....outbu
e290: 66 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  f += tmpoutbufle
e2a0: 6e 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d  n;...outbuflen -
e2b0: 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
e2c0: 09 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f  ..retval += tmpo
e2d0: 75 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69  utbuflen;..}...i
e2e0: 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
e2f0: 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73  {...if (tmpbuf_s
e300: 29 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62  ) {....free(tmpb
e310: 75 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  uf_s);...}..}...
e320: 6f 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f  outbuf = outbuf_
e330: 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e  s;.../* End tran
e340: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
e350: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
e360: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65  on(slot);..#ifde
e370: 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
e380: 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
e390: 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
e3a0: 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f  (outbuflen > _PO
e3b0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
e3c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e3d0: 50 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65  PRINTF("Outbufle
e3e0: 6e 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  n exceeds maximu
e3f0: 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
e400: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
e410: 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75  max = %li, outbu
e420: 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c  flen = %lu)", (l
e430: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
e440: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
e450: 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e   long) outbuflen
e460: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
e470: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
e480: 6e 64 69 66 0a 0a 09 2f 2a 20 55 6e 70 61 64 20  ndif.../* Unpad 
e490: 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e  reply */..if (un
e4a0: 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69  padOutput) {...i
e4b0: 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b  f (retval < 3) {
e4c0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
e4d0: 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69  _PRINTF("Reply i
e4e0: 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20  s too small, we 
e4f0: 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20  are not able to 
e500: 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67  unpad -- passing
e510: 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
e520: 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
e530: 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
e540: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
e550: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
e560: 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
e570: 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
e580: 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
e590: 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
e5a0: 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20  ..if (outbuf[0] 
e5b0: 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41  != 0x00) {....CA
e5c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e5d0: 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20  F("Unrecognized 
e5e0: 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d  padding scheme -
e5f0: 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
e600: 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
e610: 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
e620: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e630: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
e640: 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
e650: 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
e660: 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
e670: 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
e680: 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b  l);...}....block
e690: 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d  type = outbuf[1]
e6a0: 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20  ;...unpadoffset 
e6b0: 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  = 0;....switch (
e6c0: 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09  blocktype) {....
e6d0: 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f  case 0x00:...../
e6e0: 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
e6f0: 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f   1, the first no
e700: 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74  n-zero byte is t
e710: 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  he start of data
e720: 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70   */.....for (unp
e730: 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e  adoffset = 2; un
e740: 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76  padoffset < retv
e750: 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b  al; unpadoffset+
e760: 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75  +) {......if (ou
e770: 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
e780: 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] != 0x00) {....
e790: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
e7a0: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
e7b0: 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a  ;....case 0x01:.
e7c0: 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
e7d0: 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74  cheme 2, pad byt
e7e0: 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c  es are 0xFF foll
e7f0: 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a  owed by 0x00 */.
e800: 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
e810: 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
e820: 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
e830: 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
e840: 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
e850: 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
e860: 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69   0xFF) {.......i
e870: 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
e880: 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
e890: 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66  {........unpadof
e8a0: 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09  fset++;.........
e8b0: 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65  break;.......} e
e8c0: 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43  lse {........CAC
e8d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e8e0: 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
e8f0: 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
e900: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e910: 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
e920: 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20  been 0x00 found 
e930: 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
e940: 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
e950: 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
e960: 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
e970: 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
e980: 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41   else {.......CA
e990: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e9a0: 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69  F("Invalid paddi
e9b0: 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72  ng data found, r
e9c0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e9d0: 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65  ure, should have
e9e0: 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64   been 0xFF found
e9f0: 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67   0x%02x", (unsig
ea00: 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b  ned int) outbuf[
ea10: 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a  unpadoffset]);..
ea20: 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
ea30: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
ea40: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
ea50: 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50  e 0x02:...../* P
ea60: 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c  adding Scheme 3,
ea70: 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e   pad bytes are n
ea80: 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65  on-zero first ze
ea90: 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73  ro byte found is
eaa0: 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62   the seperator b
eab0: 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  yte */.....for (
eac0: 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
ead0: 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
eae0: 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
eaf0: 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
eb00: 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
eb10: 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
eb20: 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65  ......unpadoffse
eb30: 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t++;........brea
eb40: 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
eb50: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
eb60: 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65  ..if (unpadoffse
eb70: 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09  t > retval) {...
eb80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
eb90: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65  INTF("Offset gre
eba0: 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20  ater than reply 
ebb0: 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20  size, aborting. 
ebc0: 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
ebd0: 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  %lu, retval = %l
ebe0: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
ebf0: 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74  ong) unpadoffset
ec00: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
ec10: 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  ) retval);.....r
ec20: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
ec30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ec40: 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
ec50: 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
ec60: 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d  l);....retval -=
ec70: 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09   unpadoffset;...
ec80: 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20  memmove(outbuf, 
ec90: 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66  outbuf + unpadof
eca0: 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  fset, retval);..
ecb0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ecc0: 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65  RINTBUF("Unpadde
ecd0: 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74  d:", outbuf, ret
ece0: 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  val);..}....CACK
ecf0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ed00: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
ed10: 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
ed20: 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
ed30: 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
ed40: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
ed50: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
ed60: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
ed70: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
ed80: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
ed90: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
eda0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
edb0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
edc0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
edd0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67  y_ret cackey_log
ede0: 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  in(struct cackey
edf0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
ee00: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c  igned char *pin,
ee10: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70   unsigned long p
ee20: 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69  in_len, int *tri
ee30: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
ee40: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
ee50: 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30   cac_pin[8] = {0
ee60: 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
ee70: 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
ee80: 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a  F, 0xFF, 0xFF};.
ee90: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e  .uint16_t respon
eea0: 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72  se_code;..int tr
eeb0: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09  ies_remaining;..
eec0: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
eed0: 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  /* Indicate that
eee0: 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   we do not know 
eef0: 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74  about how many t
ef00: 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69  ries are remaini
ef10: 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73  ng */..if (tries
ef20: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
ef30: 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ..*tries_remaini
ef40: 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09  ng_p = -1;..}...
ef50: 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43  /* Apparently, C
ef60: 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41  AC PINs are *EXA
ef70: 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f  CTLY* 8 bytes lo
ef80: 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30  ng -- pad with 0
ef90: 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74  xFF if too short
efa0: 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e   */..if (pin_len
efb0: 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70   >= 8) {...memcp
efc0: 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20  y(cac_pin, pin, 
efd0: 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  8);..} else {...
efe0: 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20  memcpy(cac_pin, 
eff0: 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09  pin, pin_len);..
f000: 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e  }.../* Issue PIN
f010: 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64   Verify */..send
f020: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
f030: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
f040: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
f050: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  6, GSCIS_INSTR_V
f060: 45 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78 30  ERIFY, 0x00, 0x0
f070: 30 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69  0, sizeof(cac_pi
f080: 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30  n), cac_pin, 0x0
f090: 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64  0, &response_cod
f0a0: 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  e, NULL, NULL);.
f0b0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
f0c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
f0d0: 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70  K) {...if ((resp
f0e0: 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33  onse_code & 0x63
f0f0: 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b  C0) == 0x63C0) {
f100: 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e  ....tries_remain
f110: 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f  ing = (response_
f120: 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09  code & 0xF);....
f130: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f140: 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69  INTF("PIN Verifi
f150: 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25  cation failed, %
f160: 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e  i tries remainin
f170: 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  g", tries_remain
f180: 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72  ing);.....if (tr
f190: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
f1a0: 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65   {.....*tries_re
f1b0: 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65  maining_p = trie
f1c0: 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09  s_remaining;....
f1d0: 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  }.....return(CAC
f1e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
f1f0: 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72  N);...}....if (r
f200: 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20  esponse_code == 
f210: 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43  0x6983) {....CAC
f220: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f230: 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
f240: 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63  on failed, devic
f250: 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a  e is locked");..
f260: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
f270: 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b  _PCSC_E_LOCKED);
f280: 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
f290: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
f2a0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
f2b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f2c0: 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
f2d0: 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a  n succeeded");..
f2e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
f2f0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
f300: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
f310: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
f320: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
f330: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
f340: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
f350: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
f360: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
f370: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
f380: 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72   cackey_token_pr
f390: 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 63  esent(struct cac
f3a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
f3b0: 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63  {..cackey_ret pc
f3c0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a  sc_connect_ret;.
f3d0: 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65  .DWORD reader_le
f3e0: 6e 2c 20 73 74 61 74 65 2c 20 70 72 6f 74 6f 63  n, state, protoc
f3f0: 6f 6c 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59  ol, atr_len;..BY
f400: 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53  TE atr[MAX_ATR_S
f410: 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74  IZE];..LONG stat
f420: 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65  us_ret, scard_re
f430: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
f440: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f450: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 70 63  "Called.");...pc
f460: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
f470: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
f480: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
f490: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
f4a0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
f4b0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
f4c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f4d0: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
f4e0: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
f4f0: 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
f500: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
f510: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
f520: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
f530: 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  atr_len = sizeof
f540: 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72  (atr);..status_r
f550: 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
f560: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
f570: 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
f580: 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
f590: 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
f5a0: 72 5f 6c 65 6e 29 3b 0a 09 69 66 20 28 73 74 61  r_len);..if (sta
f5b0: 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  tus_ret != SCARD
f5c0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
f5d0: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
f5e0: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 6f   = 1;...slot->to
f5f0: 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
f600: 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
f610: 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
f620: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
f630: 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
f640: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f650: 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
f660: 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
f670: 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
f680: 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  econn_ret = SCar
f690: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
f6a0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
f6b0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
f6c0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
f6d0: 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
f6e0: 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53  OL_T1, SCARD_RES
f6f0: 45 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f 63  ET_CARD, &protoc
f700: 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72  ol);....if (scar
f710: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  d_reconn_ret == 
f720: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
f730: 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65   {...../* Update
f740: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09   protocol */....
f750: 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20  .slot->protocol 
f760: 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09  = protocol;.....
f770: 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68  ./* Re-establish
f780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
f790: 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20   it was present 
f7a0: 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d  */.....if (slot-
f7b0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
f7c0: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  th > 0) {......s
f7d0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
f7e0: 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73  _depth--;......s
f7f0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
f800: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
f810: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  1;......cackey_b
f820: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
f830: 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
f840: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f850: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
f860: 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72  ccessful, requer
f870: 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74  ying");.....stat
f880: 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
f890: 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
f8a0: 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
f8b0: 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
f8c0: 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
f8d0: 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09   &atr_len);.....
f8e0: 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
f8f0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
f900: 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
f910: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
f920: 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71  till unable to q
f930: 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73  uery card status
f940: 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
f950: 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
f960: 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20  Status() = %s", 
f970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
f980: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
f990: 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a  R(status_ret));.
f9a0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
f9b0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
f9c0: 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09  ABSENT);.....}..
f9d0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
f9e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f9f0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65  TF("Unable to re
fa00: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
fa10: 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
fa20: 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52   absent.  SCardR
fa30: 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22  econnect() = %s"
fa40: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
fa50: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
fa60: 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  STR(scard_reconn
fa70: 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74  _ret));......ret
fa80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
fa90: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
faa0: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
fab0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fac0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
fad0: 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
fae0: 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
faf0: 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
fb00: 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
fb10: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
fb20: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
fb30: 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
fb40: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
fb50: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
fb60: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d  NABSENT);...}..}
fb70: 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26 20  ...if ((state & 
fb80: 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d  SCARD_ABSENT) ==
fb90: 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b   SCARD_ABSENT) {
fba0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fbb0: 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
fbc0: 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e  absent, returnin
fbd0: 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
fbe0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
fbf0: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
fc00: 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  BSENT);..}...CAC
fc10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fc20: 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  ("Returning toke
fc30: 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09  n present.");...
fc40: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
fc50: 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
fc60: 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  T);.}../*. * SYN
fc70: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
fc80: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
fc90: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
fca0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
fcb0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
fcc0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
fcd0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
fce0: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63  size_t cackey_pc
fcf0: 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
fd00: 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b  abel(struct cack
fd10: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fd20: 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
fd30: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
fd40: 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c  _buf, unsigned l
fd50: 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  ong label_buf_le
fd60: 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
fd70: 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 5f  ong certificate_
fd80: 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 6c 61 62 65  len;..char *labe
fd90: 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63  l_asn1;..void *c
fda0: 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74  ertificate;..int
fdb0: 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
fdc0: 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ..certificate = 
fdd0: 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
fde0: 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63  icate;..certific
fdf0: 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69  ate_len = identi
fe00: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
fe10: 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69  len;...if (certi
fe20: 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20  ficate_len < 0) 
fe30: 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
fe40: 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72  .}...x509_read_r
fe50: 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62  et = x509_to_sub
fe60: 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65  ject(certificate
fe70: 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
fe80: 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61  n, (void **) &la
fe90: 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28  bel_asn1);..if (
fea0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
feb0: 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
fec0: 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
fed0: 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
fee0: 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
fef0: 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
ff00: 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
ff10: 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
ff20: 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09  uf_len, "CN");..
ff30: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
ff40: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39  t <= 0) {...x509
ff50: 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
ff60: 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61  _dn_to_string(la
ff70: 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72  bel_asn1, x509_r
ff80: 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a  ead_ret, (char *
ff90: 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62  ) label_buf, lab
ffa0: 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c  el_buf_len, NULL
ffb0: 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72  );....if (x509_r
ffc0: 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
ffd0: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
ffe0: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
fff0: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
10000 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
10010 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30  IZE_MAX..if (x50
10020 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f  9_read_ret > _PO
10030 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
10040 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10050 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61  PRINTF("x509_rea
10060 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d 61  d_ret exceeds ma
10070 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
10080 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
10090 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78  e. (max = %li, x
100a0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25  509_read_ret = %
100b0 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
100c0 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
100d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78  unsigned long) x
100e0 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a  509_read_ret);..
100f0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
10100 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
10110 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72  ...return(x509_r
10120 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20  ead_ret);.}../* 
10130 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
10140 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
10150 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
10160 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75  create(void **mu
10170 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
10180 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
10190 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
101a0 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
101b0 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
101c0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
101d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
101e0 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
101f0 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
10200 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
10210 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
10220 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
10230 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c  read_mutex = mal
10240 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72  loc(sizeof(*pthr
10250 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69  ead_mutex));...i
10260 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65  f (!pthread_mute
10270 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  x) {....CACKEY_D
10280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
10290 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  led to allocate 
102a0 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72  memory.");.....r
102b0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
102c0 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
102d0 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
102e0 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75  _init(pthread_mu
102f0 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66  tex, NULL);...if
10300 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
10310 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
10320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10330 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69  "pthread_mutex_i
10340 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65  nit() returned e
10350 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
10360 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
10370 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
10380 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74  }....*mutex = pt
10390 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20  hread_mutex;..} 
103a0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
103b0 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
103c0 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
103d0 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
103e0 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
103f0 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
10400 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
10410 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
10420 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10430 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
10440 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29  gs.CreateMutex()
10450 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
10460 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
10470 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
10480 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
10490 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
104a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
104b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
104c0 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
104d0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
104e0 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
104f0 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
10500 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
10510 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d  tex_lock(void *m
10520 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
10530 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
10540 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
10550 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
10560 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
10570 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
10580 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
10590 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
105a0 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
105b0 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
105c0 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
105d0 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
105e0 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75  hread_mutex = mu
105f0 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  tex;....pthread_
10600 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
10610 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72  _mutex_lock(pthr
10620 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66  ead_mutex);...if
10630 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
10640 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
10650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10660 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c  "pthread_mutex_l
10670 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
10680 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
10690 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
106a0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
106b0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
106c0 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f   (cackey_args.Lo
106d0 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
106e0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
106f0 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
10700 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
10710 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
10720 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
10730 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10740 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
10750 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20  rgs.LockMutex() 
10760 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
10770 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
10780 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
10790 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
107a0 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
107b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
107c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
107d0 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
107e0 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
107f0 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
10800 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
10810 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
10820 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a  ex_unlock(void *
10830 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
10840 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
10850 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
10860 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
10870 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
10880 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
10890 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
108a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
108b0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
108c0 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
108d0 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
108e0 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
108f0 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
10900 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
10910 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
10920 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70  d_mutex_unlock(p
10930 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
10940 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
10950 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
10960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10970 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
10980 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72  x_unlock() retur
10990 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
109a0 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
109b0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
109c0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
109d0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
109e0 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20  gs.UnlockMutex) 
109f0 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
10a00 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
10a10 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  .UnlockMutex(mut
10a20 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
10a30 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
10a40 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
10a50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10a60 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  "cackey_args.Unl
10a70 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
10a80 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
10a90 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
10aa0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
10ab0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
10ac0 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
10ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10ae0 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
10af0 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
10b00 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(0);.}..stati
10b10 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  c CK_ATTRIBUTE_P
10b20 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74  TR cackey_get_at
10b30 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45  tributes(CK_OBJE
10b40 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63  CT_CLASS objectc
10b50 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61 63  lass, struct cac
10b60 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
10b70 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
10b80 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
10b90 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e  ity_num, CK_ULON
10ba0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
10bb0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  {..static CK_BBO
10bc0 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a  OL ck_true = 1;.
10bd0 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
10be0 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09   ck_false = 0;..
10bf0 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
10c00 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
10c10 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
10c20 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
10c30 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
10c40 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
10c50 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
10c60 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
10c70 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
10c80 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
10c90 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
10ca0 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
10cb0 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
10cc0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
10cd0 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
10ce0 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
10cf0 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
10d00 5b 31 30 32 34 5d 3b 0a 09 75 6e 73 69 67 6e 65  [1024];..unsigne
10d10 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
10d20 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65  ate;..ssize_t ce
10d30 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
10d40 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  -1, x509_read_re
10d50 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66  t;..int pValue_f
10d60 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ree;...CACKEY_DE
10d70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
10d80 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20  ed (objectClass 
10d90 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f  = %lu, identity_
10da0 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  num = %lu).", (u
10db0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62  nsigned long) ob
10dc0 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74  jectclass, ident
10dd0 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66 20 28  ity_num);...if (
10de0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
10df0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
10e00 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
10e10 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20   CKO_PUBLIC_KEY 
10e20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
10e30 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
10e40 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  Y) {...CACKEY_DE
10e50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
10e60 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
10e70 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
10e80 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a  object class");.
10e90 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
10ea0 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72  ..}.../* Get Cer
10eb0 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  t */..if (identi
10ec0 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
10ed0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10ee0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
10ef0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
10f00 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79   invalid identiy
10f10 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09   provided");....
10f20 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
10f30 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
10f40 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
10f50 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
10f60 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
10f70 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
10f80 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
10f90 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d  ificate_len == -
10fa0 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65  1 || certificate
10fb0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
10fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10fd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
10fe0 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
10ff0 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65  his identity doe
11000 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e  s not have an X.
11010 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
11020 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11030 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  it and will not 
11040 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72  work");....retur
11050 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
11060 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72   Verify that cer
11070 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e  tificate is ASN.
11080 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20  1 encoded X.509 
11090 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
110a0 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69  if (x509_to_seri
110b0 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
110c0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
110d0 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09   NULL) < 0) {...
110e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
110f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
11100 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
11110 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69   the X.509 certi
11120 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
11130 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e  d with this iden
11140 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69  tity is not vali
11150 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
11160 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ULL);..}...retva
11170 6c 5f 63 6f 75 6e 74 20 3d 20 31 36 3b 0a 09 72  l_count = 16;..r
11180 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72  etval = malloc(r
11190 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
111a0 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
111b0 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
111c0 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f  _type = 0; curr_
111d0 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65  attr_type < 0xce
111e0 35 33 36 33 35 66 3b 20 63 75 72 72 5f 61 74 74  53635f; curr_att
111f0 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66  r_type++) {...if
11200 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
11210 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09   == 0x800) {....
11220 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
11230 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d   0xce536300;...}
11240 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20  ....pValue_free 
11250 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20  = 0;...pValue = 
11260 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
11270 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
11280 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  1;....switch (cu
11290 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a  rr_attr_type) {.
112a0 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53  ...case CKA_CLAS
112b0 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
112c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
112d0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
112e0 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30   CKA_CLASS (0x%0
112f0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
11300 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
11310 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
11320 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  .ck_object_class
11330 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a   = objectclass;.
11340 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
11350 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
11360 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
11370 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63   sizeof(ck_objec
11380 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43  t_class);......C
11390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
113a0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
113b0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
113c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
113d0 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  ) *((CK_OBJECT_C
113e0 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c  LASS *) pValue),
113f0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
11400 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
11410 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
11420 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  ;....case CKA_TO
11430 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  KEN:.....CACKEY_
11440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
11450 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
11460 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78  te CKA_TOKEN (0x
11470 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
11480 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
11490 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
114a0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
114b0 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
114c0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
114d0 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
114e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
114f0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
11500 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
11510 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11520 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
11530 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
11540 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11550 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
11560 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
11570 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
11580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11590 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
115a0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
115b0 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78  TRUSTED (0x%08lx
115c0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
115d0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
115e0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
115f0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
11600 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
11610 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
11620 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
11630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
11640 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
11650 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
11660 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
11670 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
11680 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
11690 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
116a0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
116b0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
116c0 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09  MODIFIABLE:.....
116d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
116e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
116f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
11700 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c  DIFIABLE (0x%08l
11710 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
11720 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
11730 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
11740 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
11750 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
11760 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
11770 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
11780 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11790 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
117a0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
117b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
117c0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
117d0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
117e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
117f0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
11800 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
11810 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41  KA_LABEL:.....CA
11820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11830 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
11840 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45  tribute CKA_LABE
11850 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  L (0x%08lx) ..."
11860 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11870 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
11880 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20  );....../* XXX: 
11890 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a  Determine name *
118a0 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  /.....ulValueLen
118b0 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61   = snprintf((cha
118c0 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73  r *) ucTmpBuf, s
118d0 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c  izeof(ucTmpBuf),
118e0 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22   "Identity #%lu"
118f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11900 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  ) identity_num);
11910 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63  .....pValue = uc
11920 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 20  TmpBuf;......if 
11930 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73  (ulValueLen >= s
11940 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29  izeof(ucTmpBuf))
11950 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c   {......ulValueL
11960 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 61  en = 0;......pVa
11970 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
11980 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
11990 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
119a0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
119b0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
119c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
119d0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
119e0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
119f0 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41  KA_VALUE:.....CA
11a00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11a10 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
11a20 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55  tribute CKA_VALU
11a30 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
11a40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11a50 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
11a60 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28  );......switch (
11a70 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09  objectclass) {..
11a80 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49  ....case CKO_PRI
11a90 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09  VATE_KEY:.......
11aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11ab0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
11ac0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
11ad0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72  ause we are a pr
11ae0 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09  ivate key.");...
11af0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
11b00 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43  .case CKO_PUBLIC
11b10 5f 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58  _KEY:......./* X
11b20 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09  XX: TODO */.....
11b30 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
11b40 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  ase CKO_CERTIFIC
11b50 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75  ATE:.......pValu
11b60 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b  e = certificate;
11b70 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
11b80 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f  n = certificate_
11b90 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  len;........brea
11ba0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  k;.....}......CA
11bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11bc0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
11bd0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
11be0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
11bf0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
11c00 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
11c10 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a  ase CKA_ISSUER:.
11c20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11c30 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
11c40 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
11c50 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c  A_ISSUER (0x%08l
11c60 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
11c70 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
11c80 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
11c90 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
11ca0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
11cb0 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
11cc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
11cd0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
11ce0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
11cf0 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
11d00 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
11d10 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
11d20 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
11d30 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
11d40 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
11d50 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73  et = x509_to_iss
11d60 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c  uer(certificate,
11d70 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
11d80 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
11d90 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
11da0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
11db0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
11dc0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
11dd0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
11de0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
11df0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
11e00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11e10 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
11e20 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
11e30 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
11e40 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
11e50 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
11e60 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
11e70 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41  L_NUMBER:.....CA
11e80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11e90 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
11ea0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49  tribute CKA_SERI
11eb0 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38  AL_NUMBER (0x%08
11ec0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
11ed0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
11ee0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
11ef0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
11f00 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
11f10 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
11f20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11f30 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
11f40 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
11f50 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
11f60 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09  tificate.");....
11f70 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
11f80 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
11f90 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
11fa0 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
11fb0 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65  ret = x509_to_se
11fc0 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
11fd0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
11fe0 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
11ff0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
12000 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
12010 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
12020 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
12030 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
12040 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
12050 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
12060 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12070 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
12080 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
12090 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
120a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
120b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
120c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55  ;....case CKA_SU
120d0 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45  BJECT:.....CACKE
120e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
120f0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
12100 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  bute CKA_SUBJECT
12110 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
12120 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12130 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
12140 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
12150 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
12160 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
12170 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12180 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
12190 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
121a0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
121b0 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e  t a certificate.
121c0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
121d0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
121e0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
121f0 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
12200 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
12210 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72  9_to_subject(cer
12220 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
12230 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
12240 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
12250 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
12260 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
12270 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
12280 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
12290 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
122a0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
122b0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
122c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
122d0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
122e0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
122f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
12300 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
12310 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
12320 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b  CKA_ID:.....CACK
12330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12340 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
12350 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78  ibute CKA_ID (0x
12360 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
12370 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
12380 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
12390 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d  ...ucTmpBuf[0] =
123a0 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20   ((identity_num 
123b0 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66  + 1) >> 8) & 0xf
123c0 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  f;.....ucTmpBuf[
123d0 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f  1] =  (identity_
123e0 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b  num + 1) & 0xff;
123f0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
12400 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c  ucTmpBuf;.....ul
12410 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09  ValueLen = 2;...
12420 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12430 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
12440 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
12450 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
12460 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
12470 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
12480 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
12490 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
124a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
124b0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
124c0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
124d0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
124e0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
124f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12500 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
12510 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
12520 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
12530 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
12540 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12550 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
12560 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
12570 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
12580 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
12590 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
125a0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
125b0 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
125c0 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20  one certificate 
125d0 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63  type */.....ck_c
125e0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20  ertificate_type 
125f0 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09  = CKC_X_509;....
12600 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63  ..pValue = &ck_c
12610 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
12620 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
12630 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74  = sizeof(ck_cert
12640 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a  ificate_type);..
12650 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12660 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
12670 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30  turning CKC_X_50
12680 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  9 (%lu) (%p/%lu)
12690 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
126a0 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
126b0 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
126c0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
126d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
126e0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
126f0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
12700 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
12710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12720 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
12730 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b   attribute CKA_K
12740 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78  EY_TYPE (0x%08lx
12750 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
12760 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
12770 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
12780 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
12790 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
127a0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
127b0 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
127c0 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  Y) {......CACKEY
127d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
127e0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
127f0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
12800 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e  e are not a key.
12810 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
12820 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
12830 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
12840 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09  ne key type */..
12850 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d  ...ck_key_type =
12860 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70   CKK_RSA;......p
12870 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f  Value = &ck_key_
12880 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
12890 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
128a0 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09  _key_type);.....
128b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
128c0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
128d0 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c  ning CKK_RSA (%l
128e0 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
128f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
12900 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
12910 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
12920 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
12930 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
12940 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
12950 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
12960 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  GN:.....CACKEY_D
12970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
12980 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
12990 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30  e CKA_SIGN (0x%0
129a0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
129b0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
129c0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
129d0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
129e0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
129f0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
12a00 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
12a10 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
12a20 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
12a30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
12a40 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
12a50 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
12a60 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
12a70 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
12a80 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
12a90 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
12aa0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
12ab0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
12ac0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
12ad0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
12ae0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
12af0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
12b00 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
12b10 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
12b20 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
12b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12b40 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
12b50 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
12b60 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25  IGN_RECOVER (0x%
12b70 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
12b80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
12b90 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
12ba0 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c  ../* We currentl
12bb0 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22  y only support "
12bc0 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64  Sign with Append
12bd0 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75  ix" */.....pValu
12be0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
12bf0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
12c00 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
12c10 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
12c20 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
12c30 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
12c40 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
12c50 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
12c60 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
12c70 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
12c80 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
12c90 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
12ca0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44  k;....case CKA_D
12cb0 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b  ECRYPT:.....CACK
12cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12cd0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
12ce0 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50  ibute CKA_DECRYP
12cf0 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  T (0x%08lx) ..."
12d00 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12d10 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
12d20 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
12d30 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
12d40 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62  RIVATE_KEY || ob
12d50 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
12d60 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
12d70 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
12d80 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
12d90 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
12da0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
12db0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
12dc0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
12dd0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
12de0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
12df0 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
12e00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12e10 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
12e20 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
12e30 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12e40 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
12e50 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
12e60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12e70 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
12e80 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
12e90 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  se CKA_SENSITIVE
12ea0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
12eb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
12ec0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
12ed0 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30  CKA_SENSITIVE (0
12ee0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
12ef0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
12f00 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
12f10 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
12f20 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
12f30 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
12f40 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
12f50 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
12f60 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
12f70 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
12f80 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
12f90 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
12fa0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
12fb0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
12fc0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
12fd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
12fe0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
12ff0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
13000 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
13010 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
13020 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
13030 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
13040 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
13050 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
13060 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  A_EXTRACTABLE:..
13070 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13080 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
13090 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
130a0 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78  _EXTRACTABLE (0x
130b0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
130c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
130d0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
130e0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
130f0 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
13100 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
13110 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
13120 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
13130 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
13140 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
13150 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
13160 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
13170 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
13180 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
13190 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
131a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
131b0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
131c0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
131d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
131e0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
131f0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
13200 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
13210 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
13220 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
13230 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41  _MODULUS:.....CA
13240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13250 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
13260 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55  tribute CKA_MODU
13270 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  LUS (0x%08lx) ..
13280 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
13290 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
132a0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 65  pe);......if (ce
132b0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
132c0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
132d0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
132e0 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69  to_modulus(certi
132f0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
13300 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
13310 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
13320 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
13330 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
13340 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
13350 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
13360 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
13370 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
13380 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
13390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
133a0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
133b0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
133c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
133d0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
133e0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
133f0 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
13400 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ENT:.....CACKEY_
13410 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13420 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
13430 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  te CKA_PUBLIC_EX
13440 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29  PONENT (0x%08lx)
13450 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
13460 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
13470 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
13480 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
13490 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
134a0 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
134b0 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63  09_to_exponent(c
134c0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
134d0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
134e0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
134f0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
13500 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
13510 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
13520 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
13530 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
13540 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
13550 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
13560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13570 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
13580 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
13590 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
135a0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
135b0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
135c0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45  ase CKA_TRUST_SE
135d0 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 09 43  RVER_AUTH:.....C
135e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
135f0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
13600 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
13610 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 20 28  ST_SERVER_AUTH (
13620 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
13630 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
13640 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
13650 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
13660 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
13670 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
13680 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
13690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
136a0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
136b0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
136c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
136d0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
136e0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
136f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13700 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
13710 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
13720 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  se CKA_TRUST_CLI
13730 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09 43 41  ENT_AUTH:.....CA
13740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13750 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
13760 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
13770 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 28 30  T_CLIENT_AUTH (0
13780 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
13790 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
137a0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
137b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
137c0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
137d0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
137e0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
137f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13800 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
13810 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
13820 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13830 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
13840 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
13850 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13860 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
13870 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13880 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45  e CKA_TRUST_CODE
13890 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41  _SIGNING:.....CA
138a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
138b0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
138c0 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
138d0 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28  T_CODE_SIGNING (
138e0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
138f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
13900 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
13910 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
13920 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
13930 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
13940 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
13950 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13960 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
13970 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
13980 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13990 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
139a0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
139b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
139c0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
139d0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
139e0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41  se CKA_TRUST_EMA
139f0 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09  IL_PROTECTION:..
13a00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13a10 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
13a20 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
13a30 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
13a40 54 45 43 54 49 4f 4e 20 28 30 78 25 30 38 6c 78  TECTION (0x%08lx
13a50 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
13a60 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
13a70 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
13a80 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
13a90 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
13aa0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
13ab0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
13ac0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
13ad0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
13ae0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
13af0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
13b00 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
13b10 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
13b20 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
13b30 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
13b40 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a  ak;....default:.
13b50 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
13b60 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  L;.....ulValueLe
13b70 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
13b80 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
13b90 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e  ....if (((CK_LON
13ba0 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21  G) ulValueLen) !
13bb0 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29  = ((CK_LONG) -1)
13bc0 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63  ) {..../* Push c
13bd0 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68  urr_attr onto th
13be0 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75  e stack */....cu
13bf0 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63  rr_attr.type = c
13c00 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
13c10 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  ..curr_attr.ulVa
13c20 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
13c30 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74  Len;.....curr_at
13c40 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  tr.pValue = mall
13c50 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  oc(curr_attr.ulV
13c60 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d  alueLen);....mem
13c70 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56  cpy(curr_attr.pV
13c80 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75  alue, pValue, cu
13c90 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
13ca0 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61  en);.....if (pVa
13cb0 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c  lue_free && pVal
13cc0 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70  ue) {.....free(p
13cd0 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09  Value);....}....
13ce0 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d  .if (numattrs >=
13cf0 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b   retval_count) {
13d00 0a 09 09 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e  .....retval_coun
13d10 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74 76  t *= 2;.....retv
13d20 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
13d30 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
13d40 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
13d50 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  al));....}.....m
13d60 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75  emcpy(&retval[nu
13d70 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61  mattrs], &curr_a
13d80 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  ttr, sizeof(curr
13d90 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61  _attr));....numa
13da0 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a  ttrs++;...}..}..
13db0 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d  .if (numattrs !=
13dc0 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63   0) {...retval_c
13dd0 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b  ount = numattrs;
13de0 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
13df0 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
13e00 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
13e10 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20  f(*retval));..} 
13e20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65  else {...free(re
13e30 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
13e40 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70   = NULL;..}...*p
13e50 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  ulCount = numatt
13e60 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  rs;...CACKEY_DEB
13e70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
13e80 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73  ning %lu objects
13e90 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72   (%p).", numattr
13ea0 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  s, retval);...re
13eb0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
13ec0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
13ed0 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
13ee0 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
13ef0 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
13f00 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64  tities, unsigned
13f10 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73   long identities
13f20 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54  _count) {..CK_AT
13f30 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
13f40 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  tr;..unsigned lo
13f50 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f  ng id_idx, attr_
13f60 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  idx;...if (ident
13f70 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  ities == NULL ||
13f80 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
13f90 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t == 0) {...retu
13fa0 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
13fb0 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78  _idx = 0; id_idx
13fc0 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f   < identities_co
13fd0 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b  unt; id_idx++) {
13fe0 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
13ff0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
14000 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28  utes) {....for (
14010 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
14020 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
14030 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
14040 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74  ibutes_count; at
14050 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
14060 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65  curr_attr = &ide
14070 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
14080 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f  attributes[attr_
14090 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63  idx];......if (c
140a0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
140b0 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
140c0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
140d0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
140e0 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
140f0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
14100 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69  es) {.....free(i
14110 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
14120 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09  ].attributes);..
14130 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
14140 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69  ree_certs(identi
14150 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
14160 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31  c_identity, 1, 1
14170 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65  );...}..}...free
14180 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a  (identities);.}.
14190 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
141a0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
141b0 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
141c0 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
141d0 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
141e0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a   unsigned long *
141f0 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74  ids_found) {..st
14200 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
14210 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
14220 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72  identities;..str
14230 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
14240 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
14250 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
14260 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c  num_ids, id_idx,
14270 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09   curr_id_type;..
14280 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
14290 6d 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64  m_certs, cert_id
142a0 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
142b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
142c0 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66  .");...if (ids_f
142d0 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ound == NULL) {.
142e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
142f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69  RINTF("Error.  i
14300 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c  ds_found is NULL
14310 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
14320 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69  LL);..}...pcsc_i
14330 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
14340 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c  ey_read_certs(sl
14350 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  ot, NULL, &num_c
14360 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63  erts);..if (pcsc
14370 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
14380 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76  ULL) {.../* Conv
14390 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65  ert number of Ce
143a0 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66  rts to number of
143b0 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75   objects */...nu
143c0 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49  m_ids = (CKO_PRI
143d0 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43  VATE_KEY - CKO_C
143e0 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20  ERTIFICATE + 1) 
143f0 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09  * num_certs;....
14400 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c  identities = mal
14410 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69  loc(num_ids * si
14420 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
14430 29 29 3b 0a 0a 09 09 69 64 5f 69 64 78 20 3d 20  ));....id_idx = 
14440 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
14450 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
14460 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65   < num_certs; ce
14470 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66  rt_idx++) {....f
14480 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
14490 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
144a0 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
144b0 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
144c0 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
144d0 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74  e++) {.....ident
144e0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
144f0 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
14500 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
14510 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
14520 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
14530 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
14540 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
14550 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
14560 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
14570 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
14580 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
14590 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
145a0 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
145b0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
145c0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09  _count = 0;.....
145d0 7d 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  }......identitie
145e0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
145f0 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  dentity = malloc
14600 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74  (sizeof(*identit
14610 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
14620 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  _identity));....
14630 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
14640 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
14650 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f  identity, &pcsc_
14660 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
14670 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64  idx], sizeof(*id
14680 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
14690 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
146a0 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
146b0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
146c0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
146d0 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  cate = malloc(pc
146e0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
146f0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
14700 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
14710 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
14720 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
14730 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
14740 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
14750 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
14760 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, pcsc_
14770 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
14780 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
14790 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69  _len);......id_i
147a0 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  dx++;....}...}..
147b0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
147c0 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
147d0 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
147e0 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e  1);....*ids_foun
147f0 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 09 09 72  d = num_ids;...r
14800 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
14810 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75  );..}...*ids_fou
14820 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28  nd = 0;..return(
14830 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  NULL);.}..CK_DEF
14840 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
14850 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  RV, C_Initialize
14860 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49  )(CK_VOID_PTR pI
14870 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43  nitArgs) {..CK_C
14880 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
14890 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75   CK_PTR args;..u
148a0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e  int32_t idx;..in
148b0 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  t mutex_init_ret
148c0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
148d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
148e0 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 69 74 41  ");...if (pInitA
148f0 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rgs != NULL) {..
14900 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67  .args = pInitArg
14910 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63  s;...memcpy(&cac
14920 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20  key_args, args, 
14930 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72  sizeof(cackey_ar
14940 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67  gs));....if (arg
14950 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  s->CreateMutex =
14960 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
14970 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20  DestroyMutex == 
14980 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
14990 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  ckMutex == NULL 
149a0 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
149b0 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  utex == NULL) {.
149c0 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
149d0 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ateMutex != NULL
149e0 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
149f0 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  yMutex != NULL |
14a00 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
14a10 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
14a20 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21  s->UnlockMutex !
14a30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
14a40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14a50 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20  F("Error. Some, 
14a60 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65  but not All thre
14a70 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  ading primitives
14a80 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09   provided.");...
14a90 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
14aa0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
14ab0 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 61 72  .}...}....if (ar
14ac0 67 73 2d 3e 70 52 65 73 65 72 76 65 64 20 21 3d  gs->pReserved !=
14ad0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b   NULL) {....CACK
14ae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14af0 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
14b00 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
14b10 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
14b20 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
14b30 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
14b40 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  .cackey_args.Cre
14b50 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ateMutex = NULL;
14b60 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44  ...cackey_args.D
14b70 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55  estroyMutex = NU
14b80 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
14b90 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  s.LockMutex = NU
14ba0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
14bb0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20  s.UnlockMutex = 
14bc0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
14bd0 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09  rgs.flags = 0;..
14be0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69  }...if (cackey_i
14bf0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
14c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14c10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72  NTF("Error.  Alr
14c20 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
14c30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14c40 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45  KR_CRYPTOKI_ALRE
14c50 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  ADY_INITIALIZED)
14c60 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
14c70 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
14c80 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
14c90 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
14ca0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
14cb0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
14cc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
14cd0 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  x].active = 0;..
14ce0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
14cf0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
14d00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
14d10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
14d20 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
14d30 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
14d40 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
14d50 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
14d60 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
14d70 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  er = NULL;...cac
14d80 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
14d90 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
14da0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
14db0 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
14dc0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
14dd0 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ck = 0;...cackey
14de0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
14df0 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61  _reset = 0;...ca
14e00 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
14e10 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
14e20 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
14e30 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  idx].label = NUL
14e40 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69  L;..}...cackey_i
14e50 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
14e60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69  ..if (!cackey_bi
14e70 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09  glock_init) {...
14e80 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d  mutex_init_ret =
14e90 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72   cackey_mutex_cr
14ea0 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67  eate(&cackey_big
14eb0 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75  lock);....if (mu
14ec0 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20  tex_init_ret != 
14ed0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
14ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14ef0 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69  or.  Mutex initi
14f00 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64  alization failed
14f10 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
14f20 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a  CKR_CANT_LOCK);.
14f30 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69  ..}....cackey_bi
14f40 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a  glock_init = 1;.
14f50 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
14f60 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
14f70 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
14f80 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
14f90 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
14fa0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
14fb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61  ON(CK_RV, C_Fina
14fc0 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
14fd0 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
14fe0 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09  uint32_t idx;...
14ff0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15000 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
15010 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
15020 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
15030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15040 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
15050 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
15060 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15070 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
15080 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
15090 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
150a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
150b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
150c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
150d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
150e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
150f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
15100 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
15110 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
15120 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
15130 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
15140 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
15150 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
15160 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
15170 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
15180 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
15190 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  x);...}..}...cac
151a0 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
151b0 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f  nect_all();...fo
151c0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
151d0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
151e0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
151f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
15200 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
15210 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
15220 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
15230 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
15240 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
15250 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a  sc_reader);...}.
15260 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  .}...cackey_pcsc
15270 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
15280 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
15290 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  zed = 0;...CACKE
152a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
152b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
152c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
152d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
152e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
152f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
15300 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e  C_GetInfo)(CK_IN
15310 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
15320 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
15330 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
15340 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
15350 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
15360 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69  c CK_UTF8CHAR li
15370 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
15380 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a  [] = "CACKey";..
15390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
153a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
153b0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
153c0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
153d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
153e0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
153f0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
15400 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
15410 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
15420 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
15430 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
15440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15450 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
15460 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
15470 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
15480 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
15490 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72  ;..}...pInfo->cr
154a0 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61  yptokiVersion.ma
154b0 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
154c0 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
154d0 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
154e0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  xff;..pInfo->cry
154f0 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e  ptokiVersion.min
15500 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
15510 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
15520 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
15530 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  f;...memset(pInf
15540 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
15550 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
15560 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
15570 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
15580 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
15590 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
155a0 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
155b0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
155c0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  1);...pInfo->fla
155d0 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d  gs = 0x00;...mem
155e0 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  set(pInfo->libra
155f0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  ryDescription, '
15600 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
15610 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
15620 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
15630 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
15640 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61  scription, libra
15650 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  ryDescription, s
15660 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73  izeof(libraryDes
15670 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
15680 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
15690 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
156a0 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
156b0 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
156c0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  ff;..pInfo->libr
156d0 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  aryVersion.minor
156e0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
156f0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
15700 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
15710 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15720 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
15730 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
15740 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
15750 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73  }../*. * Process
15760 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
15770 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70  , and create map
15780 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61  ping between rea
15790 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f  der name and slo
157a0 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49  t ID. */.CK_DEFI
157b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
157c0 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  V, C_GetSlotList
157d0 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e  )(CK_BBOOL token
157e0 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54  Present, CK_SLOT
157f0 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73  _ID_PTR pSlotLis
15800 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
15810 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74  pulCount) {..int
15820 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
15830 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  int pcsc_connect
15840 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _ret;..CK_ULONG 
15850 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
15860 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 3b  t = 0, currslot;
15870 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
15880 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  ders, *pcsc_read
15890 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61  ers_s, *pcsc_rea
158a0 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70  ders_e;..DWORD p
158b0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
158c0 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73  ..LONG scard_lis
158d0 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73  treaders_ret;..s
158e0 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65  ize_t curr_reade
158f0 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  r_len;...CACKEY_
15900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15910 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
15920 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
15930 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15940 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
15950 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
15960 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
15970 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
15980 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
15990 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
159a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
159b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
159c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
159d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
159e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
159f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15a00 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
15a10 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
15a20 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
15a30 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
15a40 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
15a50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15a60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15a70 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
15a80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15a90 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
15aa0 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c  ..}.../* Clear l
15ab0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a  ist of slots */.
15ac0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
15ad0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15ae0 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67  _PRINTF("Purging
15af0 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   all slot inform
15b00 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20  ation.");..../* 
15b10 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
15b20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
15b30 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
15b40 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68   being supply th
15b50 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
15b60 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73  on */...cackey_s
15b70 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
15b80 61 6c 6c 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63  all();....for (c
15b90 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
15ba0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
15bb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
15bc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
15bd0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
15be0 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63  ot++) {....if (c
15bf0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
15c00 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
15c10 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28 63 61  r) {.....free(ca
15c20 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
15c30 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
15c40 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  );......cackey_s
15c50 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
15c60 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
15c70 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  L;....}.....if (
15c80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
15c90 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a  rslot].label) {.
15ca0 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
15cb0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
15cc0 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 63 61 63  label);......cac
15cd0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
15ce0 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
15cf0 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
15d00 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
15d10 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09  ].active = 0;...
15d20 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  }..}.../* Determ
15d30 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ine list of read
15d40 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e  ers */..pcsc_con
15d50 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
15d60 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
15d70 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
15d80 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
15d90 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
15da0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15db0 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
15dc0 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
15dd0 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c  , assuming no sl
15de0 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63  ots");....slot_c
15df0 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  ount = 0;..} els
15e00 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65  e {...pcsc_reade
15e10 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73  rs_len = 0;....s
15e20 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
15e30 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
15e40 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
15e50 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
15e60 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
15e70 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09  eaders_len);....
15e80 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
15e90 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
15ea0 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29  RD_F_COMM_ERROR)
15eb0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
15ec0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15ed0 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  . SCardListReade
15ee0 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  rs() returned SC
15ef0 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
15f00 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65  , assuming Conne
15f10 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77  ction to PC/SC w
15f20 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e  ent away. Reconn
15f30 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63  ecting.");.....c
15f40 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
15f50 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b  nnect();....cack
15f60 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
15f70 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
15f80 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
15f90 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  ng SCardListRead
15fa0 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09  ers() again");..
15fb0 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
15fc0 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
15fd0 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
15fe0 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
15ff0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
16000 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
16010 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
16020 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
16030 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
16040 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64  ESS && pcsc_read
16050 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a  ers_len != 0) {.
16060 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
16070 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65  = malloc(pcsc_re
16080 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70  aders_len);....p
16090 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20  csc_readers_s = 
160a0 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09  pcsc_readers;...
160b0 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
160c0 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
160d0 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
160e0 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
160f0 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65  NULL, pcsc_reade
16100 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72  rs, &pcsc_reader
16110 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73  s_len);....if (s
16120 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
16130 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
16140 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70  SUCCESS) {.....p
16150 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20  csc_readers_e = 
16160 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70  pcsc_readers + p
16170 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
16180 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77  ....../* Start w
16190 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74  ith Slot ID 1, t
161a0 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e  o avoid a bug in
161b0 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a   GDM on RHEL */.
161c0 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31  ..../* Bug 59491
161d0 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  1: https://bugzi
161e0 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73  lla.redhat.com/s
161f0 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35  how_bug.cgi?id=5
16200 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72  94911 */.....cur
16210 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77  rslot = 1;.....w
16220 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65  hile (pcsc_reade
16230 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72  rs < pcsc_reader
16240 73 5f 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72  s_e) {......curr
16250 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74  _reader_len = st
16260 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72  rlen(pcsc_reader
16270 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70  s);.......if ((p
16280 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75  csc_readers + cu
16290 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e  rr_reader_len) >
162a0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29   pcsc_readers_e)
162b0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
162c0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
162d0 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  (curr_reader_len
162e0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62   == 0) {.......b
162f0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
16300 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20  ...if (currslot 
16310 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
16320 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
16330 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
16340 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ]))) {.......CAC
16350 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16360 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61  ("Found more rea
16370 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20  ders than slots 
16380 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29  are available!")
16390 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
163a0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43  .....}.......CAC
163b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
163c0 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20  ("Found reader: 
163d0 25 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72  %s", pcsc_reader
163e0 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c  s);......./* Onl
163f0 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
16400 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
16410 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
16420 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79  ing asked supply
16430 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
16440 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66  ation */......if
16450 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09   (pSlotList) {..
16460 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
16470 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
16480 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 63 61  ve = 1;.......ca
16490 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
164a0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
164b0 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72   = strdup(pcsc_r
164c0 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 63  eaders);.......c
164d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
164e0 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
164f0 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
16500 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
16510 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
16520 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
16530 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
16540 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
16550 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
16560 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
16570 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
16580 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f  [currslot].slot_
16590 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 09 09 09  reset = 1;......
165a0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
165b0 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  rrslot].token_fl
165c0 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
165d0 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09  REQUIRED;.......
165e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
165f0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
16600 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ULL;......}.....
16610 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09  .currslot++;....
16620 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
16630 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
16640 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  en + 1;.....}...
16650 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
16660 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
16670 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
16680 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
16690 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
166a0 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
166b0 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
166c0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
166d0 31 31 20 2a 2f 0a 09 09 09 09 69 66 20 28 63 75  11 */.....if (cu
166e0 72 72 73 6c 6f 74 20 3e 20 31 29 20 7b 0a 09 09  rrslot > 1) {...
166f0 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
16700 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
16710 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
16720 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
16730 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
16740 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
16750 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
16760 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
16770 39 31 31 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74  911 */......slot
16780 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f  _count = currslo
16790 74 20 2d 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09  t - 1;.....}....
167a0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
167b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
167c0 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f  ("Second call to
167d0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
167e0 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
167f0 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
16800 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
16810 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
16820 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
16830 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
16840 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
16850 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
16860 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29  (pcsc_readers_s)
16870 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
16880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16890 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20  NTF("First call 
168a0 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
168b0 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
168c0 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
168d0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
168e0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
168f0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
16900 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
16910 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
16920 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  et);...}..}...mu
16930 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16940 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
16950 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
16960 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
16970 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
16980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16990 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
169a0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
169b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
169c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
169d0 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
169e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
169f0 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
16a00 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ount;....CACKEY_
16a10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16a20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
16a30 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
16a40 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74  readers, but not
16a50 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53   storing IDs (pS
16a60 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  lotList == NULL)
16a70 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
16a80 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
16a90 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
16aa0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
16ab0 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e  count = *pulCoun
16ac0 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  t;..if (count < 
16ad0 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  slot_count) {...
16ae0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16af0 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
16b00 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
16b10 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68  ntries, but we h
16b20 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e  ave %lu entries.
16b30 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  ", count, slot_c
16b40 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
16b50 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
16b60 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 66 6f  SMALL);...}...fo
16b70 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
16b80 20 63 75 72 72 73 6c 6f 74 20 3c 20 73 6c 6f 74   currslot < slot
16b90 5f 63 6f 75 6e 74 3b 20 63 75 72 72 73 6c 6f 74  _count; currslot
16ba0 2b 2b 29 20 7b 0a 09 09 2f 2a 20 53 74 61 72 74  ++) {.../* Start
16bb0 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c   with Slot ID 1,
16bc0 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20   to avoid a bug 
16bd0 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a  in GDM on RHEL *
16be0 2f 0a 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31  /.../* Bug 59491
16bf0 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  1: https://bugzi
16c00 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73  lla.redhat.com/s
16c10 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35  how_bug.cgi?id=5
16c20 39 34 39 31 31 20 2a 2f 0a 09 09 70 53 6c 6f 74  94911 */...pSlot
16c30 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d 20 3d  List[currslot] =
16c40 20 63 75 72 72 73 6c 6f 74 20 2b 20 31 3b 0a 09   currslot + 1;..
16c50 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  }...*pulCount = 
16c60 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41  slot_count;...CA
16c70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16c80 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
16c90 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64  _OK (%i).  Found
16ca0 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20   %lu readers.", 
16cb0 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
16cc0 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
16cd0 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
16ce0 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72  R_OK);...tokenPr
16cf0 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65  esent = tokenPre
16d00 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73  sent; /* Supress
16d10 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
16d20 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
16d30 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
16d40 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c  N(CK_RV, C_GetSl
16d50 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  otInfo)(CK_SLOT_
16d60 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c  ID slotID, CK_SL
16d70 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  OT_INFO_PTR pInf
16d80 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
16d90 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73  UTF8CHAR slotDes
16da0 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41  cription[] = "CA
16db0 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74  CKey Slot";..int
16dc0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
16dd0 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  int bytes_to_cop
16de0 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  y;...CACKEY_DEBU
16df0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
16e00 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
16e10 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
16e20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16e30 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
16e40 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
16e50 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
16e60 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
16e70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
16e80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
16e90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16ea0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
16eb0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
16ec0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
16ed0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
16ee0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
16ef0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
16f00 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
16f10 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
16f20 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
16f30 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
16f40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16f50 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
16f60 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
16f70 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
16f80 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
16f90 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
16fa0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
16fb0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
16fc0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16fd0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
16fe0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16ff0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
17000 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
17010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17020 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
17030 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
17040 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
17050 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
17060 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
17070 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
17080 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
170a0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
170b0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
170c0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
170d0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
170e0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
170f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
17100 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
17110 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
17120 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
17130 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  .}...pInfo->flag
17140 73 20 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c  s = CKF_REMOVABL
17150 45 5f 44 45 56 49 43 45 20 7c 20 43 4b 46 5f 48  E_DEVICE | CKF_H
17160 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 63 61  W_SLOT;...if (ca
17170 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
17180 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  nt(&cackey_slots
17190 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43  [slotID]) == CAC
171a0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
171b0 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e  PRESENT) {...pIn
171c0 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46  fo->flags |= CKF
171d0 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a  _TOKEN_PRESENT;.
171e0 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f  .}...bytes_to_co
171f0 70 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b  py = strlen(cack
17200 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
17210 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
17220 69 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f  if (sizeof(pInfo
17230 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
17240 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ) < bytes_to_cop
17250 79 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f  y) {...bytes_to_
17260 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49  copy = sizeof(pI
17270 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
17280 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79  rID);..}..memcpy
17290 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
172a0 75 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73  urerID, cackey_s
172b0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73  lots[slotID].pcs
172c0 63 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f  c_reader, bytes_
172d0 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65  to_copy);...mute
172e0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
172f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
17300 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
17310 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
17320 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
17330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17340 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
17350 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
17360 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
17370 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
17380 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
17390 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
173a0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
173b0 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69  o->slotDescripti
173c0 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  on));..memcpy(pI
173d0 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
173e0 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69  tion, slotDescri
173f0 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c  ption, sizeof(sl
17400 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  otDescription) -
17410 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
17420 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
17430 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
17440 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
17450 75 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66  urerID));...pInf
17460 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
17470 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
17480 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
17490 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
174a0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
174b0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
174c0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
174d0 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  n() >> 8) & 0xff
174e0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  ;...pInfo->firmw
174f0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
17500 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d   = 0x00;..pInfo-
17510 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
17520 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a  .minor = 0x00;..
17530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17540 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
17550 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
17560 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
17570 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
17580 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
17590 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e  K_RV, C_GetToken
175a0 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
175b0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45   slotID, CK_TOKE
175c0 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
175d0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
175e0 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
175f0 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
17600 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
17610 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
17620 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d  R defaultLabel[]
17630 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65   = "Unknown Toke
17640 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  n";..static CK_U
17650 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20  TF8CHAR model[] 
17660 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09  = "CAC Token";..
17670 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
17680 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
17690 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75  c_identities;..u
176a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
176b0 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74  _certs;..ssize_t
176c0 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74   label_ret;..int
176d0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
176e0 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f  int use_default_
176f0 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  label;...CACKEY_
17700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17710 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
17720 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
17730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
17750 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
17760 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
17770 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
17780 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
17790 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
177a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
177b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
177c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
177d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
177e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
177f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
17800 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
17810 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
17820 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
17830 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
17840 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
17850 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17860 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
17870 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
17880 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
17890 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
178a0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
178b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
178c0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
178d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
178e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
178f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
17900 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
17910 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
17920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17930 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
17940 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
17950 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
17960 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
17970 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
17980 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
17990 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
179a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
179b0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
179c0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
179d0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
179e0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
179f0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
17a00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
17a10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
17a20 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
17a30 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
17a40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
17a50 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
17a60 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
17a70 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
17a80 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
17a90 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
17aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17ab0 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65  "No token is pre
17ac0 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d  sent in slotID =
17ad0 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a   %lu", slotID);.
17ae0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
17af0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
17b00 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
17b10 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f  n(CKR_TOKEN_NOT_
17b20 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d  PRESENT);..}...m
17b30 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
17b40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
17b50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
17b60 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
17b70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
17b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17b90 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
17ba0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
17bb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
17bc0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
17bd0 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
17be0 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f   token label fro
17bf0 6d 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a  m certificates *
17c00 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  /..memset(pInfo-
17c10 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a  >label, ' ', siz
17c20 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
17c30 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74  ));..use_default
17c40 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66  _label = 1;...if
17c50 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
17c60 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20  lotID].label == 
17c70 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69  NULL) {...pcsc_i
17c80 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
17c90 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63  ey_read_certs(&c
17ca0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
17cb0 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  ID], NULL, &num_
17cc0 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63  certs);...if (pc
17cd0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
17ce0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
17cf0 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b  num_certs > 0) {
17d00 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d  .....label_ret =
17d10 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
17d20 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70  ntity_to_label(p
17d30 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
17d40 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69  pInfo->label, si
17d50 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
17d60 6c 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62  l));.....if (lab
17d70 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  el_ret > 0) {...
17d80 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  ...use_default_l
17d90 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09  abel = 0;.......
17da0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
17db0 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c  tID].label = mal
17dc0 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f  loc(sizeof(pInfo
17dd0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09  ->label));......
17de0 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
17df0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
17e00 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  el, pInfo->label
17e10 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
17e20 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09  label));.....}..
17e30 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
17e40 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
17e50 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
17e60 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d  erts, 1);...}..}
17e70 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
17e80 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63  (pInfo->label, c
17e90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
17ea0 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  ID].label, sizeo
17eb0 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
17ec0 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74  ;....use_default
17ed0 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a  _label = 0;..}..
17ee0 09 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74  .if (use_default
17ef0 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63  _label) {...memc
17f00 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  py(pInfo->label,
17f10 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73   defaultLabel, s
17f20 69 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62  izeof(defaultLab
17f30 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d  el) - 1);..}...m
17f40 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
17f50 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
17f60 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
17f70 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
17f80 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
17f90 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
17fa0 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c   manufacturerID,
17fb0 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74   sizeof(manufact
17fc0 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09  urerID) - 1);...
17fd0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f  memset(pInfo->mo
17fe0 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  del, ' ', sizeof
17ff0 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b  (pInfo->model));
18000 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
18010 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69  model, model, si
18020 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29  zeof(model) - 1)
18030 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
18040 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20  ->serialNumber, 
18050 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
18060 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29  o->serialNumber)
18070 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
18080 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c  o->utcTime, ' ',
18090 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75   sizeof(pInfo->u
180a0 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66  tcTime));...pInf
180b0 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
180c0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
180d0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
180e0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
180f0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
18100 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
18110 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
18120 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  n() >> 8) & 0xff
18130 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  ;...pInfo->firmw
18140 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
18150 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d   = 0x00;..pInfo-
18160 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
18170 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a  .minor = 0x00;..
18180 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
18190 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  CKF_WRITE_PROTEC
181a0 54 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  TED | CKF_USER_P
181b0 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  IN_INITIALIZED |
181c0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49   CKF_TOKEN_INITI
181d0 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f  ALIZED | cackey_
181e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
181f0 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e  ken_flags;...pIn
18200 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e  fo->ulMaxSession
18210 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28  Count = (sizeof(
18220 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
18230 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
18240 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d  _sessions[0])) -
18250 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65   1;..pInfo->ulSe
18260 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f  ssionCount = CK_
18270 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
18280 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
18290 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43  >ulMaxRwSessionC
182a0 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  ount = 0;..pInfo
182b0 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75  ->ulRwSessionCou
182c0 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  nt = CK_UNAVAILA
182d0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
182e0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69  ..pInfo->ulMaxPi
182f0 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e  nLen = 128;..pIn
18300 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20  fo->ulMinPinLen 
18310 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  = 0;..pInfo->ulT
18320 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79  otalPublicMemory
18330 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
18340 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
18350 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62  pInfo->ulFreePub
18360 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
18370 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
18380 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
18390 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65  ulTotalPrivateMe
183a0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
183b0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
183c0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
183d0 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  ePrivateMemory =
183e0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
183f0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43  INFORMATION;...C
18400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18410 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
18420 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
18430 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
18440 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
18450 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
18460 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  RV, C_WaitForSlo
18470 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53  tEvent)(CK_FLAGS
18480 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f   flags, CK_SLOT_
18490 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20  ID_PTR pSlotID, 
184a0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
184b0 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59  erved) {..CACKEY
184c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
184d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
184e0 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
184f0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
18500 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
18510 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
18520 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
18530 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
18540 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
18550 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18560 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18580 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
18590 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
185a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
185b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
185c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
185d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
185e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
185f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
18600 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
18610 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
18620 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
18630 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
18640 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
18650 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
18660 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
18670 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29  etMechanismList)
18680 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
18690 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
186a0 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61  _TYPE_PTR pMecha
186b0 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f  nismList, CK_ULO
186c0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
186d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
186e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
186f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
18700 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
18710 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18720 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18730 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
18740 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18750 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
18760 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
18770 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d  ..if (pulCount =
18780 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
18790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
187a0 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e  "Error.  pulCoun
187b0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
187c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
187d0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
187e0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c  .if (pMechanismL
187f0 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
18800 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a  .*pulCount = 3;.
18810 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18820 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18830 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
18840 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
18850 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
18860 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c  .if (*pulCount <
18870 20 33 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   3) {...CACKEY_D
18880 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18890 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20  or.  Buffer too 
188a0 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74  small.");....ret
188b0 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54  urn(CKR_BUFFER_T
188c0 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09  OO_SMALL);..}...
188d0 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30  pMechanismList[0
188e0 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ] = CKM_RSA_PKCS
188f0 3b 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  ;..pMechanismLis
18900 74 5b 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f  t[1] = CKM_SHA1_
18910 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43  RSA_PKCS;..*pulC
18920 6f 75 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b  ount = 2;...CACK
18930 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18940 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
18950 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
18960 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
18970 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
18980 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
18990 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
189a0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
189b0 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
189c0 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20  NISM_TYPE type, 
189d0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46  CK_MECHANISM_INF
189e0 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
189f0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
18a00 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
18a10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
18a20 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
18a30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
18a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18a50 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
18a60 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
18a70 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
18a80 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
18a90 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
18aa0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
18ab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18ac0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
18ad0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
18ae0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
18af0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
18b00 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
18b10 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
18b20 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
18b30 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
18b40 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
18b50 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
18b60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18b70 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
18b80 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
18b90 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
18ba0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
18bb0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
18bc0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
18bd0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
18be0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
18bf0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
18c00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
18c10 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
18c20 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
18c30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18c40 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
18c50 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
18c60 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
18c70 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
18c80 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
18c90 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
18ca0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
18cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18cc0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
18cd0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
18ce0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
18cf0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
18d00 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
18d10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
18d20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
18d30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
18d40 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
18d50 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
18d60 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
18d70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
18d80 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
18d90 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
18da0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18db0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18dc0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
18dd0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
18de0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
18df0 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a  R);..}.../* XXX:
18e00 20 54 68 69 73 20 69 73 20 75 6e 74 65 73 74 65   This is unteste
18e10 64 2c 20 61 6e 64 20 66 75 72 74 68 65 72 20 49  d, and further I
18e20 27 6d 20 6e 6f 74 20 72 65 61 6c 6c 79 20 73 75  'm not really su
18e30 72 65 20 69 66 20 74 68 69 73 20 69 73 20 63 6f  re if this is co
18e40 72 72 65 63 74 2e 20 2a 2f 0a 09 73 77 69 74 63  rrect. */..switc
18e50 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73  h (type) {...cas
18e60 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
18e70 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
18e80 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
18e90 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
18ea0 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
18eb0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
18ec0 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52  KF_HW | CKF_ENCR
18ed0 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50  YPT | CKF_DECRYP
18ee0 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43  T | CKF_SIGN | C
18ef0 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72  KF_VERIFY;....br
18f00 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  eak;...case CKM_
18f10 52 53 41 5f 58 5f 35 30 39 3a 0a 09 09 09 70 49  RSA_X_509:....pI
18f20 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a  nfo->ulMinKeySiz
18f30 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66  e = 512;....pInf
18f40 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20  o->ulMaxKeySize 
18f50 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f  = 8192;....pInfo
18f60 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
18f70 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c   | CKF_ENCRYPT |
18f80 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43   CKF_DECRYPT | C
18f90 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45  KF_SIGN | CKF_VE
18fa0 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  RIFY;....break;.
18fb0 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f  ..case CKM_SHA1_
18fc0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e  RSA_PKCS:....pIn
18fd0 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
18fe0 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
18ff0 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
19000 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
19010 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
19020 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46  | CKF_SIGN | CKF
19030 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61  _VERIFY;....brea
19040 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  k;..}...CACKEY_D
19050 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19060 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
19070 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
19080 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
19090 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
190a0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
190b0 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
190c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
190d0 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b   C_InitToken)(CK
190e0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
190f0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
19100 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
19110 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ulPinLen, CK_UTF
19120 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c  8CHAR_PTR pLabel
19130 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
19140 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
19150 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
19160 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
19170 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19180 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19190 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
191a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
191b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
191c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
191d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
191e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
191f0 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
19200 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
19210 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
19220 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
19230 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
19240 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
19250 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  D);.}../* We don
19260 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
19270 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
19280 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
19290 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28  _RV, C_InitPIN)(
192a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
192b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
192c0 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
192d0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
192e0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
192f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
19300 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
19310 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
19320 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
19330 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19340 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
19350 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
19360 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
19370 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
19380 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
19390 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
193a0 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
193b0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
193c0 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
193d0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
193e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
193f0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
19400 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  CTED);.}../* We 
19410 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
19420 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
19430 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
19440 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e  (CK_RV, C_SetPIN
19450 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
19460 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
19470 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f  _UTF8CHAR_PTR pO
19480 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ldPin, CK_ULONG 
19490 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f  ulOldPinLen, CK_
194a0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65  UTF8CHAR_PTR pNe
194b0 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  wPin, CK_ULONG u
194c0 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43  lNewPinLen) {..C
194d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
194e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
194f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
19500 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
19510 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19520 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
19530 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
19540 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
19550 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
19560 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
19570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19580 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
19590 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
195a0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
195b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
195c0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
195d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
195e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
195f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
19600 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
19610 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f  OpenSession)(CK_
19620 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
19630 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20  CK_FLAGS flags, 
19640 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
19650 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54  lication, CK_NOT
19660 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53  IFY notify, CK_S
19670 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54  ESSION_HANDLE_PT
19680 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  R phSession) {..
19690 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
196a0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
196b0 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64  tval;..int found
196c0 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09  _session = 0;...
196d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
196e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
196f0 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43  ..if ((flags & C
19700 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
19710 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c  N) != CKF_SERIAL
19720 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65  _SESSION) {...re
19730 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
19740 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55  _PARALLEL_NOT_SU
19750 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69  PPORTED);..}...i
19760 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
19770 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
19780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19790 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
197a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
197b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
197c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
197d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
197e0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
197f0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
19800 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
19810 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
19820 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
19830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19840 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
19850 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
19860 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
19870 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
19880 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
19890 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
198a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
198b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
198c0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
198d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
198e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
198f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
19900 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19910 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
19920 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
19930 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
19940 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
19950 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
19960 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
19970 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
19980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19990 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
199a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
199b0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
199c0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
199d0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
199e0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
199f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
19a00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
19a10 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
19a20 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
19a30 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20  hat the card is 
19a40 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20  actually in the 
19a50 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58  slot. */../* XXX
19a60 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  : Check to make 
19a70 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20  sure this is in 
19a80 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63  the PKCS#11 spec
19a90 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66  ification */..if
19aa0 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
19ab0 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
19ac0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
19ad0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
19ae0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
19af0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19b00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61  INTF("Error.  Ca
19b10 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20  rd not present. 
19b20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44   Returning CKR_D
19b30 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b  EVICE_REMOVED");
19b40 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
19b50 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
19b60 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
19b70 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45  rn(CKR_DEVICE_RE
19b80 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  MOVED);..}...for
19b90 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c   (idx = 1; idx <
19ba0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
19bb0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
19bc0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
19bd0 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
19be0 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  {...if (!cackey_
19bf0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
19c00 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64  tive) {....found
19c10 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09  _session = 1;...
19c20 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69  ..*phSession = i
19c30 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  dx;.....cackey_s
19c40 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
19c50 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  ive = 1;....cack
19c60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
19c70 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44  .slotID = slotID
19c80 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
19c90 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20  ions[idx].state 
19ca0 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f  = CKS_RO_PUBLIC_
19cb0 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b  SESSION;....cack
19cc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
19cd0 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  .flags = flags;.
19ce0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
19cf0 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65  ns[idx].ulDevice
19d00 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61  Error = 0;....ca
19d10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
19d20 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20  x].pApplication 
19d30 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a  = pApplication;.
19d40 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
19d50 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d  ns[idx].Notify =
19d60 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63   notify;.....cac
19d70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
19d80 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ].identities = N
19d90 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ULL;....cackey_s
19da0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
19db0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
19dc0 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
19dd0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72  ssions[idx].sear
19de0 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  ch_active = 0;..
19df0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
19e00 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74  ns[idx].sign_act
19e10 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
19e20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
19e30 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
19e40 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
19e50 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
19e60 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
19e70 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
19e80 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
19e90 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
19ea0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
19eb0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
19ec0 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19ed0 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
19ee0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
19ef0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
19f00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
19f10 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
19f20 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
19f30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19f40 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
19f50 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
19f60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
19f70 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
19f80 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29  (!found_session)
19f90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19fa0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
19fb0 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  ing CKR_SESSION_
19fc0 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52  COUNT (%i)", CKR
19fd0 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
19fe0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
19ff0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09  ESSION_COUNT);..
1a000 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1a010 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1a020 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1a030 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1a040 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1a050 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1a060 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
1a070 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53  Session)(CK_SESS
1a080 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1a090 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
1a0a0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1a0b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a0c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1a0d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1a0e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1a0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a100 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1a110 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1a120 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1a130 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1a140 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
1a150 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
1a160 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
1a170 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1a180 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1a190 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1a1a0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1a1b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a1c0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
1a1d0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
1a1e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1a1f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1a200 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1a210 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1a220 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1a230 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1a240 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1a250 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1a260 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a270 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1a280 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1a290 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1a2a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1a2b0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1a2c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1a2d0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1a2e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1a2f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1a300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a310 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1a320 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1a330 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1a340 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1a350 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1a360 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1a370 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1a380 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66  e = 0;..cackey_f
1a390 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63  ree_identities(c
1a3a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a3b0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1a3c0 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ies, cackey_sess
1a3d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1a3e0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1a3f0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1a400 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1a410 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1a420 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1a430 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1a440 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a450 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a460 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1a470 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1a480 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1a490 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1a4a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a4b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1a4c0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1a4d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1a4e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1a4f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1a500 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
1a510 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1a520 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  tID) {..uint32_t
1a530 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
1a540 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1a550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a560 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a570 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a580 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a5a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a5b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a5c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a5d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a5e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1a5f0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1a600 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1a610 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1a620 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1a630 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1a640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a650 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1a660 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1a670 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1a680 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1a690 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1a6a0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1a6b0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1a6c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1a6d0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1a6e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1a6f0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1a700 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1a710 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a720 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1a730 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1a740 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1a750 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1a760 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1a770 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1a780 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1a790 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a7a0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1a7b0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1a7c0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1a7d0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1a7e0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1a7f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1a800 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1a810 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1a820 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1a830 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1a840 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1a850 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1a860 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1a870 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
1a880 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
1a890 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1a8a0 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
1a8b0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1a8c0 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20  ons[idx].slotID 
1a8d0 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09  != slotID) {....
1a8e0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
1a8f0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1a900 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1a910 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c  iglock);....C_Cl
1a920 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
1a930 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1a940 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1a950 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  lock);...}..}...
1a960 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1a970 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1a980 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1a990 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1a9a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1a9b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a9c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1a9d0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1a9e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1a9f0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1aa00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1aa10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1aa20 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1aa30 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1aa40 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1aa50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1aa60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
1aa70 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53  essionInfo)(CK_S
1aa80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1aa90 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49  ession, CK_SESSI
1aaa0 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  ON_INFO_PTR pInf
1aab0 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  o) {..int mutex_
1aac0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1aad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1aae0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1aaf0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
1ab00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ab10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1ab20 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
1ab30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1ab40 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1ab50 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1ab60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1ab70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ab80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1ab90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1aba0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1abb0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1abc0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1abd0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1abe0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1abf0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1ac00 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1ac10 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1ac20 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1ac30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ac40 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1ac50 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1ac60 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ac70 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ac80 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1ac90 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1aca0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1acb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1acc0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1acd0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1ace0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1acf0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1ad00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1ad10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1ad20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1ad30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1ad40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ad50 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1ad60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1ad70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1ad80 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1ad90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ada0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1adb0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1adc0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1add0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1ade0 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c  ;..}...pInfo->sl
1adf0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
1ae00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ae10 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d  .slotID;..pInfo-
1ae20 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f  >state = cackey_
1ae30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ae40 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f  n].state;..pInfo
1ae50 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79  ->flags = cackey
1ae60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ae70 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66  on].flags;..pInf
1ae80 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  o->ulDeviceError
1ae90 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1aea0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44  ns[hSession].ulD
1aeb0 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75  eviceError;...mu
1aec0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1aed0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1aee0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1aef0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1af00 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1af10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1af20 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1af30 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1af40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1af50 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1af60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1af70 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1af80 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1af90 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1afa0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1afb0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1afc0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65  (CK_RV, C_GetOpe
1afd0 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f  rationState)(CK_
1afe0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1aff0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1b000 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53  _PTR pOperationS
1b010 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  tate, CK_ULONG_P
1b020 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53  TR pulOperationS
1b030 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tateLen) {..CACK
1b040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b050 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1b060 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1b070 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1b080 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b090 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1b0a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1b0b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1b0c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1b0d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1b0e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b0f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1b100 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1b110 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1b120 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1b130 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1b140 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1b150 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1b160 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b170 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
1b180 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
1b190 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1b1a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1b1b0 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
1b1c0 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
1b1d0 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61  G ulOperationSta
1b1e0 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  teLen, CK_OBJECT
1b1f0 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74  _HANDLE hEncrypt
1b200 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ionKey, CK_OBJEC
1b210 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e  T_HANDLE hAuthen
1b220 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09  ticationKey) {..
1b230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b240 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1b250 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1b260 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1b270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b280 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1b290 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1b2a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1b2b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1b2c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1b2d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b2e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1b2f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1b300 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1b310 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1b320 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1b330 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1b340 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1b350 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1b360 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1b370 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49  _Login)(CK_SESSI
1b380 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1b390 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45  on, CK_USER_TYPE
1b3a0 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54   userType, CK_UT
1b3b0 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
1b3c0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
1b3d0 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  en) {..CK_SLOT_I
1b3e0 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d  D slotID;..int m
1b3f0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
1b400 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
1b410 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65  g;..int login_re
1b420 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
1b430 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1b440 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1b450 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b460 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b470 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b480 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b490 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b4a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b4b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b4c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1b4d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1b4e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1b4f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1b500 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1b510 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1b520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b530 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1b540 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1b550 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1b560 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1b570 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1b580 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65  }...if (userType
1b590 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a   != CKU_USER) {.
1b5a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b5b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57  RINTF("Error.  W
1b5c0 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55  e only support U
1b5d0 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20  SER mode, asked 
1b5e0 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20  for %lu mode.", 
1b5f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b600 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74  userType)....ret
1b610 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50  urn(CKR_USER_TYP
1b620 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1b630 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1b640 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1b650 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1b660 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1b670 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1b680 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b690 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1b6a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1b6b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1b6c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1b6d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1b6e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1b6f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1b700 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b710 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b720 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1b730 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b740 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1b750 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1b760 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1b770 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1b780 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
1b790 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b7a0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
1b7b0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
1b7c0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
1b7d0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1b7e0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1b7f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1b800 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b810 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b820 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1b830 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1b840 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
1b850 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
1b860 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b870 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1b880 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1b890 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
1b8a0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
1b8b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b8c0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1b8d0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1b8e0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
1b8f0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
1b900 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
1b910 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1b920 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1b930 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
1b940 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1b950 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72  R);..}...login_r
1b960 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  et = cackey_logi
1b970 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  n(&cackey_slots[
1b980 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75  slotID], pPin, u
1b990 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f  lPinLen, &tries_
1b9a0 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20  remaining);..if 
1b9b0 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41  (login_ret != CA
1b9c0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
1b9d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1b9e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1b9f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28  iglock);....if (
1ba00 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
1ba10 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
1ba20 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
1ba30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ba40 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f  or.  Token is lo
1ba50 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63  cked.");.....cac
1ba60 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1ba70 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
1ba80 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f   CKF_USER_PIN_LO
1ba90 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e  CKED;.....return
1baa0 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
1bab0 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c  ;...} else if (l
1bac0 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
1bad0 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
1bae0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1baf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bb00 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e  r.  Invalid PIN.
1bb10 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
1bb20 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1bb30 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
1bb40 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
1bb50 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  OW;.....if (trie
1bb60 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31  s_remaining == 1
1bb70 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
1bb80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1bb90 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
1bba0 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
1bbb0 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  RY;....}.....ret
1bbc0 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
1bbd0 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43  RRECT);...}....C
1bbe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bbf0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e  TF("Error.  Unkn
1bc00 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e  own error return
1bc10 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c  ed from cackey_l
1bc20 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f  ogin() (%i)", lo
1bc30 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  gin_ret);....ret
1bc40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1bc50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63  ERROR);..}...cac
1bc60 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1bc70 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d  ].token_flags &=
1bc80 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   ~(CKF_USER_PIN_
1bc90 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45  LOCKED | CKF_USE
1bca0 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20  R_PIN_COUNT_LOW 
1bcb0 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  | CKF_LOGIN_REQU
1bcc0 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f  IRED | CKF_USER_
1bcd0 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a  PIN_FINAL_TRY);.
1bce0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1bcf0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
1bd00 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f  e = CKS_RO_USER_
1bd10 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74  FUNCTIONS;...mut
1bd20 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1bd30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1bd40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1bd50 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1bd60 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1bd70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bd80 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1bd90 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1bda0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1bdb0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1bdc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bdd0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1bde0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1bdf0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1be00 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1be10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1be20 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29  CK_RV, C_Logout)
1be30 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1be40 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
1be50 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1be60 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  D;..int mutex_re
1be70 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
1be80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1be90 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1bea0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1beb0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1bec0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bed0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1bee0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1bef0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1bf00 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1bf10 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
1bf20 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
1bf30 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
1bf40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1bf50 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1bf60 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
1bf70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bf80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1bf90 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
1bfa0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
1bfb0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1bfc0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1bfd0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1bfe0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1bff0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1c000 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1c010 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1c020 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c030 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c040 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1c050 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c060 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1c070 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1c080 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1c090 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
1c0a0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1c0b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1c0c0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1c0d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c0e0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
1c0f0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
1c100 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1c110 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
1c120 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
1c130 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
1c140 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1c150 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
1c160 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
1c170 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
1c180 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1c190 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1c1a0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1c1b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c1c0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1c1d0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1c1e0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
1c1f0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
1c200 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
1c210 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1c220 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1c230 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1c240 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
1c250 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c260 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c270 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1c280 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
1c290 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
1c2a0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
1c2b0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1c2c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1c2d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1c2e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1c2f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
1c300 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1c310 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d  Session].state =
1c320 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
1c330 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f  ESSION;..cackey_
1c340 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
1c350 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
1c360 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
1c370 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1c380 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1c390 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1c3a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1c3b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1c3c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c3d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1c3e0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1c3f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c400 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1c410 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1c420 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1c430 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1c440 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1c450 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1c460 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1c470 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72  TION(CK_RV, C_Cr
1c480 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53  eateObject)(CK_S
1c490 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1c4a0 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49  ession, CK_ATTRI
1c4b0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
1c4c0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
1c4d0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
1c4e0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a  HANDLE_PTR phObj
1c4f0 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ect) {..CACKEY_D
1c500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1c510 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1c520 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1c530 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1c540 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c550 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1c560 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1c570 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1c580 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1c590 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1c5a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c5b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1c5c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1c5d0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1c5e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1c5f0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1c600 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1c610 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1c620 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1c630 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a  CK_RV, C_CopyObj
1c640 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
1c650 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1c660 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1c670 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
1c680 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
1c690 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
1c6a0 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
1c6b0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
1c6c0 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41  NewObject) {..CA
1c6d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c6e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c6f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1c700 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1c710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c720 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1c730 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1c740 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1c750 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1c760 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1c770 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c780 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1c790 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1c7a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1c7b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1c7c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1c7d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1c7e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1c7f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1c800 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
1c810 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b  estroyObject)(CK
1c820 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1c830 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
1c840 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
1c850 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
1c860 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1c870 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1c880 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c890 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c8a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c8b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c8c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c8d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c8e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c8f0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1c900 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1c910 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1c920 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1c930 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1c940 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1c950 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1c960 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1c970 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1c980 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1c990 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63  K_RV, C_GetObjec
1c9a0 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f  tSize)(CK_SESSIO
1c9b0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1c9c0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
1c9d0 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
1c9e0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a  ULONG_PTR pulSiz
1c9f0 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  e) {..CACKEY_DEB
1ca00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ca10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1ca20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1ca30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ca40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ca50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1ca60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1ca70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1ca80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1ca90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1caa0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1cab0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1cac0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1cad0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1cae0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1caf0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1cb00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1cb10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1cb20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1cb30 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62  _RV, C_GetAttrib
1cb40 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53  uteValue)(CK_SES
1cb50 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1cb60 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
1cb70 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
1cb80 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
1cb90 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
1cba0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
1cbb0 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
1cbc0 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63  urr_attr;..struc
1cbd0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1cbe0 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e  y *identity;..un
1cbf0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
1cc00 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69  tity_idx, attr_i
1cc10 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64  dx, sess_attr_id
1cc20 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74  x, num_ids;..int
1cc30 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1cc40 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
1cc50 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f  KR_OK;..CK_VOID_
1cc60 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f  PTR pValue;..CK_
1cc70 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e  ULONG ulValueLen
1cc80 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1cc90 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1cca0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ccb0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ccc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ccd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1cce0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ccf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1cd00 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1cd10 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1cd20 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1cd30 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1cd40 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1cd50 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1cd60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1cd70 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1cd80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cd90 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1cda0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1cdb0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1cdc0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1cdd0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1cde0 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d  ...if (hObject =
1cdf0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1ce00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ce10 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e  ror.  Object han
1ce20 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
1ce30 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1ce40 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  (CKR_OBJECT_HAND
1ce50 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ce60 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d  ..if (ulCount ==
1ce70 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
1ce80 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72   circuit, if zer
1ce90 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73  o objects were s
1cea0 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20  pecified return 
1ceb0 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64  zero items immed
1cec0 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b  iately */...CACK
1ced0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cee0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1cef0 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
1cf00 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
1cf10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cf20 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  OK);..}...if (pT
1cf30 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29  emplate == NULL)
1cf40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cf50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cf60 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e    pTemplate is N
1cf70 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1cf80 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1cf90 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74  BAD);..}...ident
1cfa0 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63  ity_idx = hObjec
1cfb0 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72  t - 1;...mutex_r
1cfc0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1cfd0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1cfe0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1cff0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1d000 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d010 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d020 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1d030 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d040 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1d050 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
1d060 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1d070 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
1d080 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1d090 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d0a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1d0b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d0c0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1d0d0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
1d0e0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1d0f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1d100 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e  INVALID);..}...n
1d110 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f  um_ids = cackey_
1d120 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d130 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
1d140 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  unt;...if (ident
1d150 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69  ity_idx >= num_i
1d160 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ds) {...cackey_m
1d170 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1d180 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1d190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d1a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a  NTF("Error.  Obj
1d1b0 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ect handle out o
1d1c0 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69  f range.  identi
1d1d0 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75  ty_idx = %lu, nu
1d1e0 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28  m_ids = %lu.", (
1d1f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
1d200 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e  dentity_idx, (un
1d210 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d  signed long) num
1d220 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ids);....return
1d230 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  (CKR_OBJECT_HAND
1d240 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1d250 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  ..identity = &ca
1d260 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1d270 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1d280 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d  es[identity_idx]
1d290 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64  ;...for (attr_id
1d2a0 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20  x = 0; attr_idx 
1d2b0 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f  < ulCount; attr_
1d2c0 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f  idx++) {...curr_
1d2d0 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74  attr = &pTemplat
1d2e0 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09  e[attr_idx];....
1d2f0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
1d300 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
1d310 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43  K_LONG) -1;....C
1d320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d330 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TF("Looking for 
1d340 61 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c  attribute 0x%08l
1d350 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29  x (identity:%lu)
1d360 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1d370 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1d380 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65  ->type, (unsigne
1d390 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
1d3a0 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73  _idx);....for (s
1d3b0 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
1d3c0 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
1d3d0 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  < identity->attr
1d3e0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
1d3f0 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
1d400 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79  ....if (identity
1d410 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1d420 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65  s_attr_idx].type
1d430 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74   == curr_attr->t
1d440 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ype) {.....CACKE
1d450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d460 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70   ... found it, p
1d470 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61  Value = %p, ulVa
1d480 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69  lueLen = %lu", i
1d490 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
1d4a0 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
1d4b0 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74  x].pValue, ident
1d4c0 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
1d4d0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1d4e0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09  lValueLen);.....
1d4f0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64  .....pValue = id
1d500 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
1d510 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1d520 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c  ].pValue;.....ul
1d530 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74  ValueLen = ident
1d540 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
1d550 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
1d560 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a  lValueLen;....}.
1d570 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f  ..}....if (curr_
1d580 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20  attr->pValue && 
1d590 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20  pValue) {....if 
1d5a0 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61  (curr_attr->ulVa
1d5b0 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75  lueLen >= ulValu
1d5c0 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63  eLen) {.....memc
1d5d0 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  py(curr_attr->pV
1d5e0 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c  alue, pValue, ul
1d5f0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20  ValueLen);....} 
1d600 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c  else {.....ulVal
1d610 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
1d620 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61  ) -1;......retva
1d630 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
1d640 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09  OO_SMALL;....}..
1d650 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d  .}....curr_attr-
1d660 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c  >ulValueLen = ul
1d670 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d  ValueLen;..}...m
1d680 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d690 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d6a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d6b0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1d6c0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1d6d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d6e0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1d6f0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1d700 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1d710 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1d720 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d  }...if (retval =
1d730 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f  = CKR_ATTRIBUTE_
1d740 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a  TYPE_INVALID) {.
1d750 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d760 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1d770 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
1d780 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29  YPE_INVALID (%i)
1d790 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
1d7a0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
1d7b0 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46  tval == CKR_BUFF
1d7c0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
1d7d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d7e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1d7f0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
1d800 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e  SMALL (%i)", (in
1d810 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
1d820 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d  lse if (retval =
1d830 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
1d840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d850 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1d860 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29  _OK (%i)", (int)
1d870 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73   retval);..} els
1d880 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  e {...CACKEY_DEB
1d890 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d8a0 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
1d8b0 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65  retval);..}...re
1d8c0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
1d8d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1d8e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
1d8f0 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
1d900 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1d910 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
1d920 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
1d930 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
1d940 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
1d950 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
1d960 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  nt) {..CACKEY_DE
1d970 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1d980 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1d990 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d9a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d9b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d9c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1d9d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d9e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1d9f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1da00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1da10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1da20 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1da30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1da40 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1da50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1da60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1da70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1da80 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1da90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1daa0 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
1dab0 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ctsInit)(CK_SESS
1dac0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1dad0 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ion, CK_ATTRIBUT
1dae0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
1daf0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
1db00 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  t) {..CK_SLOT_ID
1db10 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f   slotID;..CK_ULO
1db20 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  NG idx;..int mut
1db30 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1db40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1db50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1db60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1db70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1db80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1db90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1dba0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1dbb0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1dbc0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1dbd0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
1dbe0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
1dbf0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
1dc00 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1dc10 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1dc20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1dc30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1dc40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1dc50 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
1dc60 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
1dc70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1dc80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1dc90 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1dca0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1dcb0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1dcc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1dcd0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1dce0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1dcf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1dd00 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1dd10 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1dd20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1dd30 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1dd40 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
1dd50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
1dd60 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1dd70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1dd80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1dd90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dda0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1ddb0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
1ddc0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1ddd0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1dde0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1ddf0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
1de00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1de10 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
1de20 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1de30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1de40 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
1de50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1de60 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61  Error.  Search a
1de70 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29  lready active.")
1de80 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1de90 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
1dea0 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  VE);..}...slotID
1deb0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
1dec0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
1ded0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
1dee0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
1def0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1df00 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1df10 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1df20 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1df30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1df40 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1df50 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1df60 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
1df70 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
1df80 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
1df90 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1dfa0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1dfb0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1dfc0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
1dfd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dfe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1dff0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1e000 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
1e010 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
1e020 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
1e030 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
1e040 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1e050 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
1e060 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e070 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1e080 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1e090 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29  tID].slot_reset)
1e0a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e0b0 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c  G_PRINTF("The sl
1e0c0 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65  ot has been rese
1e0d0 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20  t since we last 
1e0e0 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74  looked for ident
1e0f0 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e  ities -- rescann
1e100 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61  ing");....if (ca
1e110 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e120 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1e130 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
1e140 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
1e150 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
1e160 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1e170 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
1e180 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e190 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1e1a0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63  es_count);.....c
1e1b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e1c0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1e1d0 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63  ies = NULL;....c
1e1e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e1f0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
1e200 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ies_count = 0;..
1e210 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
1e220 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1e230 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  abel != NULL) {.
1e240 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1e250 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1e260 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  el);....cackey_s
1e270 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1e280 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  el = NULL;...}..
1e290 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
1e2a0 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
1e2b0 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  t = 0;...cackey_
1e2c0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
1e2d0 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
1e2e0 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
1e2f0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1e300 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e310 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  n].identities ==
1e320 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
1e330 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e340 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
1e350 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64  = cackey_read_id
1e360 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79  entities(&cackey
1e370 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
1e380 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1e390 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1e3a0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d  ities_count);..}
1e3b0 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
1e3c0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
1e3d0 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
1e3e0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
1e3f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1e400 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
1e410 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09  t = ulCount;....
1e420 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e430 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1e440 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28  _query = malloc(
1e450 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
1e460 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a  (*pTemplate));..
1e470 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
1e480 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e490 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1e4a0 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43  , pTemplate, ulC
1e4b0 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
1e4c0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66  Template));....f
1e4d0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1e4e0 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b   < ulCount; idx+
1e4f0 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65  +) {.....if (pTe
1e500 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
1e510 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  lueLen == 0) {..
1e520 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1e530 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1e540 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
1e550 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  pValue = NULL;..
1e560 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
1e570 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
1e580 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1e590 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1e5a0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d  [idx].pValue = m
1e5b0 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b  alloc(pTemplate[
1e5c0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
1e5d0 3b 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65  ;......if (cacke
1e5e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e5f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
1e600 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b  y[idx].pValue) {
1e610 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ......memcpy(cac
1e620 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e630 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1e640 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ery[idx].pValue,
1e650 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e   pTemplate[idx].
1e660 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74  pValue, pTemplat
1e670 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  e[idx].ulValueLe
1e680 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09  n);.....}....}..
1e690 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63  .} else {....cac
1e6a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e6b0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1e6c0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ery_count = 0;..
1e6d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1e6e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1e6f0 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b  ch_query = NULL;
1e700 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
1e710 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20  .if (ulCount != 
1e720 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d  0) {....cackey_m
1e730 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e740 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1e750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e760 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
1e770 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63 69  arch query speci
1e780 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75  fied as NULL, bu
1e790 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72  t number of quer
1e7a0 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63  y terms not spec
1e7b0 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a  ified as 0.");..
1e7c0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1e7d0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
1e7e0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  }....cackey_sess
1e7f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1e800 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
1e810 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  t = 0;...cackey_
1e820 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e830 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
1e840 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63  = NULL;..}...cac
1e850 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1e860 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
1e870 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65  tive = 1;..cacke
1e880 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e890 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
1e8a0 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78  _id = 0;...mutex
1e8b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e8c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e8d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1e8e0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1e8f0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1e900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e910 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1e920 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e930 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e940 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e960 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1e970 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1e980 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1e990 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1e9a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e9b0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
1e9c0 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ts)(CK_SESSION_H
1e9d0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1e9e0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1e9f0 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43  _PTR phObject, C
1ea00 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a  K_ULONG ulMaxObj
1ea10 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f  ectCount, CK_ULO
1ea20 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74  NG_PTR pulObject
1ea30 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74  Count) {..struct
1ea40 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1ea50 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41   *curr_id;..CK_A
1ea60 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
1ea70 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63  ttr;..CK_ULONG c
1ea80 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72  urr_id_idx, curr
1ea90 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72  _out_id_idx, cur
1eaa0 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73  r_attr_idx, sess
1eab0 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55  _attr_idx;..CK_U
1eac0 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75  LONG matched_cou
1ead0 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64  nt, prev_matched
1eae0 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74  _count;..int mut
1eaf0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1eb00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1eb10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1eb20 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1eb30 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1eb40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eb50 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1eb60 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1eb70 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1eb80 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1eb90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
1eba0 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d  ulObjectCount ==
1ebb0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1ebc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ebd0 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63  Error.  pulObjec
1ebe0 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  tCount is NULL."
1ebf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ec00 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1ec10 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65  ..}...if (phObje
1ec20 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  ct == NULL && ul
1ec30 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  MaxObjectCount =
1ec40 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
1ec50 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65  t circuit, if ze
1ec60 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20  ro objects were 
1ec70 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72 6e  specified return
1ec80 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65   zero items imme
1ec90 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75  diately */...*pu
1eca0 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30  lObjectCount = 0
1ecb0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1ecc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1ecd0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
1ece0 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
1ecf0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
1ed00 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
1ed10 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20  ...if (phObject 
1ed20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1ed30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ed40 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65  ("Error.  phObje
1ed50 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  ct is NULL.");..
1ed60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1ed70 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1ed80 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63  ..if (ulMaxObjec
1ed90 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  tCount == 0) {..
1eda0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1edb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 61  INTF("Error.  Ma
1edc0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
1edd0 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66 69 65  objects specifie
1ede0 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09  d as zero.");...
1edf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1ee00 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1ee10 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
1ee20 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
1ee30 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1ee40 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1ee50 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1ee60 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
1ee70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ee80 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1ee90 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
1eea0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1eeb0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
1eec0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
1eed0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1eee0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1eef0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1ef00 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1ef10 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1ef20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ef30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1ef40 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1ef50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1ef60 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1ef70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1ef80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ef90 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1efa0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1efb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1efc0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1efd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1efe0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1eff0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1f000 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1f010 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1f020 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1f030 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f040 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
1f050 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1f060 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1f070 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1f080 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f090 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1f0a0 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65  earch not active
1f0b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1f0c0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
1f0d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1f0e0 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69  ..}...curr_out_i
1f0f0 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20  d_idx = 0;..for 
1f100 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63  (curr_id_idx = c
1f110 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1f120 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1f130 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64  curr_id; curr_id
1f140 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65  _idx < cackey_se
1f150 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f160 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
1f170 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74  t && ulMaxObject
1f180 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69  Count; curr_id_i
1f190 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69  dx++) {...curr_i
1f1a0 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  d = &cackey_sess
1f1b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1f1c0 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69  dentities[curr_i
1f1d0 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45  d_idx];....CACKE
1f1e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f1f0 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74  Processing ident
1f200 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67  ity:%lu", (unsig
1f210 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69  ned long) curr_i
1f220 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68  d_idx);....match
1f230 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  ed_count = 0;...
1f240 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f  .for (curr_attr_
1f250 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74  idx = 0; curr_at
1f260 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  tr_idx < cackey_
1f270 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f280 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
1f290 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72  count; curr_attr
1f2a0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65  _idx++) {....pre
1f2b0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  v_matched_count 
1f2c0 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b  = matched_count;
1f2d0 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d  .....curr_attr =
1f2e0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
1f2f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1f300 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74  ch_query[curr_at
1f310 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43  tr_idx];.....CAC
1f320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f330 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72  ("  Checking for
1f340 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30 38   attribute 0x%08
1f350 6c 78 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25  lx in identity:%
1f360 69 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  i...", (unsigned
1f370 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1f380 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75  ->type, (int) cu
1f390 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43  rr_id_idx);....C
1f3a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f3b0 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20  TBUF("    Value 
1f3c0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63  looking for:", c
1f3d0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
1f3e0 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  , curr_attr->ulV
1f3f0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f  alueLen);.....fo
1f400 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
1f410 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
1f420 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61  idx < curr_id->a
1f430 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
1f440 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
1f450 29 20 7b 0a 09 09 09 09 69 66 20 28 63 75 72 72  ) {.....if (curr
1f460 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
1f470 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74  sess_attr_idx].t
1f480 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72  ype == curr_attr
1f490 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 09 43  ->type) {......C
1f4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f4b0 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  TF("    ... foun
1f4c0 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20  d matching type 
1f4d0 2e 2e 2e 22 29 3b 0a 09 09 09 09 09 43 41 43 4b  ...");......CACK
1f4e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
1f4f0 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76  F("    ... our v
1f500 61 6c 75 65 3a 22 2c 20 63 75 72 72 5f 69 64 2d  alue:", curr_id-
1f510 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
1f520 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
1f530 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  e, curr_id->attr
1f540 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
1f550 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
1f560 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72  );.......if (cur
1f570 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 3d  r_attr->pValue =
1f580 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09  = NULL) {.......
1f590 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f5a0 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
1f5b0 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d  found wildcard m
1f5c0 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09 09 6d  atch");........m
1f5d0 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a  atched_count++;.
1f5e0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1f5f0 09 09 09 7d 0a 0a 20 09 09 09 09 09 69 66 20 28  ...}.. .....if (
1f600 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
1f610 75 65 4c 65 6e 20 3d 3d 20 63 75 72 72 5f 69 64  ueLen == curr_id
1f620 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
1f630 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61  s_attr_idx].ulVa
1f640 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70  lueLen && memcmp
1f650 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
1f660 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74  ue, curr_id->att
1f670 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
1f680 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63  r_idx].pValue, c
1f690 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
1f6a0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
1f6b0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d  ].ulValueLen) ==
1f6c0 20 30 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b   0) {.......CACK
1f6d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f6e0 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
1f6f0 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b  d exact match");
1f700 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65 64 5f  ........matched_
1f710 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 09  count++;........
1f720 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
1f730 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20  ..}....}...../* 
1f740 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74 65  If the attribute
1f750 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61   could not be ma
1f760 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72  tched, do not tr
1f770 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74  y to match addit
1f780 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73  ional attributes
1f790 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f   */....if (prev_
1f7a0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
1f7b0 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20   matched_count) 
1f7c0 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
1f7d0 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74  }...}....if (mat
1f7e0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61  ched_count == ca
1f7f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1f800 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
1f810 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  uery_count) {...
1f820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f830 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20  INTF("  ... All 
1f840 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63 68  %i attributes ch
1f850 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
1f860 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79   adding identity
1f870 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20  :%i to returned 
1f880 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63  list", (int) cac
1f890 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f8a0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
1f8b0 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
1f8c0 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
1f8d0 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72  ...phObject[curr
1f8e0 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63  _out_id_idx] = c
1f8f0 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a  urr_id_idx + 1;.
1f900 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43  ....ulMaxObjectC
1f910 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72  ount--;.....curr
1f920 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09  _out_id_idx++;..
1f930 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
1f940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f950 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20  ("  ... Not all 
1f960 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25  %i (only found %
1f970 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63 68  i) attributes ch
1f980 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c  ecked for found,
1f990 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e   not adding iden
1f9a0 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20  tity:%i", (int) 
1f9b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f9c0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1f9d0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
1f9e0 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  nt) matched_coun
1f9f0 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64  t, (int) curr_id
1fa00 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63  _idx);...}..}..c
1fa10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1fa20 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1fa30 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69  curr_id = curr_i
1fa40 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65  d_idx;..*pulObje
1fa50 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f  ctCount = curr_o
1fa60 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 09 6d 75 74  ut_id_idx;...mut
1fa70 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1fa80 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1fa90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1faa0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1fab0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1fac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fad0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1fae0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1faf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1fb00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1fb10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fb20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1fb30 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75   CKR_OK (%i), nu
1fb40 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22  m objects = %lu"
1fb50 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62  , CKR_OK, *pulOb
1fb60 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65  jectCount);...re
1fb70 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1fb80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1fb90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
1fba0 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43  dObjectsFinal)(C
1fbb0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1fbc0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
1fbd0 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74  _ULONG idx;..int
1fbe0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1fbf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fc00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1fc10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1fc20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fc30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fc40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fc50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fc60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1fc70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fc80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1fc90 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1fca0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1fcb0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1fcc0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1fcd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1fce0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1fcf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fd00 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1fd10 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1fd20 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1fd30 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1fd40 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1fd50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1fd60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1fd70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1fd80 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1fd90 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1fda0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fdb0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1fdc0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1fdd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1fde0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1fdf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1fe00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1fe10 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
1fe20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1fe30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1fe40 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1fe50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fe60 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
1fe70 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
1fe80 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1fe90 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1fea0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1feb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1fec0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
1fed0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1fee0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1fef0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1ff00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ff10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
1ff20 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  rch not active."
1ff30 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ff40 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
1ff50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1ff60 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
1ff70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
1ff80 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
1ff90 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1ffa0 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65   idx < cackey_se
1ffb0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ffc0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
1ffd0 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
1ffe0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1fff0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
20000 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
20010 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65  pValue) {....fre
20020 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
20030 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
20040 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
20050 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  alue);...}..}...
20060 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
20070 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
20080 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
20090 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
200a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
200b0 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
200c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
200d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
200e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
200f0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
20100 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
20110 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20120 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20130 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
20140 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20150 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20160 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
20170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20180 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
20190 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
201a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
201b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
201c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
201d0 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
201e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
201f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
20200 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
20210 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
20220 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
20230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20240 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
20250 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20260 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20270 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20280 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20290 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
202a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
202b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
202c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
202d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
202e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
202f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20300 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
20310 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20320 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
20330 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
20340 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
20350 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20360 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20370 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
20380 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
20390 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
203a0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
203b0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
203c0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
203d0 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
203e0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
203f0 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
20400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20410 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20420 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
20430 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20440 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20450 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
20460 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
20470 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20480 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20490 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
204a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
204b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
204c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
204d0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
204e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
204f0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
20500 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
20510 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
20520 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
20530 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
20540 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
20550 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
20560 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
20570 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
20580 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
20590 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
205a0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
205b0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
205c0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
205d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
205e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
205f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20600 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20620 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20630 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20640 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20650 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20660 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20680 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20690 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
206a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
206b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
206c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
206d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
206e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
206f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20700 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20710 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
20720 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
20730 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
20740 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
20750 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
20760 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
20770 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
20780 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
20790 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
207a0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
207b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
207c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
207d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
207e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
207f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20800 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
20810 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
20820 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20830 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20840 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
20850 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
20860 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
20870 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
20880 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
20890 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
208a0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
208b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
208c0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
208d0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
208e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
208f0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
20900 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
20910 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
20920 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
20930 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
20940 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
20950 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20960 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20970 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20980 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20990 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
209a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
209b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
209c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
209d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
209e0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
209f0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
20a00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20a10 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
20a20 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
20a30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
20a40 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
20a50 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
20a60 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
20a70 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
20a80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20a90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
20aa0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
20ab0 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
20ac0 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
20ad0 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
20ae0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
20af0 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
20b00 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
20b10 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
20b20 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
20b30 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
20b40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
20b50 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
20b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
20b80 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
20b90 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
20ba0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
20bb0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
20bc0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
20bd0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20be0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20bf0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20c00 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20c10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20c20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20c30 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20c40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20c50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20c60 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
20c70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20c80 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
20c90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
20ca0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20cb0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
20cc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20cd0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
20ce0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
20cf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20d00 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20d10 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
20d20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20d30 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
20d40 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
20d50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20d60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20d70 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20d80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20d90 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
20da0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
20db0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
20dc0 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
20dd0 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
20de0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
20df0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
20e00 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
20e10 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
20e20 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20e30 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
20e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20e50 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
20e60 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
20e70 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
20e80 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
20e90 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
20ea0 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
20eb0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
20ec0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
20ed0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
20ee0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
20ef0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
20f00 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
20f10 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
20f20 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20f30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
20f40 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
20f50 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20f60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
20f70 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
20f80 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
20f90 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
20fa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20fb0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
20fc0 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
20fd0 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
20fe0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20ff0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
21000 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
21010 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
21020 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
21030 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21040 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
21050 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
21060 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21070 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
21080 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
21090 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
210a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
210b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
210c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
210d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
210e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
210f0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
21100 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
21110 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21120 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
21130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21140 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21150 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
21160 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
21170 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
21180 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
21190 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
211a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
211b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
211c0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
211d0 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
211e0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
211f0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
21200 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
21210 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
21220 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
21230 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
21240 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
21250 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a  V decrypt_ret;..
21260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21270 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21280 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21290 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
212a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
212b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
212c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
212d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
212e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
212f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
21300 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
21310 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
21320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21330 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
21340 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
21350 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
21360 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
21370 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
21380 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
21390 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
213a0 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
213b0 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
213c0 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
213d0 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
213e0 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
213f0 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
21400 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
21410 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21430 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
21440 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
21450 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
21460 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
21470 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
21480 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
21490 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  t_ret);..}...if 
214a0 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74  (pData) {...pDat
214b0 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  a += datalen_upd
214c0 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e  ate;..}..datalen
214d0 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74  _final = *pulDat
214e0 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75  aLen - datalen_u
214f0 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74  pdate;...decrypt
21500 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
21510 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
21520 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
21530 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63  final);..if (dec
21540 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
21550 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
21560 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21570 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61  or.  DecryptFina
21580 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
21590 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
215a0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
215b0 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b  g) decrypt_ret);
215c0 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
215d0 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70  pt_ret);..}...*p
215e0 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61  ulDataLen = data
215f0 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74  len_update + dat
21600 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41  alen_final;...CA
21610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21620 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21630 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
21640 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
21650 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
21660 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21670 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61  V, C_DecryptUpda
21680 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
21690 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
216a0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
216b0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
216c0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
216d0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
216e0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
216f0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
21700 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
21710 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34  K_BYTE buf[16384
21720 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c  ];..ssize_t bufl
21730 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  en;..CK_SLOT_ID 
21740 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72  slotID;..CK_RV r
21750 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
21760 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20  RAL_ERROR;..int 
21770 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
21780 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21790 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
217a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
217b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
217c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
217d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
217e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
217f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21800 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21810 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21820 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
21830 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
21840 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
21850 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
21860 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21870 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21880 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21890 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
218a0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
218b0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
218c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
218d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
218e0 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
218f0 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45  t == NULL && ulE
21900 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
21910 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
21920 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65  rt circuit if we
21930 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65   are asked to de
21940 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e  crypt nothing...
21950 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
21960 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21970 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
21980 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
21990 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
219a0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
219b0 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74  }...if (pEncrypt
219c0 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  edPart == NULL) 
219d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
219e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
219f0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69  pEncryptedPart i
21a00 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e  s NULL, but ulEn
21a10 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
21a20 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
21a30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
21a40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
21a50 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61  f (ulEncryptedPa
21a60 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
21a70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21a80 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e  NTF("Error. ulEn
21a90 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69  cryptedPartLen i
21aa0 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69  s 0, but pPart i
21ab0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
21ac0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
21ad0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
21ae0 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e  ..if (pulPartLen
21af0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
21b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21b10 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72  F("Error. pulPar
21b20 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
21b30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
21b40 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
21b50 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
21b60 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
21b70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21b80 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21b90 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21bb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
21bc0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21bd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21be0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21bf0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
21c00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21c10 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
21c20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21c30 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21c40 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
21c50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21c60 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
21c70 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
21c80 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
21c90 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
21ca0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
21cb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21cc0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
21cd0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
21ce0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21cf0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21d00 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
21d10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21d20 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
21d30 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
21d40 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
21d50 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
21d60 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
21d70 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
21d80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
21d90 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
21da0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
21db0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21dc0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
21dd0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21de0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21e00 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21e10 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21e20 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21e30 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21e40 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21e50 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21e60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21e70 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21e80 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
21e90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21ea0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21eb0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21ec0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
21ed0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
21ee0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
21ef0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21f00 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21f10 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
21f20 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21f30 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
21f40 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
21f50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
21f60 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29  crypt_mechanism)
21f70 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
21f80 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73  A_PKCS:..../* As
21f90 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70  k card to decryp
21fa0 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d  t */....buflen =
21fb0 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
21fc0 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
21fd0 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
21fe0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21ff0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
22000 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
22010 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
22020 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
22030 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
22040 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c  1);.....if (bufl
22050 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
22060 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c   Decryption fail
22070 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62  ed. */.....if (b
22080 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
22090 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
220a0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
220b0 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c  = CKR_USER_NOT_L
220c0 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20  OGGED_IN;.....} 
220d0 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20  else if (buflen 
220e0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
220f0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
22100 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
22110 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
22120 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
22130 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
22140 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
22150 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
22160 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
22170 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a  ong) buflen) > *
22180 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50  pulPartLen && pP
22190 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65  art) {...../* De
221a0 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f  crypted data too
221b0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65   large */.....re
221c0 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
221d0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
221e0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
221f0 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d  (pPart) {......m
22200 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66  emcpy(pPart, buf
22210 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d  , buflen);.....}
22220 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65  ......*pulPartLe
22230 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09  n = buflen;.....
22240 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
22250 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
22260 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
22270 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22280 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22290 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
222a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
222b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
222c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
222d0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
222e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
222f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22300 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
22310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22320 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
22330 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
22340 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
22350 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22360 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22370 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b  DecryptFinal)(CK
22380 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22390 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
223a0 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c  E_PTR pLastPart,
223b0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
223c0 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a  lLastPartLen) {.
223d0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
223e0 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  l;..int terminat
223f0 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a  e_decrypt = 1;..
22400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22410 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
22420 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
22430 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
22440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22450 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
22460 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
22470 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
22480 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
22490 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
224a0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
224b0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
224c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
224d0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
224e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
224f0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
22500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22510 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
22520 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
22530 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
22540 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
22550 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
22560 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c  if (pulLastPartL
22570 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
22580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22590 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c  NTF("Error. pulL
225a0 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55  astPartLen is NU
225b0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
225c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
225d0 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
225e0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
225f0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
22600 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
22610 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
22620 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22640 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
22650 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
22660 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
22670 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
22680 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22690 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
226a0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
226b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
226c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
226d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
226e0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
226f0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
22700 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
22710 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
22720 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
22730 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
22740 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
22750 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
22760 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22770 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22780 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
22790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
227a0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
227b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
227c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
227d0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
227e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
227f0 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  *pulLastPartLen 
22800 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74  = 0;...if (pLast
22810 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
22820 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  ..terminate_decr
22830 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ypt = 0;..}...if
22840 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72   (terminate_decr
22850 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ypt) {...cackey_
22860 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22870 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
22880 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
22890 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
228a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
228b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
228c0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
228d0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
228e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
228f0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22900 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22910 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22920 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22940 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22950 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
22960 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
22970 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
22980 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22990 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e  K_RV, C_DigestIn
229a0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
229b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
229c0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
229d0 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09   pMechanism) {..
229e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
229f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22a00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22a10 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22a20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22a30 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22a40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22a50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22a60 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22a70 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22a80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22a90 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22aa0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22ab0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
22ac0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22ad0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22ae0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22af0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22b00 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22b10 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22b20 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53  _Digest)(CK_SESS
22b30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
22b40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
22b50 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
22b60 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
22b70 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
22b80 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
22b90 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
22ba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22bb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
22bc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
22bd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
22be0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22bf0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
22c00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
22c10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
22c20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
22c30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
22c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22c50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22c60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22c70 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
22c80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22c90 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
22ca0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
22cb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22cc0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22cd0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22ce0 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
22cf0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22d00 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
22d10 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
22d20 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
22d30 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
22d40 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22d50 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22d60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22d70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22d80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22d90 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22da0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22db0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22dc0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22dd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22de0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22df0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22e00 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
22e10 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
22e20 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22e30 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
22e40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22e50 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
22e60 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22e70 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28  V, C_DigestKey)(
22e80 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22e90 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
22ea0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
22eb0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
22ec0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22ed0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
22ee0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22f00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22f10 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22f20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22f30 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22f40 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22f50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
22f60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
22f70 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
22f80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
22f90 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
22fa0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22fb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
22fc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22fd0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
22fe0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22ff0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e  _RV, C_DigestFin
23000 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
23010 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
23020 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
23030 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
23040 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
23050 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
23060 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23070 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
23080 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
23090 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
230a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
230b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
230c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
230d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
230e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
230f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23100 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23110 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23120 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
23130 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
23140 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
23150 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
23160 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23170 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
23180 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23190 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b  , C_SignInit)(CK
231a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
231b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
231c0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
231d0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
231e0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
231f0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
23200 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43  l;...hKey--;...C
23210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23220 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23230 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23240 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23250 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23260 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23270 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23280 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23290 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
232a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
232b0 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e  (pMechanism == N
232c0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
232d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
232e0 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20  ror. pMechanism 
232f0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
23300 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
23310 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
23320 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  f (pMechanism->m
23330 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f  echanism != CKM_
23340 52 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65 63  RSA_PKCS && pMec
23350 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
23360 6d 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53  m != CKM_SHA1_RS
23370 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
23380 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23390 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
233a0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
233b0 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
233c0 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20 43  KM_RSA_PKCS or C
233d0 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
233e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
233f0 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41  R_MECHANISM_PARA
23400 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  M_INVALID);..}..
23410 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
23420 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
23430 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
23440 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
23450 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
23460 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
23470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23480 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
23490 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
234a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
234b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
234c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
234d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
234e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
234f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23500 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
23510 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
23520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23530 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
23540 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
23550 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
23560 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
23570 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
23580 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23590 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
235a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
235b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
235c0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
235d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
235e0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
235f0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
23600 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
23610 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
23620 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
23630 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23640 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
23650 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
23660 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23670 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
23680 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23690 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
236a0 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
236b0 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
236c0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
236d0 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
236e0 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
236f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23700 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
23710 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
23720 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23740 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
23750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23760 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
23770 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65   of range (reque
23780 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e  sted key %lu, on
23790 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65  ly %lu identitie
237a0 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20  s available).", 
237b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
237c0 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  hKey, (unsigned 
237d0 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73  long) cackey_ses
237e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
237f0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
23800 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23810 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
23820 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
23830 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23840 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
23850 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
23860 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23870 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
23880 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d   = pMechanism->m
23890 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b  echanism;...cack
238a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
238b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
238c0 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79  n = 128;..cackey
238d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
238e0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
238f0 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65   = 0;..cackey_se
23900 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23910 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c  .sign_buf = mall
23920 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  oc(sizeof(*cacke
23930 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23940 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a  ion].sign_buf) *
23950 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
23960 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
23970 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45  buflen);...CACKE
23980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23990 53 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e  Session %lu sign
239a0 5f 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20  _identity is %p 
239b0 28 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22  (identity #%lu)"
239c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
239d0 29 20 68 53 65 73 73 69 6f 6e 2c 20 26 63 61 63  ) hSession, &cac
239e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
239f0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
23a00 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e  s[hKey], (unsign
23a10 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a  ed long) hKey);.
23a20 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
23a30 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
23a40 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
23a50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23a60 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
23a70 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
23a80 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23a90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23aa0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
23ab0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
23ac0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
23ad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23ae0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
23af0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
23b00 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
23b10 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
23b20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23b30 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
23b40 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
23b50 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
23b60 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
23b70 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23b80 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53  RV, C_Sign)(CK_S
23b90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23ba0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
23bb0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
23bc0 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
23bd0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
23be0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
23bf0 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
23c00 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  Len) {..unsigned
23c10 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e   long start_sign
23c20 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56  _bufused;..CK_RV
23c30 20 73 69 67 6e 5f 72 65 74 3b 0a 0a 09 43 41 43   sign_ret;...CAC
23c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23c50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23c60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
23c70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
23c80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23c90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
23ca0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
23cb0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23cc0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23cd0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
23ce0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
23cf0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
23d00 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
23d10 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
23d20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
23d30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
23d40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23d50 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
23d60 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
23d70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
23d80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
23d90 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72  ALID);..}...star
23da0 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  t_sign_bufused =
23db0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
23dc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
23dd0 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f  bufused;...sign_
23de0 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ret = C_SignUpda
23df0 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  te(hSession, pDa
23e00 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a  ta, ulDataLen);.
23e10 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
23e20 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
23e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23e40 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70  ("Error.  SignUp
23e50 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
23e60 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
23e70 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
23e80 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
23e90 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
23ea0 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f  ret);..}...sign_
23eb0 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  ret = C_SignFina
23ec0 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67  l(hSession, pSig
23ed0 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61  nature, pulSigna
23ee0 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73  tureLen);..if (s
23ef0 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
23f00 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f  K) {...if (sign_
23f10 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  ret == CKR_BUFFE
23f20 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
23f30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23f40 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c  RINTF("SignFinal
23f50 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f  () returned CKR_
23f60 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
23f70 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64   (rv = %lu), und
23f80 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
23f90 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e()", (unsigned 
23fa0 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
23fb0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
23fc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
23fd0 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
23fe0 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
23ff0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67  ;.....return(sig
24000 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43  n_ret);...}....C
24010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24020 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
24030 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
24040 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
24050 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
24060 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
24070 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
24080 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
24090 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55  pSignature == NU
240a0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
240b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69  EBUG_PRINTF("pSi
240c0 67 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65  gnature specifie
240d0 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69  d as NULL, undoi
240e0 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28  ng C_SignUpdate(
240f0 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73  )");....cackey_s
24100 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24110 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
24120 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
24130 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73  sed;....return(s
24140 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43  ign_ret);..}...C
24150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24160 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
24170 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
24180 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
24190 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
241a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
241b0 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65  RV, C_SignUpdate
241c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
241d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
241e0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
241f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
24200 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
24210 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
24220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24230 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24240 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24250 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24260 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24270 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24280 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24290 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
242a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
242b0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
242c0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
242d0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
242e0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
242f0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
24300 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
24310 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
24320 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24330 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
24340 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
24350 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24360 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
24370 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
24380 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  Part == NULL && 
24390 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  ulPartLen == 0) 
243a0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
243b0 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
243c0 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74  sked to sign not
243d0 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43  hing... */...CAC
243e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
243f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24400 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
24410 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
24420 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24430 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
24440 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
24450 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24460 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50  RINTF("Error. pP
24470 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74  art is NULL, but
24480 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f   ulPartLen is no
24490 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  t 0.");....retur
244a0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
244b0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
244c0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
244d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
244e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75  PRINTF("Error. u
244f0 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  lPartLen is 0, b
24500 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
24510 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
24520 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
24530 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  _BAD);..}...mute
24540 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
24550 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
24560 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
24570 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
24580 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
24590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
245a0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
245b0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
245c0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
245d0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
245e0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
245f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
24600 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
24610 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24620 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
24630 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24640 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
24650 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
24660 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
24670 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
24680 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
24690 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
246a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
246b0 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
246c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
246d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
246e0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
246f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24700 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
24710 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
24720 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
24730 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
24740 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  IZED);..}...swit
24750 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
24760 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
24770 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
24780 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
24790 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d  KCS:..../* Accum
247a0 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a  ulate directly *
247b0 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79  /....if ((cackey
247c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
247d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
247e0 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20   + ulPartLen) > 
247f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24800 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
24810 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63  uflen) {.....cac
24820 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24830 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
24840 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61  en *= 2;......ca
24850 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24860 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
24870 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65   = realloc(cacke
24880 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24890 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73  ion].sign_buf, s
248a0 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
248b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
248c0 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
248d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
248e0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
248f0 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65  en);....}.....me
24900 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
24910 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24920 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79  ign_buf + cackey
24930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24940 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
24950 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c  , pPart, ulPartL
24960 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  en);.....cackey_
24970 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24980 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
24990 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09  += ulPartLen;...
249a0 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
249b0 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
249c0 53 3a 0a 09 09 09 2f 2a 20 58 58 58 3a 20 41 63  S:..../* XXX: Ac
249d0 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f 20 61 20  cumulate into a 
249e0 53 48 41 31 20 68 61 73 68 20 2a 2f 0a 09 09 09  SHA1 hash */....
249f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24a00 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24a10 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ck);.....CACKEY_
24a20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24a30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
24a40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24a50 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
24a60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24a70 52 54 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72  RTED);.....retur
24a80 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
24a90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09  OT_SUPPORTED);..
24aa0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75  ..break;..}...mu
24ab0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24ac0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24ad0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24ae0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
24af0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
24b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24b10 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
24b20 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24b30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24b40 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24b50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24b60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24b70 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
24b80 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
24b90 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
24ba0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
24bb0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69  (CK_RV, C_SignFi
24bc0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
24bd0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24be0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
24bf0 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
24c00 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
24c10 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63  reLen) {..static
24c20 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b   CK_BYTE sigbuf[
24c30 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20  1024];..ssize_t 
24c40 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53  sigbuflen;..CK_S
24c50 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
24c60 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
24c70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24c80 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
24c90 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20  _sign = 1;..int 
24ca0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
24cb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24cc0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
24cd0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
24ce0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24d00 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
24d10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
24d20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
24d30 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
24d40 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
24d50 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   (pulSignatureLe
24d60 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
24d70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24d80 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69  TF("Error. pulSi
24d90 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55  gnatureLen is NU
24da0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
24db0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
24dc0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
24dd0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
24de0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
24df0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
24e00 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
24e10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
24e20 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
24e30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24e40 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
24e50 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
24e60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24e70 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
24e80 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
24e90 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24ea0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
24eb0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24ec0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24ed0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24ee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24ef0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
24f00 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24f10 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24f20 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
24f30 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
24f40 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
24f50 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
24f60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24f70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
24f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24f90 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
24fa0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
24fb0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24fc0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
24fd0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
24fe0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
24ff0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25000 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
25010 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
25020 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25030 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
25040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25050 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
25060 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
25070 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
25080 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
25090 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  ZED);..}...slotI
250a0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
250b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
250c0 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
250d0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
250e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
250f0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
25100 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
25110 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
25120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25130 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
25140 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
25150 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
25160 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
25170 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
25180 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
25190 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
251a0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
251b0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
251c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
251d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
251e0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
251f0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
25200 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
25210 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
25220 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
25230 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25240 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
25250 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25260 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
25270 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
25280 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25290 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ign_mechanism) {
252a0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
252b0 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20  PKCS:..../* Ask 
252c0 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a  card to sign */.
252d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
252e0 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74  PRINTF("Asking t
252f0 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e  o sign from iden
25300 74 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69  tity %p in sessi
25310 6f 6e 20 25 6c 75 22 2c 20 63 61 63 6b 65 79 5f  on %lu", cackey_
25320 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25330 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
25340 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25350 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09  ) hSession);....
25360 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  sigbuflen = cack
25370 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
25380 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
25390 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
253a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
253b0 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63  sign_identity, c
253c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
253d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
253e0 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f, cackey_sessio
253f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
25400 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75  n_bufused, sigbu
25410 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66  f, sizeof(sigbuf
25420 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66  ), 1, 0);.....if
25430 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29   (sigbuflen < 0)
25440 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e   {...../* Signin
25450 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09  g failed. */....
25460 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d  .if (sigbuflen =
25470 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
25480 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
25490 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
254a0 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
254b0 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
254c0 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43   (sigbuflen == C
254d0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
254e0 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
254f0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45  .retval = CKR_DE
25500 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09  VICE_REMOVED;...
25510 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
25520 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
25530 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
25540 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
25550 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
25560 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70   sigbuflen) > *p
25570 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26  ulSignatureLen &
25580 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a  & pSignature) {.
25590 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61  ..../* Signed da
255a0 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ta too large */.
255b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
255c0 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20  _PRINTF("retval 
255d0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
255e0 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c  _SMALL;  sigbufl
255f0 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67  en = %lu, pulSig
25600 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22  natureLen = %lu"
25610 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25620 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e  ) sigbuflen, (un
25630 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75  signed long) *pu
25640 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a  lSignatureLen);.
25650 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
25660 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
25670 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61  LL;......termina
25680 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09  te_sign = 0;....
25690 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72  } else {.....ter
256a0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
256b0 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e 61  ......if (pSigna
256c0 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  ture) {......mem
256d0 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20  cpy(pSignature, 
256e0 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65  sigbuf, sigbufle
256f0 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e  n);.......termin
25700 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09  ate_sign = 1;...
25710 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67  ..}......*pulSig
25720 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62  natureLen = sigb
25730 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76  uflen;......retv
25740 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09  al = CKR_OK;....
25750 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  }.....break;...c
25760 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41  ase CKM_SHA1_RSA
25770 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 58 58 58  _PKCS:..../* XXX
25780 3a 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74  : Accumulate int
25790 6f 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f  o a SHA1 hash */
257a0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
257b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
257c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43  iglock);.....CAC
257d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
257e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
257f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25800 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
25810 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25820 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72  UPPORTED);.....r
25830 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
25840 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
25850 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  );....break;..}.
25860 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f  ..if (terminate_
25870 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61  sign) {...if (ca
25880 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25890 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
258a0 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
258b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
258c0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b  sion].sign_buf);
258d0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
258e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
258f0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
25900 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
25910 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
25920 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25930 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
25940 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
25950 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
25960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25970 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
25980 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
25990 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
259a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
259b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
259c0 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
259d0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
259e0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
259f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25a00 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25a10 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
25a20 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
25a30 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
25a40 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
25a50 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
25a60 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
25a70 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
25a80 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
25a90 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
25aa0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
25ab0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25ac0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25ad0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
25ae0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25af0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
25b00 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
25b10 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25b20 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25b30 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
25b40 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
25b50 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
25b60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
25b70 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
25b80 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25b90 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
25ba0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
25bb0 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
25bc0 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
25bd0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25be0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
25bf0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
25c00 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
25c10 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
25c20 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
25c30 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
25c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25c50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25c60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
25c70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25c90 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25ca0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
25cb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
25cc0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
25cd0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
25ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25cf0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25d00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25d10 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
25d20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25d30 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
25d40 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
25d50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
25d60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
25d70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25d80 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53  VerifyInit)(CK_S
25d90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25da0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
25db0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
25dc0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
25dd0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
25de0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25df0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25e00 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
25e10 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25e20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25e30 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
25e40 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
25e50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
25e60 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
25e70 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
25e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25e90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25ea0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25eb0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
25ec0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
25ed0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
25ee0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
25ef0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
25f00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
25f10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
25f20 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49  Verify)(CK_SESSI
25f30 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
25f40 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
25f50 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
25f60 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
25f70 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
25f80 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
25f90 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
25fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25fb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25fc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
25fd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
25fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25ff0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26000 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26010 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26020 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26030 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
26040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26050 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26060 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26070 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26080 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26090 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
260a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
260b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
260c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
260d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
260e0 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
260f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
26100 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
26110 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
26120 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
26130 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
26140 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
26150 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
26160 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
26170 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26180 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26190 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
261a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
261b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
261c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
261d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
261e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
261f0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26200 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
26210 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
26220 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26230 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
26240 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26250 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
26260 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
26270 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c  V, C_VerifyFinal
26280 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
26290 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
262a0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
262b0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
262c0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
262d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
262e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
262f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26300 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26320 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26330 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26340 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26350 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26360 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26380 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26390 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
263a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
263b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
263c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
263d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
263e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
263f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26400 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26410 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
26420 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
26430 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26440 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
26450 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
26460 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
26470 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
26480 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26490 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
264a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
264b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
264c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
264d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
264e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
264f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
26500 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26510 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
26520 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26530 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
26540 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26550 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
26560 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26570 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
26580 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26590 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
265a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
265b0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
265c0 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
265d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
265e0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
265f0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
26600 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
26610 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  eLen, CK_BYTE_PT
26620 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
26630 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e  G_PTR pulDataLen
26640 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
26650 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
26660 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
26670 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
26680 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26690 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
266a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
266b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
266c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
266d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
266e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
266f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26700 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
26710 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
26720 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
26730 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26740 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
26750 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26760 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
26770 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
26780 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72  RV, C_DigestEncr
26790 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
267a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
267b0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
267c0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
267d0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
267e0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
267f0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
26800 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
26810 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
26820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26830 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26840 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26850 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26870 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26880 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26890 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
268a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
268b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
268c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
268d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
268e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
268f0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26900 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26910 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26920 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26930 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26940 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26950 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26960 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
26970 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
26980 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26990 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
269a0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
269b0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
269c0 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
269d0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
269e0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
269f0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
26a00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26a10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26a20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
26a30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
26a40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26a50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
26a60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
26a70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
26a80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26a90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
26aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26ab0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
26ac0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26ad0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
26ae0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26af0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
26b00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26b10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
26b20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
26b30 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e  (CK_RV, C_SignEn
26b40 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
26b50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
26b60 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
26b70 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
26b80 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
26b90 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
26ba0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
26bb0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
26bc0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
26bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26be0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
26bf0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
26c00 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
26c10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26c20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
26c30 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
26c40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26c50 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26c60 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
26c70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26c80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26c90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26ca0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
26cb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26cc0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
26cd0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
26ce0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26cf0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26d00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26d10 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
26d20 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
26d30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
26d40 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
26d50 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
26d60 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
26d70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
26d80 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
26d90 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
26da0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
26db0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26dc0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26dd0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
26de0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
26df0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26e00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
26e10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
26e20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
26e30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
26e40 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
26e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26e60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
26e70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26e80 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
26e90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26ea0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
26eb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26ec0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
26ed0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26ee0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
26ef0 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  rateKey)(CK_SESS
26f00 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
26f10 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
26f20 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
26f30 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
26f40 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
26f50 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
26f60 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
26f70 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
26f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26f90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26fa0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26fb0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26fd0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26fe0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26ff0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27000 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27010 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
27020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27030 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
27040 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27050 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
27060 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27070 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
27080 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
27090 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
270a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
270b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
270c0 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29  GenerateKeyPair)
270d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
270e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
270f0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
27100 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
27110 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c  RIBUTE_PTR pPubl
27120 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  icKeyTemplate, C
27130 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63  K_ULONG ulPublic
27140 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
27150 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
27160 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54  PTR pPrivateKeyT
27170 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
27180 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74  G ulPrivateKeyAt
27190 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
271a0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
271b0 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20  TR phPublicKey, 
271c0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
271d0 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65  _PTR phPrivateKe
271e0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
271f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
27200 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
27210 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
27220 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27230 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27240 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
27250 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27260 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27270 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27280 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27290 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
272a0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
272b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
272c0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
272d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
272e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
272f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27300 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
27310 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
27320 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28  _RV, C_WrapKey)(
27330 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
27340 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
27350 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
27360 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
27370 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70  CT_HANDLE hWrapp
27380 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ingKey, CK_OBJEC
27390 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43  T_HANDLE hKey, C
273a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70  K_BYTE_PTR pWrap
273b0 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47  pedKey, CK_ULONG
273c0 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b  _PTR pulWrappedK
273d0 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  eyLen) {..CACKEY
273e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
273f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27400 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27410 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27420 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27430 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27440 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27450 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27460 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27470 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27490 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
274a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
274b0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
274c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
274d0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
274e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
274f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
27500 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27510 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61  N(CK_RV, C_Unwra
27520 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
27530 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27540 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
27550 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
27560 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
27570 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20  hUnwrappingKey, 
27580 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
27590 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
275a0 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65  G ulWrappedKeyLe
275b0 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
275c0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
275d0 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
275e0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
275f0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
27600 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
27610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27620 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27630 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27640 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27660 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27670 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27680 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27690 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
276a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
276b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
276c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
276d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
276e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
276f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27700 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
27710 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27720 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
27730 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27740 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65  (CK_RV, C_Derive
27750 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
27760 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
27770 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
27780 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
27790 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
277a0 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52  BaseKey, CK_ATTR
277b0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
277c0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
277d0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
277e0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
277f0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
27800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27810 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
27820 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
27830 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27850 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27860 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27870 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27880 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
27890 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
278a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
278b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
278c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
278d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
278e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
278f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
27900 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
27910 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
27920 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27930 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27940 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  SeedRandom)(CK_S
27950 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27960 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
27970 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c  PTR pSeed, CK_UL
27980 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b  ONG ulSeedLen) {
27990 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
279a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
279b0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
279c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
279d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
279e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
279f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27a00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27a10 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27a20 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27a40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27a50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27a60 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
27a70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27a80 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
27a90 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
27aa0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27ab0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
27ac0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27ad0 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
27ae0 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
27af0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
27b00 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64  K_BYTE_PTR pRand
27b10 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  omData, CK_ULONG
27b20 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a   ulRandomLen) {.
27b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27b40 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
27b50 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
27b60 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
27b70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27b80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
27b90 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
27ba0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
27bb0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
27bc0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
27bd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27be0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
27bf0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27c00 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
27c10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27c20 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
27c30 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
27c40 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27c50 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  );.}../* Depreca
27c60 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
27c70 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27c80 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
27c90 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43  unctionStatus)(C
27ca0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27cb0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
27cc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27cd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27ce0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27cf0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27d00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27d10 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
27d20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27d30 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
27d40 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
27d50 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
27d60 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
27d70 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
27d80 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
27d90 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
27da0 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46  ./* Deprecated F
27db0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45  unction */.CK_DE
27dc0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
27dd0 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e  _RV, C_CancelFun
27de0 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ction)(CK_SESSIO
27df0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
27e00 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
27e10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
27e20 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
27e30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27e40 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27e50 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
27e60 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
27e70 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
27e80 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
27e90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
27ea0 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
27eb0 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
27ec0 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
27ed0 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
27ee0 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
27ef0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
27f00 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
27f10 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f  List)(CK_FUNCTIO
27f20 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70  N_LIST_PTR_PTR p
27f30 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b  pFunctionList) {
27f40 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  ..CK_FUNCTION_LI
27f50 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e  ST_PTR pFunction
27f60 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  List;...CACKEY_D
27f70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27f80 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70  led.");...if (pp
27f90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20  FunctionList == 
27fa0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
27fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27fc0 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e  rror. ppFunction
27fd0 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  List is NULL.");
27fe0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
27ff0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
28000 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  }...pFunctionLis
28010 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  t = malloc(sizeo
28020 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  f(*pFunctionList
28030 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ));...pFunctionL
28040 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a  ist->version.maj
28050 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
28060 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
28070 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78  ODE) >> 16) & 0x
28080 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ff;..pFunctionLi
28090 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f  st->version.mino
280a0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
280b0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
280c0 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  DE) >> 8) & 0xff
280d0 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ;...pFunctionLis
280e0 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20  t->C_Initialize 
280f0 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a  = C_Initialize;.
28100 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
28110 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46  C_Finalize = C_F
28120 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74  inalize;..pFunct
28130 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e  ionList->C_GetIn
28140 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a  fo = C_GetInfo;.
28150 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
28160 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20  C_GetSlotList = 
28170 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09  C_GetSlotList;..
28180 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
28190 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43  _GetSlotInfo = C
281a0 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70  _GetSlotInfo;..p
281b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
281c0 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43  GetTokenInfo = C
281d0 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09  _GetTokenInfo;..
281e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
281f0 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
28200 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  t = C_WaitForSlo
28210 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69  tEvent;..pFuncti
28220 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
28230 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47  hanismList = C_G
28240 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b  etMechanismList;
28250 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
28260 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49  >C_GetMechanismI
28270 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61  nfo = C_GetMecha
28280 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  nismInfo;..pFunc
28290 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
282a0 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f  Token = C_InitTo
282b0 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ken;..pFunctionL
282c0 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d  ist->C_InitPIN =
282d0 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75   C_InitPIN;..pFu
282e0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
282f0 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b  tPIN = C_SetPIN;
28300 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
28310 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d  >C_OpenSession =
28320 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a   C_OpenSession;.
28330 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
28340 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d  C_CloseSession =
28350 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b   C_CloseSession;
28360 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
28370 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69  >C_CloseAllSessi
28380 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c  ons = C_CloseAll
28390 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63  Sessions;..pFunc
283a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
283b0 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47  essionInfo = C_G
283c0 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09  etSessionInfo;..
283d0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
283e0 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
283f0 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74  te = C_GetOperat
28400 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63  ionState;..pFunc
28410 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f  tionList->C_SetO
28420 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
28430 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
28440 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
28450 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43  ist->C_Login = C
28460 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69  _Login;..pFuncti
28470 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74  onList->C_Logout
28480 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46   = C_Logout;..pF
28490 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
284a0 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f  reateObject = C_
284b0 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70  CreateObject;..p
284c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
284d0 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43  CopyObject = C_C
284e0 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  opyObject;..pFun
284f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73  ctionList->C_Des
28500 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44  troyObject = C_D
28510 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70  estroyObject;..p
28520 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
28530 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20  GetObjectSize = 
28540 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b  C_GetObjectSize;
28550 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
28560 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56  >C_GetAttributeV
28570 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72  alue = C_GetAttr
28580 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75  ibuteValue;..pFu
28590 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
285a0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
285b0 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  = C_SetAttribute
285c0 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
285d0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
285e0 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e  ectsInit = C_Fin
285f0 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70  dObjectsInit;..p
28600 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
28610 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f  FindObjects = C_
28620 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46  FindObjects;..pF
28630 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
28640 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20  indObjectsFinal 
28650 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  = C_FindObjectsF
28660 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
28670 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49  List->C_EncryptI
28680 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49  nit = C_EncryptI
28690 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
286a0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d  ist->C_Encrypt =
286b0 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75   C_Encrypt;..pFu
286c0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
286d0 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
286e0 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
286f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
28700 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _EncryptFinal = 
28710 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_EncryptFinal;.
28720 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
28730 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20  C_DecryptInit = 
28740 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_DecryptInit;..
28750 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
28760 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63  _Decrypt = C_Dec
28770 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
28780 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55  List->C_DecryptU
28790 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
287a0 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
287b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
287c0 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72  ptFinal = C_Decr
287d0 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
287e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
287f0 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73  stInit = C_Diges
28800 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
28810 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20  nList->C_Digest 
28820 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75  = C_Digest;..pFu
28830 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
28840 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
28850 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46  igestUpdate;..pF
28860 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
28870 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67  igestKey = C_Dig
28880 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  estKey;..pFuncti
28890 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
288a0 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74  Final = C_Digest
288b0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
288c0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69  nList->C_SignIni
288d0 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a  t = C_SignInit;.
288e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
288f0 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b  C_Sign = C_Sign;
28900 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
28910 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20  >C_SignUpdate = 
28920 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70  C_SignUpdate;..p
28930 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
28940 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69  SignFinal = C_Si
28950 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  gnFinal;..pFunct
28960 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52  ionList->C_SignR
28970 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53  ecoverInit = C_S
28980 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a  ignRecoverInit;.
28990 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
289a0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20  C_SignRecover = 
289b0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09  C_SignRecover;..
289c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
289d0 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f  _VerifyInit = C_
289e0 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75  VerifyInit;..pFu
289f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
28a00 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b  rify = C_Verify;
28a10 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
28a20 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 20  >C_VerifyUpdate 
28a30 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  = C_VerifyUpdate
28a40 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
28a50 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20  ->C_VerifyFinal 
28a60 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b  = C_VerifyFinal;
28a70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
28a80 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72  >C_VerifyRecover
28a90 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52  Init = C_VerifyR
28aa0 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75  ecoverInit;..pFu
28ab0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
28ac0 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f  rifyRecover = C_
28ad0 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09  VerifyRecover;..
28ae0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
28af0 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
28b00 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45  date = C_DigestE
28b10 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
28b20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
28b30 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
28b40 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44  ate = C_DecryptD
28b50 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46  igestUpdate;..pF
28b60 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
28b70 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
28b80 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74   = C_SignEncrypt
28b90 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
28ba0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
28bb0 74 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20  tVerifyUpdate = 
28bc0 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
28bd0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
28be0 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
28bf0 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74  eKey = C_Generat
28c00 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  eKey;..pFunction
28c10 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
28c20 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65  KeyPair = C_Gene
28c30 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46  rateKeyPair;..pF
28c40 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57  unctionList->C_W
28c50 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b  rapKey = C_WrapK
28c60 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
28c70 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20  st->C_UnwrapKey 
28c80 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09  = C_UnwrapKey;..
28c90 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
28ca0 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44  _DeriveKey = C_D
28cb0 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63  eriveKey;..pFunc
28cc0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64  tionList->C_Seed
28cd0 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52  Random = C_SeedR
28ce0 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f  andom;..pFunctio
28cf0 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
28d00 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65  eRandom = C_Gene
28d10 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75  rateRandom;..pFu
28d20 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
28d30 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20  tFunctionStatus 
28d40 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  = C_GetFunctionS
28d50 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f  tatus;..pFunctio
28d60 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46  nList->C_CancelF
28d70 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63  unction = C_Canc
28d80 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75  elFunction;..pFu
28d90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
28da0 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  tFunctionList = 
28db0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
28dc0 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e  t;...*ppFunction
28dd0 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e  List = pFunction
28de0 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  List;...CACKEY_D
28df0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28e00 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
28e10 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
28e20 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
28e30 7d 0a 0a                                         }..