Hex Artifact Content

Artifact bf135592210482c3ba191b791d5cda0c5508bd5e:


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 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49   0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30  _AID        0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20  03, 0x08, 0x00, 
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30  0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a  , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20   PIV IDs */./** 
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20  Key Identifiers 
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d  (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f  3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69  UTH   0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20  3_KEY_SIGNATURE 
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23  KEYMGT    0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55  _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c  TH  0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69  gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32  -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23  _RSA1024  0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62  48  0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73  ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33   (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65  -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20   2) **/.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35  ID_PIVAUTH   0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64  F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30  EYMGT    0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e  xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30  _OID_CARDAUTH  0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a  x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e   of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a   of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73   Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23   above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50  define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20  DU_MTU          
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52       250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e  _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31  e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a  ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49  #  ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64  ME_H.#    includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69  e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f  c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73   = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63  void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63  time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72  ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61  (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73  _time);.}.#  els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45  d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64  BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64  }.#  endif..#  d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e  = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a  tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78  eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e  ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62  c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66  096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73  _user_p, *buf_us
1990: 65 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73  er_print; \..uns
19a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75  igned long buf_u
19b0: 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73  ser_size; \..uns
19c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42  igned char *TMPB
19d0: 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20  UF; \..unsigned 
19e0: 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74  long idx; \..int
19f0: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c   snprintf_ret; \
1a00: 0a 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69  ..TMPBUF = (unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29  gned char *) (x)
1a20: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d  ; \..buf_user[0]
1a30: 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65   = 0; \..buf_use
1a40: 72 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66  r[2] = 0; \..buf
1a50: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73  _user_p = buf_us
1a60: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f  er; \..buf_user_
1a70: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75  size = sizeof(bu
1a80: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20  f_user); \..for 
1a90: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1aa0: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a  (y); idx++) { \.
1ab0: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73  ..if (buf_user_s
1ac0: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09  ize <= 0) { \...
1ad0: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c  .break; \...}; \
1ae0: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  ...snprintf_ret 
1af0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75  = snprintf(buf_u
1b00: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f  ser_p, buf_user_
1b10: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20  size, ", %02x", 
1b20: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a  TMPBUF[idx]); \.
1b30: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
1b40: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09  et <= 0) { \....
1b50: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a  break; \...}; \.
1b60: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20  ..buf_user_p += 
1b70: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1b80: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1b90: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b  -= snprintf_ret;
1ba0: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73   \..}; \..buf_us
1bb0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
1bc0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1bd0: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69   \..buf_user_pri
1be0: 6e 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20  nt = buf_user + 
1bf0: 32 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61  2; \..fprintf(ca
1c00: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1c10: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69   "[%lu]: %s():%i
1c20: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1c30: 7b 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59  {%s})\n", CACKEY
1c40: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
1c50: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
1c60: 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e  NE__, f, #x, (un
1c70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29  signed long) (y)
1c80: 2c 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74  , buf_user_print
1c90: 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63  ); \..fflush(cac
1ca0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b  key_debug_fd());
1cb0: 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66   \.}.#  define f
1cc0: 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f  ree(x) { CACKEY_
1cd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52  DEBUG_PRINTF("FR
1ce0: 45 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76  EE(%p) (%s)", (v
1cf0: 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66  oid *) x, #x); f
1d00: 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69  ree(x); }..stati
1d10: 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64  c FILE *cackey_d
1d20: 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a  ebug_fd(void) {.
1d30: 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64  .static FILE *fd
1d40: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
1d50: 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66  logfile;...if (f
1d60: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  d != NULL) {...r
1d70: 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09  eturn(fd);..}...
1d80: 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74  /*.. * Log to st
1d90: 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  derr initially s
1da0: 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62  o we can use deb
1db0: 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20  ugging within.. 
1dc0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1dd0: 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20  without getting 
1de0: 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65  into an infinite
1df0: 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d   loop.. */..fd =
1e00: 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69   stderr;...logfi
1e10: 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43  le = getenv("CAC
1e20: 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c  KEY_DEBUG_LOGFIL
1e30: 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c  E");..if (logfil
1e40: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e != NULL) {...C
1e50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e60: 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f  TF("Found enviro
1e70: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20  nment variable: 
1e80: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e90: 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63  ..logfile = strc
1ea0: 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29  hr(logfile, '=')
1eb0: 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20  ;...if (logfile 
1ec0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f  == NULL) {....lo
1ed0: 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22  gfile = getenv("
1ee0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1ef0: 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65  FILE");...} else
1f00: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b   {....logfile++;
1f10: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
1f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1f30: 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c  FILE..if (logfil
1f40: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c  e == NULL) {...l
1f50: 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f  ogfile = CACKEY_
1f60: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09  DEBUG_LOGFILE;..
1f70: 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c  }.#endif...if (l
1f80: 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  ogfile != NULL) 
1f90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fa0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c  _PRINTF("Found l
1fb0: 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f  og file: %s", lo
1fc0: 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20  gfile);....fd = 
1fd0: 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22  fopen(logfile, "
1fe0: 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64  a");..}...if (fd
1ff0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64   == NULL) {...fd
2000: 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09   = stderr;..}...
2010: 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72  if (fd == stderr
2020: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2030: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2040: 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09  ning stderr");..
2050: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
2060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2070: 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28  Returning %p", (
2080: 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a  void *) fd);..}.
2090: 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a  ..return(fd);.}.
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41  .static void *CA
20b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
20c0: 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69  MALLOC(size_t si
20d0: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ze, const char *
20e0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
20f0: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b  {..void *retval;
2100: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c  ...retval = mall
2110: 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69  oc(size);...fpri
2120: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2130: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2140: 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29  s():%i: MALLOC()
2150: 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59   = %p\n", CACKEY
2160: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
2170: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65  , func, line, re
2180: 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63  tval);..fflush(c
2190: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
21a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
21b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
21c0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
21d0: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76  G_FUNC_REALLOC(v
21e0: 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74  oid *ptr, size_t
21f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61   size, const cha
2200: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
2210: 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76  e) {..void *retv
2220: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72  al;...retval = r
2230: 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65  ealloc(ptr, size
2240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
2250: 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69  != ptr) {...fpri
2260: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2270: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2280: 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28  s():%i: REALLOC(
2290: 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43  %p) = %p\n", CAC
22a0: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d  KEY_DEBUG_GETTIM
22b0: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c  E(), func, line,
22c0: 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09   ptr, retval);..
22d0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
22e0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a  ebug_fd());..}..
22f0: 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e  .if (retval == N
2300: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a  DEBUG_PRINTF(" *
2320: 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61  ** ERROR *** rea
2330: 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55  lloc returned NU
2340: 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22  LL (size = %lu)"
2350: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2360: 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65  ) size);..}...re
2370: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2380: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41  .static char *CA
2390: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
23a0: 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61  STRDUP(const cha
23b0: 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68  r *ptr, const ch
23c0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69  ar *func, int li
23d0: 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74  ne) {..char *ret
23e0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
23f0: 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66  strdup(ptr);...f
2400: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
2410: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
2420: 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55  : %s():%i: STRDU
2430: 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c  P_MALLOC() = %p\
2440: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  n", CACKEY_DEBUG
2450: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63  _GETTIME(), func
2460: 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b  , line, retval);
2470: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
2480: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72  debug_fd());...r
2490: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
24a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
24b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
24c0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
24d0: 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  R(unsigned char 
24e0: 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28  tag) {..switch (
24f0: 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53  tag) {...case GS
2500: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a  CIS_TAG_CARDID:.
2510: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2520: 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09  _TAG_CARDID");..
2530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2540: 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCC_VER:....retu
2550: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
2560: 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  C_VER");...case 
2570: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
2580: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
2590: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22  CIS_TAG_CCG_VER"
25a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
25b0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
25c0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25d0: 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63  G_CARDURL");...c
25e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
25f0: 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  CS15:....return(
2600: 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31  "GSCIS_TAG_PKCS1
2610: 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  5");...case GSCI
2620: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d  S_TAG_REG_DATA_M
2630: 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ODEL:....return(
2640: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44  "GSCIS_TAG_REG_D
2650: 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63  ATA_MODEL");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
2670: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  R_TABLE:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43  rn("GSCIS_TAG_AC
2690: 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  R_TABLE");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
26b0: 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e  _APDU:....return
26c0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
26d0: 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20  _APDU");...case 
26e0: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
26f0: 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  CTION:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  ("GSCIS_TAG_REDI
2710: 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  RECTION");...cas
2720: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a  e GSCIS_TAG_CT:.
2730: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2740: 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73  _TAG_CT");...cas
2750: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a  e GSCIS_TAG_ST:.
2760: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2770: 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73  _TAG_ST");...cas
2780: 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  e GSCIS_TAG_NEXT
2790: 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  CCC:....return("
27a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
27b0: 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  C");...case GSCI
27c0: 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09  S_TAG_FNAME:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
27e0: 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73  G_FNAME");...cas
27f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2810: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b  CIS_TAG_MNAME");
2820: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2830: 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_LNAME:....retu
2840: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e  rn("GSCIS_TAG_LN
2850: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
2860: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a  CIS_TAG_SUFFIX:.
2870: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2880: 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09  _TAG_SUFFIX");..
2890: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
28a0: 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09  GOVT_AGENCY:....
28b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
28c0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b  G_GOVT_AGENCY");
28d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
28e0: 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74  G_BUREAU:....ret
28f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
2900: 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20  UREAU");...case 
2910: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2920: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2930: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  ("GSCIS_TAG_BURE
2940: 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  AU_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  e GSCIS_TAG_DEPT
2960: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  ("GSCIS_TAG_DEPT
2980: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2990: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a  GSCIS_TAG_TITLE:
29a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
29b0: 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09  S_TAG_TITLE");..
29c0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
29d0: 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74  BUILDING:....ret
29e0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
29f0: 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73  UILDING");...cas
2a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2a10: 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74  CE_ADDR1:....ret
2a20: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2a30: 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09  FFICE_ADDR1");..
2a40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2a50: 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09  OFFICE_ADDR2:...
2a60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2a70: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22  AG_OFFICE_ADDR2"
2a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2a90: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a  TAG_OFFICE_CITY:
2aa0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2ab0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2ac0: 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  Y");...case GSCI
2ad0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
2ae0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
2af0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b00: 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  STATE");...case 
2b10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b20: 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  _ZIP:....return(
2b30: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b40: 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20  E_ZIP");...case 
2b50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b60: 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74  _COUNTRY:....ret
2b70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2b80: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b  FFICE_COUNTRY");
2b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ba0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a  G_OFFICE_PHONE:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2bc0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
2bd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2be0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2bf0: 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72  NE_EXT:....retur
2c00: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2c10: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b  ICE_PHONE_EXT");
2c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c30: 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09  G_OFFICE_FAX:...
2c40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2c50: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b  AG_OFFICE_FAX");
2c60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c70: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a  G_OFFICE_EMAIL:.
2c80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49  _TAG_OFFICE_EMAI
2ca0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  L");...case GSCI
2cb0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2cc0: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  M:....return("GS
2cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2ce0: 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53  OOM");...case GS
2cf0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2d00: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e  GENCY:....return
2d10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47  ("GSCIS_TAG_NONG
2d20: 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  OV_AGENCY");...c
2d30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53  ase GSCIS_TAG_SS
2d40: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09  N_DESIGNATOR:...
2d50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d60: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
2d70: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2d80: 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65  S_TAG_SSN:....re
2d90: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2da0: 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  SSN");...case GS
2db0: 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09  CIS_TAG_DOB:....
2dc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2dd0: 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20  G_DOB");...case 
2de0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52  GSCIS_TAG_GENDER
2df0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e00: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b  IS_TAG_GENDER");
2e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e20: 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74  G_USERID:....ret
2e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55  urn("GSCIS_TAG_U
2e40: 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  SERID");...case 
2e50: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
2e60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e70: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b  IS_TAG_DOMAIN");
2e80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e90: 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72  G_PASSWORD:....r
2ea0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2eb0: 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63  _PASSWORD");...c
2ec0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2ed0: 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  SUERID:....retur
2ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2ef0: 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  UERID");...case 
2f00: 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a  GSCIS_TAG_SERNO:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2f20: 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09  S_TAG_SERNO");..
2f30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f40: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72  ISSUE_DATE:....r
2f50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2f60: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
2f70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f80: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
2f90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fa0: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b  G_EXPIRE_DATE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2fc0: 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09  G_CARD_TYPE:....
2fd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fe0: 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09  G_CARD_TYPE");..
2ff0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3000: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09  SECURITY_CODE:..
3010: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
3020: 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44  TAG_SECURITY_COD
3030: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
3040: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44  S_TAG_CARDID_AID
3050: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3060: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
3070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
3080: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
3090: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
30a0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
30b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
30c0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
30d0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  UE_DATE:....retu
30e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
30f0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  RT_ISSUE_DATE");
3100: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3110: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
3120: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3130: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
3140: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a  PIRE_DATE");..}.
3150: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3160: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3170: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3180: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
3190: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e  RDERR_TO_STR(LON
31a0: 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77  G retcode) {..sw
31b0: 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b  itch (retcode) {
31c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f  ...case SCARD_S_
31d0: 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75  SUCCESS:....retu
31e0: 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43  rn("SCARD_S_SUCC
31f0: 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ESS");...case SC
3200: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a  ARD_E_CANCELLED:
3210: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3220: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  D_E_CANCELLED");
3230: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3240: 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09  CANT_DISPOSE:...
3250: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3260: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b  _CANT_DISPOSE");
3270: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3280: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46  INSUFFICIENT_BUF
3290: 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FER:....return("
32a0: 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43  SCARD_E_INSUFFIC
32b0: 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09  IENT_BUFFER");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65  VALID_ATR:....re
32e0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
32f0: 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63  VALID_ATR");...c
3300: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3310: 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72  LID_HANDLE:....r
3320: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b  NVALID_HANDLE");
3340: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3350: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45  INVALID_PARAMETE
3360: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
3370: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
3380: 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73  RAMETER");...cas
3390: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
33a0: 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74  D_TARGET:....ret
33b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
33c0: 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09  ALID_TARGET");..
33d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
33e0: 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09  VALID_VALUE:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3400: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b  INVALID_VALUE");
3410: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3420: 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65  NO_MEMORY:....re
3430: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3440: 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73  _MEMORY");...cas
3450: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
3460: 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74  N_READER:....ret
3470: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
3480: 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09  NOWN_READER");..
3490: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49  .case SCARD_E_TI
34a0: 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e  MEOUT:....return
34b0: 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  ("SCARD_E_TIMEOU
34c0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
34d0: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  D_E_SHARING_VIOL
34e0: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  ATION:....return
34f0: 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  ("SCARD_E_SHARIN
3500: 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09  G_VIOLATION");..
3510: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3520: 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72  _SMARTCARD:....r
3530: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
3540: 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09  O_SMARTCARD");..
3550: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e  .case SCARD_E_UN
3560: 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72  KNOWN_CARD:....r
3570: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3580: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09  NKNOWN_CARD");..
3590: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52  .case SCARD_E_PR
35a0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09  OTO_MISMATCH:...
35b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
35c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22  _PROTO_MISMATCH"
35d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
35e0: 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09  E_NOT_READY:....
35f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3600: 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63  NOT_READY");...c
3610: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54  ase SCARD_E_SYST
3620: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09  EM_CANCELLED:...
3630: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3640: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45  _SYSTEM_CANCELLE
3650: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3660: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54  D_E_NOT_TRANSACT
3670: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
3680: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
3690: 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20  ACTED");...case 
36a0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
36b0: 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72  NAVAILABLE:....r
36c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
36d0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c  EADER_UNAVAILABL
36e0: 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  E");...case SCAR
36f0: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_W_UNSUPPORTED_
3700: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3710: 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f  "SCARD_W_UNSUPPO
3720: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  RTED_CARD");...c
3730: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45  ase SCARD_W_UNRE
3740: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09  SPONSIVE_CARD:..
3750: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3760: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
3770: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3780: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
3790: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37a0: 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52  "SCARD_W_UNPOWER
37b0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
37c0: 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  e SCARD_W_RESET_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43  "SCARD_W_RESET_C
37f0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3800: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41  ARD_W_REMOVED_CA
3810: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3820: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
3830: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3840: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3850: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ALL:....return("
3860: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3870: 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20  SMALL");...case 
3880: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3890: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
38a0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
38b0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45  EADER_UNSUPPORTE
38c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
38d0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45  D_E_DUPLICATE_RE
38e0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
38f0: 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41  "SCARD_E_DUPLICA
3900: 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  TE_READER");...c
3910: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44  ase SCARD_E_CARD
3920: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
3930: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3940: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45  _CARD_UNSUPPORTE
3950: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3960: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a  D_E_NO_SERVICE:.
3970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3980: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b  _E_NO_SERVICE");
3990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
39a0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a  SERVICE_STOPPED:
39b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
39c0: 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50  D_E_SERVICE_STOP
39d0: 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  PED");...case SC
39e0: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_E_UNSUPPORTE
39f0: 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65  D_FEATURE:....re
3a00: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
3a10: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52  SUPPORTED_FEATUR
3a20: 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52  E");.#ifdef SCAR
3a30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
3a40: 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  D...case SCARD_W
3a50: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a  _INSERTED_CARD:.
3a60: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3a70: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a80: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ");.#endif.#ifde
3a90: 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  f SCARD_E_NO_REA
3aa0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09  DERS_AVAILABLE..
3ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3ac0: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42  _READERS_AVAILAB
3ad0: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  LE:....return("S
3ae0: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3af0: 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23  S_AVAILABLE");.#
3b00: 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72  endif..}...retur
3b10: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
3b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3b30: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3b40: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
3b50: 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69  TR(uint16_t obji
3b60: 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62  d) {..switch (ob
3b70: 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78  jid) {...case 0x
3b80: 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  2000:....return(
3b90: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3ba0: 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b  D_GENERALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a  ...case 0x2100:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50  Y_TLV_OBJID_PROP
3be0: 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09  ERSONALINFO");..
3bf0: 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09  .case 0x3000:...
3c00: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c10: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53  TLV_OBJID_ACCESS
3c20: 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73  CONTROL");...cas
3c30: 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74  e 0x4000:....ret
3c40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c50: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09  OBJID_LOGIN");..
3c60: 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09  .case 0x5000:...
3c70: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c80: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e  TLV_OBJID_CARDIN
3c90: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36  FO");...case 0x6
3ca0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3cb0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3cc0: 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09  _BIOMETRICS");..
3cd0: 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09  .case 0x7000:...
3ce0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
3d00: 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61  LSIGCERT");...ca
3d10: 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65  se 0x0200:....re
3d20: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d30: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3d40: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  N");...case 0x02
3d50: 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  02:....return("C
3d60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d70: 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a  CAC_BENEFITS");.
3d80: 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09  ..case 0x0203:..
3d90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3da0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
3db0: 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a  THERBENEFITS");.
3dc0: 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09  ..case 0x0201:..
3dd0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3de0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3df0: 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61  ERSONNEL");...ca
3e00: 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65  se 0x02FE:....re
3e10: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3e20: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
3e30: 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75  RT");..}....retu
3e40: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
3e50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3e60: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
3e70: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54  G_FUNC_APPTYPE_T
3e80: 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70  O_STR(uint8_t ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68  ptype) {..switch
3ea0: 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63   (apptype) {...c
3eb0: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74  ase 0x00:....ret
3ec0: 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63  urn("NONE");...c
3ed0: 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74  ase 0x01:....ret
3ee0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3ef0: 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09  APP_GENERIC");..
3f00: 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72  .case 0x02:....r
3f10: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f20: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
3f30: 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74  ase 0x03:....ret
3f40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3f50: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
3f60: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
3f70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a  ");...case 0x04:
3f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3f90: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3fa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09  ;...case 0x05:..
3fb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3fc0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3fd0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
3fe0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3ff0: 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x06:....return(
4000: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
4010: 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  SKI | CACKEY_TLV
4020: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
4030: 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75  se 0x07:....retu
4040: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
4050: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
4060: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
4070: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
4080: 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  _PKI");..}...ret
4090: 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a  urn("INVALID");.
40a0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
40b0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
40c0: 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54  UG_FUNC_ATTRIBUT
40d0: 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52  E_TO_STR(CK_ATTR
40e0: 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29  IBUTE_TYPE attr)
40f0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72   {..switch (attr
4100: 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ) {...case CKA_C
4110: 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  LASS:....return(
4120: 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09  "CKA_CLASS");...
4130: 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a  case CKA_TOKEN:.
4140: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54  ...return("CKA_T
4150: 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  OKEN");...case C
4160: 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72  KA_PRIVATE:....r
4170: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41  eturn("CKA_PRIVA
4180: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TE");...case CKA
4190: 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72  _LABEL:....retur
41a0: 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a  n("CKA_LABEL");.
41b0: 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49  ..case CKA_APPLI
41c0: 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  CATION:....retur
41d0: 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49  n("CKA_APPLICATI
41e0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ON");...case CKA
41f0: 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72  _VALUE:....retur
4200: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a  n("CKA_VALUE");.
4210: 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43  ..case CKA_OBJEC
4220: 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  T_ID:....return(
4230: 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29  "CKA_OBJECT_ID")
4240: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ;...case CKA_CER
4250: 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45  ..return("CKA_CE
4270: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29  RTIFICATE_TYPE")
4280: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ;...case CKA_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UER:....return("
42a0: 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09  CKA_ISSUER");...
42b0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
42c0: 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72  NUMBER:....retur
42d0: 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  n("CKA_SERIAL_NU
42e0: 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  MBER");...case C
42f0: 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09  KA_AC_ISSUER:...
4300: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f  .return("CKA_AC_
4310: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65  ISSUER");...case
4320: 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72   CKA_OWNER:....r
4330: 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52  eturn("CKA_OWNER
4340: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4350: 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65  TTR_TYPES:....re
4360: 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54  turn("CKA_ATTR_T
4370: 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43  YPES");...case C
4380: 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72  KA_TRUSTED:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54  eturn("CKA_TRUST
43a0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ED");...case CKA
43b0: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65  _KEY_TYPE:....re
43c0: 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59  turn("CKA_KEY_TY
43d0: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PE");...case CKA
43e0: 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74  _SUBJECT:....ret
43f0: 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54  urn("CKA_SUBJECT
4400: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
4410: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4420: 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43  A_ID");...case C
4430: 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09  KA_SENSITIVE:...
4440: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e  .return("CKA_SEN
4450: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4460: 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09   CKA_ENCRYPT:...
4470: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43  .return("CKA_ENC
4480: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
4490: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72  KA_DECRYPT:....r
44a0: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59  eturn("CKA_DECRY
44b0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
44c0: 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e  _WRAP:....return
44d0: 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09  ("CKA_WRAP");...
44e0: 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a  case CKA_UNWRAP:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4500: 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65  UNWRAP");...case
4510: 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65   CKA_SIGN:....re
4520: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29  turn("CKA_SIGN")
4530: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ;...case CKA_SIG
4540: 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65  N_RECOVER:....re
4550: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52  turn("CKA_SIGN_R
4560: 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  ECOVER");...case
4570: 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09   CKA_VERIFY:....
4580: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49  return("CKA_VERI
4590: 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  FY");...case CKA
45a0: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a  _VERIFY_RECOVER:
45b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
45c0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29  VERIFY_RECOVER")
45d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52  ;...case CKA_DER
45e0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
45f0: 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09  CKA_DERIVE");...
4600: 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44  case CKA_START_D
4610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4620: 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29  CKA_START_DATE")
4630: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44  ;...case CKA_END
4640: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
4650: 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29  ("CKA_END_DATE")
4660: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4670: 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  ULUS:....return(
4680: 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a  "CKA_MODULUS");.
4690: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
46a0: 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  US_BITS:....retu
46b0: 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f  rn("CKA_MODULUS_
46c0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
46d0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
46e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
46f0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
4700: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4710: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e  _PRIVATE_EXPONEN
4720: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4730: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45  A_PRIVATE_EXPONE
4740: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4750: 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74  _PRIME_1:....ret
4760: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31  urn("CKA_PRIME_1
4770: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4780: 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72  RIME_2:....retur
4790: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29  n("CKA_PRIME_2")
47a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50  ;...case CKA_EXP
47b0: 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75  ONENT_1:....retu
47c0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  rn("CKA_EXPONENT
47d0: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
47e0: 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09  _EXPONENT_2:....
47f0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f  return("CKA_EXPO
4800: 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65  NENT_2");...case
4810: 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54   CKA_COEFFICIENT
4820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4830: 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a  _COEFFICIENT");.
4840: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
4850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4860: 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  _PRIME");...case
4870: 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09   CKA_SUBPRIME:..
4880: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4890: 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  BPRIME");...case
48a0: 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65   CKA_BASE:....re
48b0: 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29  turn("CKA_BASE")
48c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
48d0: 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  ME_BITS:....retu
48e0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49  rn("CKA_PRIME_BI
48f0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4900: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a  _SUB_PRIME_BITS:
4910: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4920: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29  SUB_PRIME_BITS")
4930: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
4940: 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  UE_BITS:....retu
4950: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49  rn("CKA_VALUE_BI
4960: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4970: 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72  _VALUE_LEN:....r
4980: 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45  eturn("CKA_VALUE
4990: 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  _LEN");...case C
49a0: 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a  KA_EXTRACTABLE:.
49b0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
49c0: 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09  XTRACTABLE");...
49d0: 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a  case CKA_LOCAL:.
49e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c  ...return("CKA_L
49f0: 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43  OCAL");...case C
4a00: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4a10: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
4a20: 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41  "CKA_NEVER_EXTRA
4a30: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  CTABLE");...case
4a40: 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53   CKA_ALWAYS_SENS
4a50: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ITIVE:....return
4a60: 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e  ("CKA_ALWAYS_SEN
4a70: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4a80: 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43   CKA_KEY_GEN_MEC
4a90: 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72  HANISM:....retur
4aa0: 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  n("CKA_KEY_GEN_M
4ab0: 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61  ECHANISM");...ca
4ac0: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  se CKA_MODIFIABL
4ad0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4ae0: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a  A_MODIFIABLE");.
4af0: 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41  ..case CKA_ECDSA
4b00: 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75  _PARAMS:....retu
4b10: 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41  rn("CKA_ECDSA_PA
4b20: 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43  RAMS");...case C
4b30: 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09  KA_EC_POINT:....
4b40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50  return("CKA_EC_P
4b50: 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  OINT");...case C
4b60: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54  KA_SECONDARY_AUT
4b70: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  H:....return("CK
4b80: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48  A_SECONDARY_AUTH
4b90: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4ba0: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09  UTH_PIN_FLAGS:..
4bb0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55  ..return("CKA_AU
4bc0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a  TH_PIN_FLAGS");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45  ..case CKA_HW_FE
4be0: 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72  ATURE_TYPE:....r
4bf0: 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45  eturn("CKA_HW_FE
4c00: 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09  ATURE_TYPE");...
4c10: 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f  case CKA_RESET_O
4c20: 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72  N_INIT:....retur
4c30: 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  n("CKA_RESET_ON_
4c40: 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43  INIT");...case C
4c50: 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09  KA_HAS_RESET:...
4c60: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53  .return("CKA_HAS
4c70: 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65  _RESET");...case
4c80: 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49   CKA_VENDOR_DEFI
4c90: 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NED:....return("
4ca0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e  CKA_VENDOR_DEFIN
4cb0: 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ED");..}...retur
4cc0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
4cd0: 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f  .#  define mallo
4ce0: 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  c(x) CACKEY_DEBU
4cf0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c  G_FUNC_MALLOC(x,
4d00: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
4d10: 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72  E__).#  define r
4d20: 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43  ealloc(x, y) CAC
4d30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52  KEY_DEBUG_FUNC_R
4d40: 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66  EALLOC(x, y, __f
4d50: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d60: 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70  .#  ifdef strdup
4d70: 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64  .#    undef strd
4d80: 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64  up.#  endif.#  d
4d90: 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20  efine strdup(x) 
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4db0: 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75  C_STRDUP(x, __fu
4dc0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a  nc__, __LINE__).
4dd0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
4de0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4df0: 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23  NTF(x...) /**/.#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e10: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66  DEBUG_PRINTBUF(f
4e20: 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20  , x, y) /**/.#  
4e30: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4e40: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
4e90: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4ea0: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4eb0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4ec0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
4ed0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4ee0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4f00: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
4f10: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4f20: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4f30: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4f40: 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
4f50: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4f60: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LED".#endif../*.
4f70: 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65   * Include these
4f80: 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e   source files in
4f90: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
4fa0: 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77  n unit so that w
4fb0: 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a  e can bind to. *
4fc0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
4fd0: 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73  ot include any s
4fe0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75  ymbols in the ou
4ff0: 74 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65  tput shared obje
5000: 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  ct.. */.#include
5010: 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23   "asn1-x509.c".#
5020: 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22  include "sha1.c"
5030: 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63  .#include "md5.c
5040: 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  "..typedef enum 
5050: 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  {..CACKEY_ID_TYP
5060: 45 5f 45 52 52 4f 52 2c 0a 09 43 41 43 4b 45 59  E_ERROR,..CACKEY
5070: 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
5080: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
5090: 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49  E_CAC,..CACKEY_I
50a0: 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43  D_TYPE_PIV,..CAC
50b0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
50c0: 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70  _ONLY.} cackey_p
50d0: 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74  csc_id_type;..st
50e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
50f0: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63  _identity {..cac
5100: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
5110: 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65   id_type;...size
5120: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  _t certificate_l
5130: 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  en;..unsigned ch
5140: 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  ar *certificate;
5150: 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69  ...ssize_t keysi
5160: 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09  ze;...union {...
5170: 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69  struct {....unsi
5180: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74  gned char applet
5190: 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74  [7];....uint16_t
51a0: 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a   file;...} cac;.
51b0: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75  ...struct {....u
51c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79  nsigned char key
51d0: 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62  _id;....char lab
51e0: 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b  el[32];...} piv;
51f0: 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74  ..} card;.};..st
5200: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
5210: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63  tity {..struct c
5220: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
5230: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
5240: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55  ty;...CK_ATTRIBU
5250: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a  TE *attributes;.
5260: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62  .CK_ULONG attrib
5270: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a  utes_count;.};..
5280: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
5290: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74  ssion {..int act
52a0: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49  ive;...CK_SLOT_I
52b0: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53  D slotID;...CK_S
52c0: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f  TATE state;..CK_
52d0: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b  FLAGS flags;..CK
52e0: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45  _ULONG ulDeviceE
52f0: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  rror;..CK_VOID_P
5300: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b  TR pApplication;
5310: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69  ..CK_NOTIFY Noti
5320: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  fy;...struct cac
5330: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
5340: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
5350: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
5360: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74  ies_count;...int
5370: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a   search_active;.
5380: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54  .CK_ATTRIBUTE_PT
5390: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a  R search_query;.
53a0: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68  .CK_ULONG search
53b0: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75  _query_count;..u
53c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61  nsigned long sea
53d0: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69  rch_curr_id;...i
53e0: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a  nt sign_active;.
53f0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
5400: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  PE sign_mechanis
5410: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20  m;..CK_BYTE_PTR 
5420: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67  sign_buf;..unsig
5430: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
5440: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  flen;..unsigned 
5450: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65  long sign_bufuse
5460: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
5470: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e  y_identity *sign
5480: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74  _identity;...int
5490: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b   decrypt_active;
54a0: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  ..CK_MECHANISM_T
54b0: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68  YPE decrypt_mech
54c0: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f  anism;..CK_VOID_
54d0: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68  PTR decrypt_mech
54e0: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _parm;..CK_ULONG
54f0: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61   decrypt_mech_pa
5500: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63  rmlen;..struct c
5510: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
5520: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
5530: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
5540: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20  key_slot {..int 
5550: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74  active;..int int
5560: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70  ernal;...char *p
5570: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e  csc_reader;...in
5580: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  t pcsc_card_conn
5590: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e  ected;..SCARDHAN
55a0: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a  DLE pcsc_card;..
55b0: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
55c0: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61  _depth;..int tra
55d0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
55e0: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f  _lock;...int slo
55f0: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c  t_reset;...CK_FL
5600: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  AGS token_flags;
5610: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
5620: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44   *label;...DWORD
5630: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73   protocol;...uns
5640: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64  igned int cached
5650: 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73  _certs_count;..s
5660: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5670: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68  c_identity *cach
5680: 65 64 5f 63 65 72 74 73 3b 0a 0a 09 63 61 63 6b  ed_certs;...cack
5690: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
56a0: 69 64 5f 74 79 70 65 5f 68 69 6e 74 3b 0a 7d 3b  id_type_hint;.};
56b0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
56c0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
56d0: 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c  _GENERIC = 0x01,
56e0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
56f0: 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c  _SKI     = 0x02,
5700: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
5710: 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a  _PKI     = 0x04.
5720: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70  } cackey_tlv_app
5730: 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65  type;..typedef e
5740: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
5750: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49  V_OBJID_GENERALI
5760: 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30  NFO       = 0x20
5770: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5780: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41  OBJID_PROPERSONA
5790: 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30  LINFO   = 0x2100
57a0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
57b0: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f  JID_ACCESSCONTRO
57c0: 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a  L     = 0x3000,.
57d0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
57e0: 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20  D_LOGIN         
57f0: 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43      = 0x4000,..C
5800: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5810: 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20  CARDINFO        
5820: 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43    = 0x5000,..CAC
5830: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49  KEY_TLV_OBJID_BI
5840: 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20  OMETRICS        
5850: 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x6000,..CACKE
5860: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
5870: 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20  TALSIGCERT    = 
5880: 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x7000,..CACKEY_
5890: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
58a0: 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78  RSON        = 0x
58b0: 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0200,..CACKEY_TL
58c0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45  V_OBJID_CAC_BENE
58d0: 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32  FITS      = 0x02
58e0: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
58f0: 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42  OBJID_CAC_OTHERB
5900: 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33  ENEFITS = 0x0203
5910: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5920: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
5930: 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a  L     = 0x0201,.
5940: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5950: 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20  D_CAC_PKICERT   
5960: 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63      = 0x02FE.} c
5970: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5980: 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  id;..typedef enu
5990: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  m {..CACKEY_PCSC
59a0: 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20  _S_TOKENPRESENT 
59b0: 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f     = 1,..CACKEY_
59c0: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
59d0: 20 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43         = 0,..CAC
59e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
59f0: 49 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c  IC         = -1,
5a00: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5a10: 42 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20  BADPIN          
5a20: 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -2,..CACKEY_PC
5a30: 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  SC_E_LOCKED     
5a40: 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b       = -3,..CACK
5a50: 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
5a60: 47 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a  GIN       = -4,.
5a70: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  .CACKEY_PCSC_E_T
5a80: 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d  OKENABSENT     =
5a90: 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -6,..CACKEY_PCS
5aa0: 43 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 20  C_E_RETRY       
5ab0: 20 20 20 20 3d 20 2d 37 2c 0a 09 43 41 43 4b 45      = -7,..CACKE
5ac0: 59 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54 41 20  Y_PCSC_E_NODATA 
5ad0: 20 20 20 20 20 20 20 20 20 3d 20 2d 38 0a 7d 20           = -8.} 
5ae0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72  cackey_ret;..str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
5b00: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e  ardurl {..unsign
5b10: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72  ed char        r
5b20: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74  id[5];..cackey_t
5b30: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70  lv_apptype   app
5b40: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  type;..cackey_tl
5b50: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65  v_objectid  obje
5b60: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  ctid;..cackey_tl
5b70: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69  v_objectid  appi
5b80: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  d;..unsigned cha
5b90: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a  r        pinid;.
5ba0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
5bb0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74  y_tlv_entity;.st
5bc0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
5bd0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f  entity {..uint8_
5be0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  t tag;..size_t l
5bf0: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ength;...union {
5c00: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a  ...void *value;.
5c10: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5c20: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c  tlv_cardurl *val
5c30: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69  ue_cardurl;...ui
5c40: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65  nt8_t value_byte
5c50: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63  ;..};...struct c
5c60: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
5c70: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20   *_next;.};../* 
5c80: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61  CACKEY Global Ha
5c90: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
5ca0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67  void *cackey_big
5cb0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  lock = NULL;.sta
5cc0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
5cd0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79  y_session cackey
5ce0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a  _sessions[128];.
5cf0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5d00: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79  ckey_slot cackey
5d10: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61  _slots[128];.sta
5d20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69  tic int cackey_i
5d30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
5d40: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5d50: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
5d60: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   0;.CK_C_INITIAL
5d70: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f  IZE_ARGS cackey_
5d80: 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61  args;../** Extra
5d90: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f   certificates to
5da0: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65   include in toke
5db0: 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63  n **/.struct cac
5dc0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
5dd0: 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20  y extra_certs[] 
5de0: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61  = {.#include "ca
5df0: 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72  ckey_builtin_cer
5e00: 74 73 2e 68 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e  ts.h".};..#defin
5e10: 65 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44  e CACKEY_MACRO_D
5e20: 45 46 41 55 4c 54 5f 58 53 54 52 28 73 74 72 29  EFAULT_XSTR(str)
5e30: 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45   CACKEY_MACRO_DE
5e40: 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29 0a 23  FAULT_STR(str).#
5e50: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 4d 41  define CACKEY_MA
5e60: 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53 54 52 28  CRO_DEFAULT_STR(
5e70: 73 74 72 29 20 23 73 74 72 0a 0a 2f 2a 20 50 72  str) #str../* Pr
5e80: 6f 74 65 63 74 65 64 20 41 75 74 68 65 6e 74 69  otected Authenti
5e90: 63 61 74 69 6f 6e 20 50 61 74 68 20 63 6f 6d 6d  cation Path comm
5ea0: 61 6e 64 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  and */.static ch
5eb0: 61 72 20 2a 63 61 63 6b 65 79 5f 70 69 6e 5f 63  ar *cackey_pin_c
5ec0: 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a  ommand = NULL;..
5ed0: 2f 2a 20 52 65 61 64 65 72 20 45 78 63 6c 75 73  /* Reader Exclus
5ee0: 69 6f 6e 20 6f 72 20 49 6e 63 6c 75 64 65 2d 6f  ion or Include-o
5ef0: 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  nly */.static ch
5f00: 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 65  ar *cackey_reade
5f10: 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20  rs_include_only 
5f20: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 63  = NULL;.static c
5f30: 68 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  har *cackey_read
5f40: 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55  ers_exclude = NU
5f50: 4c 4c 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f  LL;../* PCSC Glo
5f60: 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73  bal Handles */.s
5f70: 74 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e  tatic LPSCARDCON
5f80: 54 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63  TEXT cackey_pcsc
5f90: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
5fa0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
5fb0: 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74   long cackey_get
5fc0: 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a  version(void) {.
5fd0: 09 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
5fe0: 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32   long retval = 2
5ff0: 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  55;..unsigned lo
6000: 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75  ng major = 0;..u
6010: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e  nsigned long min
6020: 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d  or = 0;..char *m
6030: 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  ajor_str = NULL;
6040: 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74  ..char *minor_st
6050: 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b  r = NULL;...CACK
6060: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6070: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
6080: 20 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29   (retval != 255)
6090: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
60a0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
60b0: 69 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65  ing 0x%lx (cache
60c0: 64 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  d).", retval);..
60d0: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
60e0: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
60f0: 30 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41  0;..#ifdef PACKA
6100: 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20  GE_VERSION.     
6110: 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50     major_str = P
6120: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a  ACKAGE_VERSION;.
6130: 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20  .if (major_str) 
6140: 7b 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  {..        major
6150: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72   = strtoul(major
6160: 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72  _str, &minor_str
6170: 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69  , 10);....if (mi
6180: 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69  nor_str) {....mi
6190: 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69  nor = strtoul(mi
61a0: 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c  nor_str + 1, NUL
61b0: 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  L, 10);...}..}..
61c0: 09 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72  .retval = (major
61d0: 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72   << 16) | (minor
61e0: 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a   << 8);.#endif..
61f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6200: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
6210: 30 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b  0x%lx", retval);
6220: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
6230: 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52  );.}../* PC/SC R
6240: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
6250: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
6260: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
6270: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6280: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75  onnect_all(int u
6290: 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65  nitialize_all_re
62a0: 61 64 65 72 73 29 3b 0a 20 2a 0a 20 2a 20 41 52  aders);. *. * AR
62b0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 69  GUMENTS. *     i
62c0: 6e 74 20 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c  nt unitialize_al
62d0: 6c 5f 72 65 61 64 65 72 73 20 20 20 20 20 20 46  l_readers      F
62e0: 72 65 65 20 74 68 65 20 22 70 63 73 63 5f 72 65  ree the "pcsc_re
62f0: 61 64 65 72 22 20 6f 62 6a 65 63 74 20 61 73 73  ader" object ass
6300: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 2a 20  ociated with. * 
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 20 20 20 20 20 65 61 63 68 20 73            each s
6330: 6c 6f 74 20 28 62 6f 6f 6c 65 61 6e 29 0a 20 2a  lot (boolean). *
6340: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
6350: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6360: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
6370: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
6380: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61  sconnects from a
6390: 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f  ll cards.. *. */
63a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
63b0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
63c0: 6e 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75 6e 69  nect_all(int uni
63d0: 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64  tialize_all_read
63e0: 65 72 73 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  ers) {..uint32_t
63f0: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
6400: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6410: 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69  led.");...for (i
6420: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
6430: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
6440: 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
6450: 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
6460: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
6470: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6480: 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09  .internal) {....
6490: 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c  /* Skip internal
64a0: 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e   slots */....con
64b0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
64c0: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
64d0: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  dx].pcsc_card_co
64e0: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41  nnected) {....CA
64f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6500: 46 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  F("SCardDisconne
6510: 63 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c  ct(%lu) called",
6520: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
6530: 20 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64   idx);.....SCard
6540: 44 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65  Disconnect(cacke
6550: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
6560: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
6570: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a  AVE_CARD);...}..
6580: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
6590: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b  ts[idx].label) {
65a0: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
65b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
65c0: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
65d0: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d  ots[idx].label =
65e0: 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 69 66   NULL;...}....if
65f0: 20 28 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c   (unitialize_all
6600: 5f 72 65 61 64 65 72 73 20 7c 7c 20 21 63 61 63  _readers || !cac
6610: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
6620: 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28  ctive) {....if (
6630: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6640: 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
6650: 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
6660: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
6670: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 63  _reader);......c
6680: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6690: 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
66a0: 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ULL;....}.....ca
66b0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
66c0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
66d0: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
66e0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
66f0: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
6700: 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 63 61 63  epth = 0;....cac
6710: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
6720: 64 5f 74 79 70 65 5f 68 69 6e 74 20 3d 20 43 41  d_type_hint = CA
6730: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b  CKEY_ID_TYPE_UNK
6740: 4e 4f 57 4e 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  NOWN;...} else {
6750: 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6760: 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
6770: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
6780: 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
6790: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
67a0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
67b0: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a  k = 1;....}...}.
67c0: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
67d0: 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63  idx].pcsc_card_c
67e0: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
67f0: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
6800: 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
6810: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6820: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
6830: 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75   active slot %lu
6840: 20 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22   as being reset"
6850: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
6860: 29 20 69 64 78 29 3b 0a 0a 09 09 09 63 61 63 6b  ) idx);.....cack
6870: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c  ey_slots[idx].sl
6880: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09  ot_reset = 1;...
6890: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
68a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
68b0: 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72  rning");...retur
68c0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
68d0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
68e0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
68f0: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
6900: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
6910: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
6920: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
6930: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
6940: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
6950: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
6960: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
6970: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
6980: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
6990: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
69a0: 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74  ction connects t
69b0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
69c0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61  ection Manager a
69d0: 6e 64 20 75 70 64 61 74 65 73 20 74 68 65 0a 20  nd updates the. 
69e0: 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e  *     global han
69f0: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
6a00: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
6a10: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
6a20: 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20  t(void) {..LONG 
6a30: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6a40: 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41  t_ret;.#ifdef HA
6a50: 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43  VE_SCARDISVALIDC
6a60: 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61  ONTEXT..LONG sca
6a70: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a  rd_isvalid_ret;.
6a80: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
6a90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6aa0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
6ab0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6ac0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  e == NULL) {...c
6ad0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6ae0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  e = malloc(sizeo
6af0: 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f(*cackey_pcsc_h
6b00: 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63  andle));...if (c
6b10: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6b20: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
6b30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6b40: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c  NTF("Call to mal
6b50: 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65  loc() failed, re
6b60: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6b70: 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  re");.....cackey
6b80: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6b90: 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09 09 72 65  t_all(0);.....re
6ba0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6bb0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
6bc0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6bd0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
6be0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
6bf0: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
6c00: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6c10: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
6c20: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
6c30: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
6c40: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
6c50: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6c60: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
6c70: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
6c80: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
6c90: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
6ca0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
6cb0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
6cc0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
6cd0: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
6ce0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6cf0: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
6d00: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
6d10: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
6d20: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6d30: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
6d40: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6d50: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
6d60: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6d70: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6d80: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
6d90: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
6da0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 30 29  isconnect_all(0)
6db0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
6dc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6dd0: 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66  IC);...}..}..#if
6de0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
6df0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41  VALIDCONTEXT..CA
6e00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6e10: 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43  F("SCardIsValidC
6e20: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6e30: 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69  );..scard_isvali
6e40: 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56  d_ret = SCardIsV
6e50: 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63  alidContext(*cac
6e60: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6e70: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76  ;..if (scard_isv
6e80: 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52  alid_ret != SCAR
6e90: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
6ea0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6eb0: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73  INTF("Handle has
6ec0: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20   become invalid 
6ed0: 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e  (SCardIsValidCon
6ee0: 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20  text = %s/%li), 
6ef0: 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74  trying to re-est
6f00: 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b  ablish...", CACK
6f10: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
6f20: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
6f30: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29  ard_isvalid_ret)
6f40: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69  , (long) scard_i
6f50: 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09  svalid_ret);....
6f60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6f70: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c  NTF("SCardEstabl
6f80: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  ishContext() cal
6f90: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65  led");...scard_e
6fa0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  st_context_ret =
6fb0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
6fc0: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f  ontext(SCARD_SCO
6fd0: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c  PE_SYSTEM, NULL,
6fe0: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63   NULL, cackey_pc
6ff0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66  sc_handle);...if
7000: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74   (scard_est_cont
7010: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
7020: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7030: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7040: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43  INTF("Call to SC
7050: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
7060: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75  ext failed (retu
7070: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65  rned %s/%li), re
7080: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7090: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  re", CACKEY_DEBU
70a0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
70b0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74  TO_STR(scard_est
70c0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28  _context_ret), (
70d0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f  long) scard_est_
70e0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09  context_ret);...
70f0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
7100: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63  sc_handle);....c
7110: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
7120: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61  e = NULL;.....ca
7130: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
7140: 6e 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09  nnect_all(0);...
7150: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7160: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7170: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
7180: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
7190: 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d  dle has been re-
71a0: 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09  established");..
71b0: 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  }.#endif...CACKE
71c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
71d0: 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e  Sucessfully conn
71e0: 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20  ected to PC/SC, 
71f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  returning in suc
7200: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e  cess");...return
7210: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
7220: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
7230: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
7240: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
7250: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
7260: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
7270: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
7280: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
7290: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
72a0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
72b0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
72c0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
72d0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
72e0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
72f0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
7300: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
7310: 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50  nects from the P
7320: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
7330: 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  manager and upda
7340: 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67  tes. *     the g
7350: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
7360: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
7370: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
7380: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f  sc_disconnect(vo
7390: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72  id) {..LONG scar
73a0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
73b0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
73c0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
73d0: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
73e0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
73f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
7400: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
7410: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
7420: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  rel_context_ret 
7430: 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f  = SCardReleaseCo
7440: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63  ntext(*cackey_pc
7450: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66  sc_handle);...if
7460: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
7470: 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63  ndle) {...free(c
7480: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
7490: 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70  e);.....cackey_p
74a0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
74b0: 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  L;..}...if (scar
74c0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
74d0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
74e0: 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e  CESS) {...return
74f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
7500: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 63 61  ENERIC);..}...ca
7510: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
7520: 6e 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09  nnect_all(0);...
7530: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7540: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
7550: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
7560: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d     void cackey_m
7570: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
7580: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7590: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
75a0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
75b0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
75c0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
75d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
75e0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
75f0: 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c  ction marks a sl
7600: 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65  ot has having be
7610: 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74  en reset, to lat
7620: 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  er be cleaned up
7630: 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70  .. *     Cleanup
7640: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
7650: 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69  en a PKCS#11 cli
7660: 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64  ent calls C_Find
7670: 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a  ObjectsInit.. *.
7680: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
7690: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
76a0: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61  _reset(struct ca
76b0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
76c0: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
76d0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
76e0: 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
76f0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
7700: 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 69 66   num_certs;...if
7710: 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
7720: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
7730: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7740: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
7750: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73  ...if (slot->pcs
7760: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
7770: 29 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f  ) {...SCardDisco
7780: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7790: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
77a0: 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73  VE_CARD);..}...s
77b0: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20  lot->slot_reset 
77c0: 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63  = 1;..slot->pcsc
77d0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
77e0: 3d 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  = 0;..if (cackey
77f0: 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
7800: 4e 55 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e  NULL) {...slot->
7810: 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
7820: 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
7830: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c  ;..} else {...sl
7840: 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot->token_flags 
7850: 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  = 0;..}...return
7860: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7870: 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20  SIS. *     LONG 
7880: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7890: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
78a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
78b0: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
78c0: 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41  otocol);. *. * A
78d0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
78e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
78f0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
7900: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
7910: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
7920: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7930: 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20  otocol. *       
7940: 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74    Protocol to at
7950: 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20  tempt first. *. 
7960: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7970: 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e  *     The return
7980: 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72   value from SCar
7990: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a  dReconnect(). *.
79a0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
79b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
79c0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
79d0: 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  d SCardReconnect
79e0: 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65  (). *. *     The
79f0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7a00: 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  ) function call 
7a10: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66  will be called f
7a20: 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a  irst with the. *
7a30: 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64       dwPreferred
7a40: 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65  Protocols of "de
7a50: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e  fault_protocol".
7a60: 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72    If that call r
7a70: 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43  eturns. *     SC
7a80: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7a90: 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77  ATCH try again w
7aa0: 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f  ith a protocol o
7ab0: 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69  f T=0, and faili
7ac0: 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54  ng. *     that T
7ad0: 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  =1.. *. */.stati
7ae0: 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65  c LONG cackey_re
7af0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
7b00: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7b10: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66  *slot, DWORD def
7b20: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b  ault_protocol) {
7b30: 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64  ..DWORD selected
7b40: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47  _protocol;..LONG
7b50: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7b60: 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  ...selected_prot
7b70: 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72  ocol = 0;...scar
7b80: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7b90: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7ba0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7bb0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7bc0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7bd0: 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  l, SCARD_RESET_C
7be0: 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70  ARD, &selected_p
7bf0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28  rotocol);...if (
7c00: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7c10: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7c20: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41  MISMATCH) {...CA
7c30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7c40: 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  F("SCardReconnec
7c50: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7c60: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7c70: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
7c80: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63   just T=0")...sc
7c90: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7ca0: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7cb0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7cc0: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7cd0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7ce0: 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T0, SCARD_RESE
7cf0: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65  T_CARD, &selecte
7d00: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09  d_protocol);....
7d10: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7d20: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7d30: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7d40: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7d50: 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63  PRINTF("SCardRec
7d60: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7d70: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7d80: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7d90: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7da0: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7db0: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7dc0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7dd0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7de0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7df0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52  ROTOCOL_T1, SCAR
7e00: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
7e10: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7e20: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
7e30: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7e40: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7e50: 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f  S) {...slot->pro
7e60: 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64  tocol = selected
7e70: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09  _protocol;..}...
7e80: 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e  return(scard_con
7e90: 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n_ret);.}../*. *
7ea0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7eb0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7ec0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7ed0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7ee0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
7ef0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
7f00: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
7f10: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
7f20: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
7f30: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
7f40: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7f50: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7f60: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7f70: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7f80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7f90: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7fa0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7fb0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
7fc0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7fd0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7fe0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7ff0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8000: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
8010: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
8020: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
8030: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
8040: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8050: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8060: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
8070: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
8080: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
8090: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
80a0: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
80b0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
80c0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
80d0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
80e0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
80f0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
8100: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
8110: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
8120: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
8130: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
8140: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8150: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
8160: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
8170: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
8180: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
8190: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
81a0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
81b0: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
81c0: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
81d0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
81e0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
81f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8200: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
8210: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
8220: 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20  d for slot %p", 
8230: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8240: 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72  r, slot);...scar
8250: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
8260: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
8270: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
8280: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8290: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
82a0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
82b0: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
82c0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
82d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
82e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66  protocol);....if
82f0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8300: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8310: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8320: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8330: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
8340: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
8350: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
8360: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
8370: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09  h just T=0")....
8380: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8390: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
83a0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
83b0: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
83c0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
83d0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
83e0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c  PROTOCOL_T0, &sl
83f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
8400: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
8410: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8420: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8430: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8440: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8450: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8460: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8470: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8480: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
8490: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
84a0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
84b0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
84c0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
84d0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
84e0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
84f0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8500: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
8510: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8520: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
8530: 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  .}...}....if (sc
8540: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
8550: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
8560: 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  D_CARD) {....CAC
8570: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8580: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
8590: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
85a0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
85b0: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63  , trying to re-c
85c0: 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09  onnect...");....
85d0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
85e0: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
85f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
8600: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8610: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8620: 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44  RE_DIRECT, SCARD
8630: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
8640: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
8650: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
8660: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
8670: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8680: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8690: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
86a0: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
86b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
86c0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
86d0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
86e0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
86f0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
8700: 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f  0").....scard_co
8710: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8720: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
8730: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
8740: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
8750: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
8760: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8770: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
8780: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8790: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
87a0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
87b0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
87c0: 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43  ATCH) {......CAC
87d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
87e0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
87f0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
8800: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8810: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
8820: 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63  st T=1")......sc
8830: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8840: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8850: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
8860: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8870: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
8880: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
8890: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
88a0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
88b0: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09  otocol);.....}..
88c0: 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f  ..}.....scard_co
88d0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
88e0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
88f0: 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a  lot, protocol);.
8900: 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
8910: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
8920: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 29  RD_E_NO_SERVICE)
8930: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8940: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
8950: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
8960: 65 64 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45  ed SCARD_E_NO_SE
8970: 52 56 49 43 45 20 2d 2d 20 77 68 69 63 68 20 63  RVICE -- which c
8980: 6f 75 6c 64 20 6d 65 61 6e 20 6f 75 72 20 68 61  ould mean our ha
8990: 6e 64 6c 65 20 69 73 20 69 6e 76 61 6c 69 64 2c  ndle is invalid,
89a0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 72 65 63   will try to rec
89b0: 6f 6e 6e 65 63 74 20 74 6f 20 50 43 2f 53 43 20  onnect to PC/SC 
89c0: 73 65 72 76 69 63 65 22 29 3b 0a 0a 09 09 09 63  service");.....c
89d0: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
89e0: 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63  nnect();.....cac
89f0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
8a00: 28 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d  ();.....cackey_m
8a10: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
8a20: 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  lot);.....return
8a30: 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f  (cackey_connect_
8a40: 63 61 72 64 28 73 6c 6f 74 29 29 3b 0a 09 09 7d  card(slot));...}
8a50: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8a60: 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  nn_ret != SCARD_
8a70: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
8a80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8a90: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
8aa0: 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20  to card failed, 
8ab0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
8ac0: 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65  lure (SCardConne
8ad0: 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c  ct() = %s/%li)",
8ae0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
8af0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
8b00: 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  TR(scard_conn_re
8b10: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
8b20: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09  _conn_ret);.....
8b30: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8b40: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8b50: 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63  .}....slot->pcsc
8b60: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
8b70: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 1;...slot->tra
8b80: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8b90: 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e   0;...slot->tran
8ba0: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
8bb0: 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74  lock = 0;...slot
8bc0: 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
8bd0: 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43 41 43 4b  tocol;..}...CACK
8be0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8bf0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
8c00: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72  ccess");...retur
8c10: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
8c20: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
8c30: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
8c40: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8c50: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8c60: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8c70: 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a  slot *slot);. *.
8c80: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
8c90: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
8ca0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
8cb0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
8cc0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
8cd0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
8ce0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
8cf0: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
8d00: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
8d10: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8d20: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
8d30: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
8d40: 20 20 20 20 54 68 65 20 74 72 61 6e 73 61 63 74      The transact
8d50: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65  ion should be te
8d60: 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22  rminated using "
8d70: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
8d80: 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73  action". *. */.s
8d90: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
8da0: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
8db0: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8dc0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8dd0: 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65  ot) {..cackey_re
8de0: 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65  t cackey_conn_re
8df0: 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74  t;..LONG scard_t
8e00: 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  rans_ret;...CACK
8e10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8e20: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61  "Called.");...ca
8e30: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  ckey_conn_ret = 
8e40: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
8e50: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
8e60: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
8e70: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
8e80: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
8e90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
8ea0: 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20  able to connect 
8eb0: 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
8ec0: 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a  ng in error");..
8ed0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8ee0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8ef0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8f00: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b  saction_depth++;
8f10: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8f20: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
8f30: 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61   1 && !slot->tra
8f40: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8f50: 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45  _lock) {...CACKE
8f60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8f70: 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61  Already in a tra
8f80: 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72  nsaction, perfor
8f90: 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28  ming no action (
8fa0: 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22  new depth = %i)"
8fb0: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  , slot->transact
8fc0: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72  ion_depth);....r
8fd0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8fe0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c  C_S_OK);..}...sl
8ff0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9000: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
9010: 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  ;...scard_trans_
9020: 72 65 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e  ret = SCardBegin
9030: 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  Transaction(slot
9040: 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69  ->pcsc_card);..i
9050: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
9060: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
9070: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
9080: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9090: 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20  Unable to begin 
90a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
90b0: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
90c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
90d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
90e0: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
90f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
9100: 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e  ucessfully began
9110: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
9120: 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74  slot (%s)", slot
9130: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ->pcsc_reader);.
9140: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9150: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
9160: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9170: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
9180: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
9190: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
91a0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
91b0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
91c0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
91d0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
91e0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
91f0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
9200: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
9210: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
9220: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
9230: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
9240: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9250: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
9260: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
9270: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
9280: 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  nction requires 
9290: 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  "cackey_begin_tr
92a0: 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65  ansaction" to be
92b0: 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a   called first. *
92c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
92d0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e  ey_ret cackey_en
92e0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  d_transaction(st
92f0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9300: 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20   *slot) {..LONG 
9310: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b  scard_trans_ret;
9320: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9330: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
9340: 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e  );...if (!slot->
9350: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
9360: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
9370: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
9380: 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63  rd is not connec
9390: 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65  ted, unable to e
93a0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  nd transaction o
93b0: 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69 66 20  n card");....if 
93c0: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
93d0: 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
93e0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
93f0: 50 52 49 4e 54 46 28 22 44 65 63 72 65 61 73 69  PRINTF("Decreasi
9400: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  ng transaction d
9410: 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e 67 20  epth and asking 
9420: 66 6f 72 20 61 20 68 61 72 64 77 61 72 65 20 6c  for a hardware l
9430: 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  ock on the next 
9440: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
9450: 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68  n (current depth
9460: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
9470: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9480: 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61  );.....slot->tra
9490: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
94a0: 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  ;.....if (slot->
94b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
94c0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f  h > 0) {.....slo
94d0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
94e0: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
94f0: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
9500: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9510: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
9520: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
9530: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20  action_depth == 
9540: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
9550: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d  BUG_PRINTF("Term
9560: 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61  inating a transa
9570: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ction that has n
9580: 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09  ot begun!");....
9590: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
95a0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
95b0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
95c0: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a  ction_depth--;..
95d0: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
95e0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
95f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9600: 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73  UG_PRINTF("Trans
9610: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e  actions still in
9620: 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74   progress, not t
9630: 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61  erminating on-ca
9640: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28  rd Transaction (
9650: 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20  current depth = 
9660: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
9670: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
9680: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9690: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
96a0: 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  ..scard_trans_re
96b0: 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e  t = SCardEndTran
96c0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63  saction(slot->pc
96d0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
96e0: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20  EAVE_CARD);..if 
96f0: 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  (scard_trans_ret
9700: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
9710: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
9720: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
9730: 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e  able to end tran
9740: 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69  saction, returni
9750: 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a  ng in error");..
9760: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9770: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
9780: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
9790: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
97a0: 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65  sfully terminate
97b0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
97c0: 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f   slot (%s)", slo
97d0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t->pcsc_reader);
97e0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
97f0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9800: 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65 64 20  /* APDU Related 
9810: 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a  Functions */./*.
9820: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
9830: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
9840: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
9850: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
9860: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
9870: 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e  d char class, un
9880: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
9890: 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65  ruction, unsigne
98a0: 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67  d char p1, unsig
98b0: 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73  ned char p2, uns
98c0: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75  igned char lc, u
98d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
98e0: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ta, unsigned cha
98f0: 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  r le, uint16_t *
9900: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
9910: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
9920: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
9930: 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  ata_len);. *. * 
9940: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
9950: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9960: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
9970: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
9980: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
9990: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
99a0: 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20  lass. *         
99b0: 41 50 44 55 20 43 6c 61 73 73 20 28 47 53 43 49  APDU Class (GSCI
99c0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20  S_CLASS_ISO7816 
99d0: 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  or GSCIS_CLASS_G
99e0: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20  LOBAL_PLATFORM. 
99f0: 2a 20 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c  *         usuall
9a00: 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20  y), (CLA). *. * 
9a10: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9a20: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a  r instruction. *
9a30: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 49 6e           APDU In
9a40: 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a  struction (INS).
9a50: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9a60: 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20  ed char p1. *   
9a70: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
9a80: 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20  eter 1 (P1). *. 
9a90: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9aa0: 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20  har p2. *       
9ab0: 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72    APDU Parameter
9ac0: 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20   2 (P2). *. *   
9ad0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9ae0: 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  lc. *         AP
9af0: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e  DU Length of Con
9b00: 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69  tent (Lc) -- thi
9b10: 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  s is the length 
9b20: 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20  of "data". *    
9b30: 20 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20       parameter. 
9b40: 20 49 66 20 22 64 61 74 61 22 20 69 73 20 73 70   If "data" is sp
9b50: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9b60: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
9b70: 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  will. *         
9b80: 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20  be ignored.. *. 
9b90: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9ba0: 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20  har *data. *    
9bb0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
9bc0: 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20  buffer to send. 
9bd0: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c   It should be "L
9be0: 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20  c" bytes long.  
9bf0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70  If. *         sp
9c00: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9c10: 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62   "Lc" will not b
9c20: 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73  e sent, and this
9c30: 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a   buffer will be.
9c40: 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72   *         ignor
9c50: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
9c60: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20  signed char le. 
9c70: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c  *         APDU L
9c80: 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74 61  ength of Expecta
9c90: 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69  tion (Le) -- thi
9ca0: 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  s is the length 
9cb0: 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  of the. *       
9cc0: 20 20 65 78 70 65 63 74 65 64 20 72 65 70 6c 79    expected reply
9cd0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
9ce0: 65 63 69 66 69 65 64 20 61 73 20 30 20 74 68 65  ecified as 0 the
9cf0: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a  n it will not. *
9d00: 20 20 20 20 20 20 20 20 20 62 65 20 73 65 6e 74           be sent
9d10: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74  .. *. *     uint
9d20: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20  16_t *respcode. 
9d30: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
9d40: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
9d50: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
9d60: 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68  nse code.  If th
9d70: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
9d80: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
9d90: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
9da0: 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69   code will be di
9db0: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20  scarded.. *. *  
9dc0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9dd0: 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20   *respdata. *   
9de0: 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e        [OUT] Poin
9df0: 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f  ter to storage o
9e00: 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20  f APDU response 
9e10: 64 61 74 61 2e 20 20 49 66 20 74 68 69 73 20 69  data.  If this i
9e20: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65  s. *         spe
9e30: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
9e40: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74  the response dat
9e50: 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72  a will be discar
9e60: 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ded.  If. *     
9e70: 20 20 20 20 74 68 65 20 22 72 65 73 70 64 61 74      the "respdat
9e80: 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72  a_len" parameter
9e90: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
9ea0: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66   NULL, this buff
9eb0: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69  er. *         wi
9ec0: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9ed0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  d.. *. *     siz
9ee0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
9ef0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e  n. *         [IN
9f00: 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69  , OUT] Pointer i
9f10: 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69  nitialing contai
9f20: 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ning the size of
9f30: 20 74 68 65 20 22 72 65 73 70 64 61 74 61 22 0a   the "respdata".
9f40: 20 2a 20 20 20 20 20 20 20 20 20 62 75 66 66 65   *         buffe
9f50: 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75 72  r.  Before retur
9f60: 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65  ning, the pointe
9f70: 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70  d to value is up
9f80: 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20  dated to the. * 
9f90: 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f          number o
9fa0: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
9fb0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 20  to the buffer.  
9fc0: 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69  If this is speci
9fd0: 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20  fied as. *      
9fe0: 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c     NULL, it will
9ff0: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c   not be updated,
a000: 20 61 6e 64 20 22 72 65 73 70 64 61 74 61 22 20   and "respdata" 
a010: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
a020: 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20  causing. *      
a030: 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20     the response 
a040: 64 61 74 61 20 74 6f 20 62 65 20 64 69 73 63 61  data to be disca
a050: 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55  rded.. *. * RETU
a060: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
a070: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
a080: 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75             On su
a090: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
a0a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a0b0: 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72  IC      On error
a0c0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
a0d0: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
a0e0: 54 20 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e  T  If the sendin
a0f0: 67 20 66 61 69 6c 65 64 20 62 65 63 61 75 73 65  g failed because
a100: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a   the token is. *
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 61 62 73 65 6e 74 0a 20 2a 20 20 20 20 20 43 41  absent. *     CA
a140: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
a150: 59 20 20 20 20 20 20 20 20 49 66 20 73 6f 6d 65  Y        If some
a160: 74 68 69 6e 67 20 74 68 61 74 20 6c 6f 6f 6b 73  thing that looks
a170: 20 72 65 74 72 79 27 61 62 6c 65 20 77 65 6e 74   retry'able went
a180: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 77 72 6f 6e 67 20 2d 2d 20 74 72 79 20     wrong -- try 
a1b0: 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
a1c0: 63 74 69 6f 6e 20 6f 76 65 72 0a 20 2a 20 20 20  ction over. *   
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67 61               aga
a1f0: 69 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  in. *. * NOTES. 
a200: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
a210: 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74  ion will connect
a220: 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f   to the PC/SC Co
a230: 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72  nnection Manager
a240: 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b   via. *     cack
a250: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
a260: 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a  ) if needed.. *.
a270: 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63   *     It will c
a280: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61  onnect to the ca
a290: 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65 72  rd in the reader
a2a0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
a2b0: 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65   slot. *     spe
a2c0: 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c  cified.  It will
a2d0: 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68   reconnect to th
a2e0: 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63 6f  e card if the co
a2f0: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20  nnection. *     
a300: 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a  goes away.. *. *
a310: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
a320: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
a330: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
a340: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
a350: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
a360: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
a370: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
a380: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
a390: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
a3a0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  2, unsigned int 
a3b0: 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  lc, unsigned cha
a3c0: 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65  r *data, unsigne
a3d0: 64 20 69 6e 74 20 6c 65 2c 20 75 69 6e 74 31 36  d int le, uint16
a3e0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
a3f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
a400: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
a410: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
a420: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63  uint8_t major_rc
a430: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a  , minor_rc;..siz
a440: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  e_t bytes_to_cop
a450: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  y, tmp_respdata_
a460: 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49  len;..LPCSCARD_I
a470: 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e  O_REQUEST pioSen
a480: 64 50 63 69 3b 0a 09 53 43 41 52 44 5f 49 4f 5f  dPci;..SCARD_IO_
a490: 52 45 51 55 45 53 54 20 70 69 6f 52 65 63 76 50  REQUEST pioRecvP
a4a0: 63 69 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f  ci;..DWORD xmit_
a4b0: 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  len, recv_len;..
a4c0: 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f  LONG scard_xmit_
a4d0: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
a4e0: 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69  n_ret;..BYTE xmi
a4f0: 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63  t_buf[1024], rec
a500: 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e  v_buf[1024];..in
a510: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
a520: 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70  et, pcsc_getresp
a530: 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  _ret;..int idx;.
a540: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a550: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
a560: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b  ;...if (!slot) {
a570: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a580: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
a590: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22  slot specified."
a5a0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a5b0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a5c0: 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  IC);..}...if (re
a5d0: 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73  spcode) {...*res
a5e0: 70 63 6f 64 65 20 3d 20 30 78 66 66 66 66 3b 0a  pcode = 0xffff;.
a5f0: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
a600: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
a610: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
a620: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
a630: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
a640: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
a650: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a660: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
a670: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
a680: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
a690: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
a6a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
a6b0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
a6c0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  ./* Determine wh
a6d0: 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20  ich protocol to 
a6e0: 73 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73  send using */..s
a6f0: 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f  witch (slot->pro
a700: 74 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20  tocol) {...case 
a710: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a720: 30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  0:....CACKEY_DEB
a730: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
a740: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
a750: 67 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a  gram is T=0");..
a760: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
a770: 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09  SCARD_PCI_T0;...
a780: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
a790: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a7a0: 31 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  1:....CACKEY_DEB
a7b0: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
a7c0: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
a7d0: 67 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a  gram is T=1");..
a7e0: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
a7f0: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
a800: 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75  ..break;...defau
a810: 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  lt:....CACKEY_DE
a820: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
a830: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75  lid protocol fou
a840: 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b  nd, aborting.");
a850: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
a860: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
a870: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e  C);..}.../* Tran
a880: 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65  smit */..xmit_le
a890: 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66  n = 0;..xmit_buf
a8a0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63  [xmit_len++] = c
a8b0: 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  lass;..xmit_buf[
a8c0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e  xmit_len++] = in
a8d0: 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74  struction;..xmit
a8e0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a8f0: 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66   = p1;..xmit_buf
a900: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70  [xmit_len++] = p
a910: 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a  2;..if (data) {.
a920: 09 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20  ..if (lc > 255) 
a930: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
a940: 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f  G_PRINTF("CAUTIO
a950: 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20  N!  Using an Lc 
a960: 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35  greater than 255
a970: 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c   is untested.  L
a980: 63 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09  c = %u", lc);...
a990: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a9a0: 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f  len++] = 0x82; /
a9b0: 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a  * XXX UNTESTED *
a9c0: 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  /....xmit_buf[xm
a9d0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20  it_len++] = (lc 
a9e0: 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a  & 0xff00) >> 8;.
a9f0: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
aa00: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30  _len++] = lc & 0
aa10: 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  xff;...} else {.
aa20: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
aa30: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
aa40: 7d 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
aa50: 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b  ; idx < lc; idx+
aa60: 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  +) {....xmit_buf
aa70: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64  [xmit_len++] = d
aa80: 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d  ata[idx];...}..}
aa90: 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30  ...if (le != 0x0
aaa0: 30 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20  0) {...if (le > 
aab0: 32 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  256) {....CACKEY
aac0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
aad0: 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61  AUTION!  Using a
aae0: 6e 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61  n Le greater tha
aaf0: 6e 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65  n 256 is unteste
ab00: 64 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65  d.  Le = %u", le
ab10: 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  );.....xmit_buf[
ab20: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
ab30: 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53  82; /* XXX UNTES
ab40: 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62  TED */....xmit_b
ab50: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
ab60: 20 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e   (le & 0xff00) >
ab70: 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66  > 8;....xmit_buf
ab80: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
ab90: 65 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c  e & 0xff;...} el
aba0: 73 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36  se if (le == 256
abb0: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
abc0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
abd0: 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  00;...} else {..
abe0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
abf0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d  len++] = le;...}
ac00: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53  ..}.../* Begin S
ac10: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
ac20: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
ac30: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
ac40: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63  n(slot);...if (c
ac50: 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c  lass == GSCIS_CL
ac60: 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 28  ASS_ISO7816 && (
ac70: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47  instruction == G
ac80: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
ac90: 59 20 7c 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e  Y || instruction
aca0: 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f   == GSCIS_INSTR_
acb0: 43 48 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45  CHANGE_REFERENCE
acc0: 29 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29  ) && p1 == 0x00)
acd0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
ace0: 47 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e  G_PRINTF("Sendin
acf0: 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72  g APDU: <<censor
ad00: 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20  ed>>");..} else 
ad10: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
ad20: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69  _PRINTBUF("Sendi
ad30: 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f  ng APDU:", xmit_
ad40: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a  buf, xmit_len);.
ad50: 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20  .}...recv_len = 
ad60: 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29  sizeof(recv_buf)
ad70: 3b 0a 09 6d 65 6d 63 70 79 28 26 70 69 6f 52 65  ;..memcpy(&pioRe
ad80: 63 76 50 63 69 2c 20 70 69 6f 53 65 6e 64 50 63  cvPci, pioSendPc
ad90: 69 2c 20 73 69 7a 65 6f 66 28 70 69 6f 52 65 63  i, sizeof(pioRec
ada0: 76 50 63 69 29 29 3b 0a 09 73 63 61 72 64 5f 78  vPci));..scard_x
adb0: 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54  mit_ret = SCardT
adc0: 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63  ransmit(slot->pc
add0: 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64  sc_card, pioSend
ade0: 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  Pci, xmit_buf, x
adf0: 6d 69 74 5f 6c 65 6e 2c 20 26 70 69 6f 52 65 63  mit_len, &pioRec
ae00: 76 50 63 69 2c 20 72 65 63 76 5f 62 75 66 2c 20  vPci, recv_buf, 
ae10: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 43 41  &recv_len);...CA
ae20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ae30: 46 28 22 53 43 61 72 64 54 72 61 6e 73 6d 69 74  F("SCardTransmit
ae40: 28 29 20 63 6f 6d 70 6c 65 74 65 64 20 77 69 74  () completed wit
ae50: 68 20 76 61 6c 75 65 3a 20 25 73 2f 25 6c 78 22  h value: %s/%lx"
ae60: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
ae70: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
ae80: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
ae90: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et), (unsigned l
aea0: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
aeb0: 72 65 74 29 3b 0a 0a 09 69 66 20 28 73 63 61 72  ret);...if (scar
aec0: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
aed0: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
aee0: 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  CTED) {...CACKEY
aef0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
af00: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
af10: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
af20: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
af30: 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20  /%lx), will ask 
af40: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
af50: 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20 72   to retry (not r
af60: 65 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e 2e  esetting card)..
af70: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
af80: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
af90: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
afa0: 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64  _ret), (unsigned
afb0: 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69   long) scard_xmi
afc0: 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 45 6e  t_ret);..../* En
afd0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
afe0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
aff0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b000: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 63 61  ion(slot);....ca
b010: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
b020: 61 72 64 28 73 6c 6f 74 2c 20 73 6c 6f 74 2d 3e  ard(slot, slot->
b030: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 72 65  protocol);....re
b040: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b050: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09  _E_RETRY);..}...
b060: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
b070: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f  et == SCARD_E_NO
b080: 5f 53 45 52 56 49 43 45 29 20 7b 0a 09 09 43 41  _SERVICE) {...CA
b090: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b0a0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e  F("Failed to sen
b0b0: 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 2c 20  d APDU to card, 
b0c0: 70 6f 73 73 69 62 6c 79 20 64 75 65 20 74 6f 20  possibly due to 
b0d0: 50 43 2f 53 43 20 68 61 6e 64 6c 65 20 62 65 69  PC/SC handle bei
b0e0: 6e 67 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72  ng invalid (SCar
b0f0: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
b100: 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20  /%lx), will ask 
b110: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
b120: 20 74 6f 20 72 65 74 72 79 2e 2e 2e 22 2c 20 43   to retry...", C
b130: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b140: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
b150: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
b160: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b170: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
b180: 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  );....cackey_mar
b190: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
b1a0: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
b1b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
b1c0: 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  Y);..}...if (sca
b1d0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
b1e0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
b1f0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
b200: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
b210: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
b220: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
b230: 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22  mit() = %s/%lx)"
b240: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
b250: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
b260: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
b270: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et), (unsigned l
b280: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
b290: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
b2a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
b2b0: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61  rking slot as ha
b2c0: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22  ving been reset"
b2d0: 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  );...cackey_mark
b2e0: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
b2f0: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
b300: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52  xmit_ret == SCAR
b310: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20  D_W_RESET_CARD) 
b320: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
b330: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
b340: 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65  required, please
b350: 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09   hold...");.....
b360: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
b370: 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
b380: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53  ect_card(slot, S
b390: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
b3a0: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
b3b0: 4c 5f 54 31 29 3b 0a 0a 09 09 09 69 66 20 28 73  L_T1);.....if (s
b3c0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
b3d0: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
b3e0: 53 53 29 20 7b 0a 09 09 09 09 73 77 69 74 63 68  SS) {.....switch
b3f0: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
b400: 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43  ) {......case SC
b410: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
b420: 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63  .......pioSendPc
b430: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
b440: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
b450: 09 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f  .....case SCARD_
b460: 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09  PROTOCOL_T1:....
b470: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
b480: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
b490: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
b4a0: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09  .default:.......
b4b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b4c0: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
b4d0: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74  tocol found, but
b4e0: 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20   too late to do 
b4f0: 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69  anything about i
b500: 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20  t now -- trying 
b510: 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09  anyway.");......
b520: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
b530: 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
b540: 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
b550: 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
b560: 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
b570: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
b580: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
b590: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
b5a0: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
b5b0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
b5c0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
b5d0: 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
b5e0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
b5f0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
b600: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
b610: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
b620: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
b630: 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a  ransmitting");..
b640: 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  ....recv_len = s
b650: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
b660: 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 70 69 6f  .....memcpy(&pio
b670: 52 65 63 76 50 63 69 2c 20 70 69 6f 53 65 6e 64  RecvPci, pioSend
b680: 50 63 69 2c 20 73 69 7a 65 6f 66 28 70 69 6f 52  Pci, sizeof(pioR
b690: 65 63 76 50 63 69 29 29 3b 0a 09 09 09 09 73 63  ecvPci));.....sc
b6a0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
b6b0: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
b6c0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69  t->pcsc_card, pi
b6d0: 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62  oSendPci, xmit_b
b6e0: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 26 70  uf, xmit_len, &p
b6f0: 69 6f 52 65 63 76 50 63 69 2c 20 72 65 63 76 5f  ioRecvPci, recv_
b700: 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b  buf, &recv_len);
b710: 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f  ......if (scard_
b720: 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52  xmit_ret != SCAR
b730: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
b740: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b750: 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73  _PRINTF("Retrans
b760: 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75  mit failed, retu
b770: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b780: 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63   after disconnec
b790: 74 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53  ting the card (S
b7a0: 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25  CardTransmit = %
b7b0: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
b7c0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
b7d0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
b7e0: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e  _xmit_ret), (lon
b7f0: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
b800: 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44  t);.......SCardD
b810: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
b820: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
b830: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
b840: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
b850: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
b860: 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53  ;......./* End S
b870: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b880: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f  tion */......slo
b890: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
b8a0: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63  epth = 1;......c
b8b0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b8c0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b8d0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b8e0: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
b8f0: 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ENT);.....}....}
b900: 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
b910: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b920: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
b930: 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72  ard");......SCar
b940: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
b950: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
b960: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
b970: 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
b980: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
b990: 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53  0;....../* End S
b9a0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b9b0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  tion */.....slot
b9c0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b9d0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63  pth = 1;.....cac
b9e0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b9f0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  ion(slot);......
ba00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ba10: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
ba20: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
ba30: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
ba40: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
ba50: 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
ba60: 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
ba70: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
ba80: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
ba90: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
baa0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
bab0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
bac0: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f  VE_CARD);....slo
bad0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
bae0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
baf0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
bb00: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
bb10: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
bb20: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
bb30: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
bb40: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
bb50: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
bb60: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
bb70: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
bb80: 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
bb90: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
bba0: 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
bbb0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bbc0: 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64  INTBUF("Returned
bbd0: 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62   Value:", recv_b
bbe0: 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  uf, recv_len);..
bbf0: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
bc00: 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61  2) {.../* Minima
bc10: 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74  l response lengt
bc20: 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65  h is 2 bytes, re
bc30: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
bc40: 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  re */...CACKEY_D
bc50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
bc60: 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ponse too small,
bc70: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
bc80: 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20  ilure (recv_len 
bc90: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
bca0: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
bcb0: 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  n);..../* End Sm
bcc0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
bcd0: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
bce0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
bcf0: 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 53 75 70  slot);..../* Sup
bd00: 70 6c 79 20 61 6e 20 69 6e 76 61 6c 69 64 20 72  ply an invalid r
bd10: 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 2a 2f 0a  esponse code */.
bd20: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
bd30: 7b 0a 09 09 09 2a 72 65 73 70 63 6f 64 65 20 3d  {....*respcode =
bd40: 20 30 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72   0;...}....retur
bd50: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
bd60: 4e 4f 44 41 54 41 29 3b 0a 09 7d 0a 0a 09 2f 2a  NODATA);..}.../*
bd70: 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c   Determine resul
bd80: 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72  t code */..major
bd90: 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72  _rc = recv_buf[r
bda0: 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d  ecv_len - 2];..m
bdb0: 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  inor_rc = recv_b
bdc0: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d  uf[recv_len - 1]
bdd0: 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29  ;..if (respcode)
bde0: 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d   {...*respcode =
bdf0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29   (major_rc << 8)
be00: 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a   | minor_rc;..}.
be10: 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73  ../* Adjust mess
be20: 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72  age buffer */..r
be30: 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09  ecv_len -= 2;...
be40: 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20  /* Add bytes to 
be50: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
be60: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
be70: 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70  n = 0;..if (resp
be80: 64 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61  data && respdata
be90: 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65  _len) {...tmp_re
bea0: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65  spdata_len = *re
beb0: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62  spdata_len;....b
bec0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a  ytes_to_copy = *
bed0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
bee0: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
bef0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
bf00: 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
bf10: 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09  y = recv_len;...
bf20: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
bf30: 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e  G_PRINTF("Copyin
bf40: 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74  g %lu bytes to t
bf50: 68 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27  he buffer (recv'
bf60: 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74  d %lu bytes, but
bf70: 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20   only %lu bytes 
bf80: 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66  left in our buff
bf90: 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  er)", (unsigned 
bfa0: 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63  long) bytes_to_c
bfb0: 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  opy, (unsigned l
bfc0: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28  ong) recv_len, (
bfd0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
bfe0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a  respdata_len);..
bff0: 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74  ..memcpy(respdat
c000: 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74  a, recv_buf, byt
c010: 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72  es_to_copy);...r
c020: 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73  espdata += bytes
c030: 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65  _to_copy;....*re
c040: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74  spdata_len = byt
c050: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d  es_to_copy;...tm
c060: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d  p_respdata_len -
c070: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
c080: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
c090: 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20  (recv_len != 0) 
c0a0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
c0b0: 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69  G_PRINTF("Throwi
c0c0: 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65  ng away %lu byte
c0d0: 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75  s, nowhere to pu
c0e0: 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67  t them!", (unsig
c0f0: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
c100: 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  en);...}..}...if
c110: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
c120: 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65  61) {.../* We ne
c130: 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09  ed to READ */...
c140: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c150: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
c160: 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09   required");....
c170: 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20  if (minor_rc == 
c180: 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  0x00) {....minor
c190: 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  _rc = CACKEY_APD
c1a0: 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63  U_MTU;...}....pc
c1b0: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
c1c0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
c1d0: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
c1e0: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
c1f0: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53  IS_INSTR_GET_RES
c200: 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30  PONSE, 0x00, 0x0
c210: 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f  0, 0, NULL, mino
c220: 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20  r_rc, respcode, 
c230: 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72  respdata, &tmp_r
c240: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
c250: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
c260: 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  p_ret != CACKEY_
c270: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
c280: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c290: 4e 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64  NTF("Buffer read
c2a0: 20 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e   failed!  Return
c2b0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
c2c0: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
c2d0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
c2e0: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
c2f0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
c300: 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70  slot);.....if (p
c310: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
c320: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
c330: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65  _RETRY) {.....re
c340: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
c350: 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a  _E_RETRY);....}.
c360: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
c370: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
c380: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
c390: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
c3a0: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b  .*respdata_len +
c3b0: 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  = tmp_respdata_l
c3c0: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e  en;...}..../* En
c3d0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
c3e0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
c3f0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
c400: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41  ion(slot);....CA
c410: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c420: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
c430: 73 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20  success (buffer 
c440: 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29  read complete)")
c450: 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
c460: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
c470: 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
c480: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
c490: 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
c4a0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
c4b0: 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  ;...if (major_rc
c4c0: 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a   == 0x90) {.../*
c4d0: 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41   Success */...CA
c4e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c4f0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
c500: 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72  success (major_r
c510: 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09  c = 0x90)");....
c520: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
c530: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09  SC_S_OK);..}....
c540: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c550: 4e 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e  NTF("APDU Return
c560: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74  ed an error, ret
c570: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c580: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
c590: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
c5a0: 52 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RIC);.}..static 
c5b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
c5c0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
c5d0: 76 5f 74 61 67 28 75 6e 73 69 67 6e 65 64 20 63  v_tag(unsigned c
c5e0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
c5f0: 65 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65 6e 5f  e_t *buffer_len_
c600: 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  p, unsigned char
c610: 20 74 61 67 2c 20 75 6e 73 69 67 6e 65 64 20 63   tag, unsigned c
c620: 68 61 72 20 2a 6f 75 74 62 75 66 66 65 72 2c 20  har *outbuffer, 
c630: 73 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66 66 65  size_t *outbuffe
c640: 72 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e 73 69  r_len_p) {..unsi
c650: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c660: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f 75 74  r_p;..size_t out
c670: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75 66 66  buffer_len, buff
c680: 65 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f 74 20  er_len;..size_t 
c690: 73 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  size;..int idx;.
c6a0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c6b0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
c6c0: 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c  ;...if (buffer_l
c6d0: 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  en_p == NULL) {.
c6e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c6f0: 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c 65  RINTF("buffer_le
c700: 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65  n_p is NULL.  Re
c710: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c720: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
c730: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
c740: 28 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  (outbuffer_len_p
c750: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
c760: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c770: 46 28 22 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  F("outbuffer_len
c780: 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52 65 74  _p is NULL.  Ret
c790: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
c7a0: 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  e.");....return(
c7b0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66  NULL);..}...buff
c7c0: 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66  er_len = *outbuf
c7d0: 66 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75 74 62  fer_len_p;..outb
c7e0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74  uffer_len = *out
c7f0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 0a 09  buffer_len_p;...
c800: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c  if (buffer_len <
c810: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
c820: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66  EBUG_PRINTF("buf
c830: 66 65 72 5f 6c 65 6e 20 69 73 20 6c 65 73 73 20  fer_len is less 
c840: 74 68 61 6e 20 32 2c 20 73 6f 20 77 65 20 63 61  than 2, so we ca
c850: 6e 27 74 20 72 65 61 64 20 61 6e 79 20 74 61 67  n't read any tag
c860: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
c870: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
c880: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c890: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66  ..buffer_p = buf
c8a0: 66 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72  fer;..if (buffer
c8b0: 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a  _p[0] != tag) {.
c8c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c8d0: 52 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64  RINTF("Tag found
c8e0: 20 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70   was not tag exp
c8f0: 65 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30  ected.  Tag = %0
c900: 32 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25  2x, Expected = %
c910: 30 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  02x.  Returning 
c920: 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75  in failure.", (u
c930: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66  nsigned int) buf
c940: 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a  fer_p[0], tag);.
c950: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c960: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ..}...buffer_p++
c970: 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b  ;..buffer_len--;
c980: 0a 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70  ...if ((buffer_p
c990: 5b 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30  [0] & 0x80) == 0
c9a0: 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20  x80) {...size = 
c9b0: 30 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66  0;...idx = (buff
c9c0: 65 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b  er_p[0] & 0x7f);
c9d0: 0a 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75  ....if (idx > bu
c9e0: 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43  ffer_len) {....C
c9f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ca00: 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45  TF("Malformed BE
ca10: 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65  R value -- not e
ca20: 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69  nough bytes avai
ca30: 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65  lable to read le
ca40: 6e 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20  ngth (idx = %i, 
ca50: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75  buffer_len = %lu
ca60: 29 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e  )", idx, (unsign
ca70: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
ca80: 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  len);.....return
ca90: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66  (NULL);...}....f
caa0: 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69  or (; idx > 0; i
cab0: 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65  dx--) {....buffe
cac0: 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72  r_p++;....buffer
cad0: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65  _len--;.....size
cae0: 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20   <<= 8;....size 
caf0: 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a  |= buffer_p[0];.
cb00: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
cb10: 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b  size = buffer_p[
cb20: 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f  0];..}...buffer_
cb30: 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  p++;..buffer_len
cb40: 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e  --;...if (size >
cb50: 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20   outbuffer_len) 
cb60: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
cb70: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
cb80: 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75  to copy value bu
cb90: 66 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65  ffer to outbuffe
cba0: 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f  r, not enough ro
cbb0: 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65  om.  Value buffe
cbc0: 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  r length = %lu, 
cbd0: 6f 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74  out buffer lengt
cbe0: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
cbf0: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20  ned long) size, 
cc00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
cc10: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a  outbuffer_len);.
cc20: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
cc30: 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72  ..}...*outbuffer
cc40: 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09  _len_p = size;..
cc50: 69 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b  if (outbuffer) {
cc60: 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66  ...memcpy(outbuf
cc70: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
cc80: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
cc90: 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66   += size;...buff
cca0: 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a  er_len -= size;.
ccb0: 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70  ...*buffer_len_p
ccc0: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
ccd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cce0: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56  RINTBUF("BER-TLV
ccf0: 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62   results:", outb
cd00: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d  uffer, size);..}
cd10: 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76   else {...memmov
cd20: 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  e(buffer, buffer
cd30: 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66  _p, size);...buf
cd40: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
cd50: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cd60: 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c  PRINTBUF("BER-TL
cd70: 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66  V results:", buf
cd80: 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a  fer, size);..}..
cd90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cda0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
cdb0: 69 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a  in success.  Siz
cdc0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f  e of contents fo
cdd0: 72 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c  r tag %02x is %l
cde0: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  u", (unsigned in
cdf0: 74 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65  t) tag, (unsigne
ce00: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
ce10: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70  .return(buffer_p
ce20: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
ce30: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
ce40: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
ce50: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
ce60: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
ce70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
ce80: 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66  fer, size_t buff
ce90: 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  er_len, unsigned
cea0: 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20   char oid[3]);. 
ceb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
cec0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
ced0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
cee0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
cef0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
cf00: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
cf10: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
cf20: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
cf30: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
cf40: 20 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66       size_t buff
cf50: 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  er_len. *       
cf60: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
cf70: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
cf80: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
cf90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64  nsigned char oid
cfa0: 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33  [3]. *         3
cfb0: 2d 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61  -byte OID to rea
cfc0: 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  d. *. *. * RETUR
cfd0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
cfe0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
cff0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
d000: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
d010: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
d020: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
d030: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
d040: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
d050: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
d060: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
d070: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
d080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d090: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75  uffer, size_t bu
d0a0: 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e  ffer_len, unsign
d0b0: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20  ed char oid[3]) 
d0c0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
d0d0: 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20   cmd[] = {0x5C, 
d0e0: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x03, 0x00, 0x00
d0f0: 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e  , 0x00};..unsign
d100: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f  ed char *buffer_
d110: 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  p;..size_t init_
d120: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65  buffer_len, size
d130: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
d140: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
d150: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
d160: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
d170: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75  ed.");...init_bu
d180: 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65  ffer_len = buffe
d190: 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20  r_len;...cmd[2] 
d1a0: 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33  = oid[0];..cmd[3
d1b0: 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64  ] = oid[1];..cmd
d1c0: 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09  [4] = oid[2];...
d1d0: 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61  /* 256 to indica
d1e0: 74 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d  te the largest m
d1f0: 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e  essage size -- n
d200: 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73  ot clear if this
d210: 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20   will work with 
d220: 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  all messages */.
d230: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
d240: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
d250: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
d260: 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30  SO7816, NISTSP80
d270: 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54  0_73_3_INSTR_GET
d280: 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46  _DATA, 0x3F, 0xF
d290: 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  F, sizeof(cmd), 
d2a0: 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63  cmd, 256, &respc
d2b0: 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75  ode, buffer, &bu
d2c0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  ffer_len);...if 
d2d0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
d2e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
d2f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
d300: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
d310: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
d320: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
d330: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  ffer");....retur
d340: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  n(cackey_get_dat
d350: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
d360: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c  init_buffer_len,
d370: 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20   oid));..}...if 
d380: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
d390: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
d3a0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d3b0: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
d3c0: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
d3d0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
d3e0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
d3f0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69  turn(-1);..}..#i
d400: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
d410: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
d420: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
d430: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e  if (buffer_len >
d440: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
d450: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
d460: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
d470: 20 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c   bytes (buffer_l
d480: 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69  en) exceeds maxi
d490: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
d4a0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
d4b0: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66   (max = %li, buf
d4c0: 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  fer_len = %lu)",
d4d0: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
d4e0: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
d4f0: 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72  ned long) buffer
d500: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
d510: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
d520: 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62  f.#endif...if (b
d530: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
d540: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d550: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
d560: 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25   DATA returned %
d570: 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  lu bytes, which 
d580: 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72  is too short for
d590: 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f   a BER-TLV respo
d5a0: 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  nse", (unsigned 
d5b0: 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e  long) buffer_len
d5c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
d5d0: 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75  ;..}...size = bu
d5e0: 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65  ffer_len;..buffe
d5f0: 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
d600: 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
d610: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
d620: 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73  , 0x53, NULL, &s
d630: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66  ize);...if (buff
d640: 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  er_p == NULL) {.
d650: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d660: 52 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64  RINTF("Tag decod
d670: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ing failed, retu
d680: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
d690: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
d6a0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
d6b0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45  BUG_PRINTBUF("GE
d6c0: 54 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20  T DATA result", 
d6d0: 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a  buffer, size);..
d6e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d6f0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
d700: 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64  in success, read
d710: 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e   %lu bytes", (un
d720: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
d730: 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a  e);...return(siz
d740: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  e);.}../*. * SYN
d750: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69  POSIS. *     ssi
d760: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
d770: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
d780: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
d790: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d7a0: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
d7b0: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
d7c0: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
d7d0: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
d7e0: 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  et);. *. * ARGUM
d7f0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
d800: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d810: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
d820: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
d830: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
d840: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
d850: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
d860: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
d870: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
d880: 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20  t count. *      
d890: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
d8a0: 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  es to attempt to
d8b0: 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20   read. *. *     
d8c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
d8d0: 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20  or_v. *         
d8e0: 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66  Select the T-buf
d8f0: 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75  fer (01) or V-bu
d900: 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61  ffer (02) to rea
d910: 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20  d from.  . *. * 
d920: 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69      size_t initi
d930: 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20  al_offset. *    
d940: 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65       Specify the
d950: 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
d960: 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20   the read from. 
d970: 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  *. *. * RETURN V
d980: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73  ALUE. *     This
d990: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d9a0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d9b0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
d9c0: 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72  ead, or -1 on er
d9d0: 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ror.. *. * NOTES
d9e0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
d9f0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
da00: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
da10: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
da20: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
da30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
da40: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
da50: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
da60: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
da70: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
da80: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
da90: 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b  ar *init_buffer;
daa0: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f  ..size_t init_co
dab0: 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  unt;..size_t ini
dac0: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
dad0: 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65  ;...size_t offse
dae0: 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65  t = 0, max_offse
daf0: 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75  t, max_count;..u
db00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64  nsigned char cmd
db10: 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  [2];..uint16_t r
db20: 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65  espcode;..int se
db30: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
db40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
db50: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74  alled.");...init
db60: 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  _buffer = buffer
db70: 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20  ;..init_count = 
db80: 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69  count;..init_ini
db90: 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e  tial_offset = in
dba0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
dbb0: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
dbc0: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
dbd0: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
dbe0: 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21  ;...if (t_or_v !
dbf0: 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d  = 1 && t_or_v !=
dc00: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
dc10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
dc20: 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61  alid T or V para
dc30: 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c  meter specified,
dc40: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
dc50: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
dc60: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64  rn(-1);..}...cmd
dc70: 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09  [0] = t_or_v;...
dc80: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66  while (1) {...if
dc90: 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f   (offset >= max_
dca0: 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43  offset) {....CAC
dcb0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
dcc0: 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61  ("Buffer too sma
dcd0: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68  ll, returning wh
dce0: 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a  at we got...");.
dcf0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
dd00: 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66  ..count = max_of
dd10: 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09  fset - offset;..
dd20: 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78  .if (count > max
dd30: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75  _count) {....cou
dd40: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  nt = max_count;.
dd50: 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20  ..}....cmd[1] = 
dd60: 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72  count;....send_r
dd70: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
dd80: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
dd90: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
dda0: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
ddb0: 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
ddc0: 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  , ((initial_offs
ddd0: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20  et + offset) >> 
dde0: 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74  8) & 0xff, (init
ddf0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
de00: 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a  set) & 0xff, siz
de10: 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30  eof(cmd), cmd, 0
de20: 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  x00, &respcode, 
de30: 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c  buffer + offset,
de40: 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20   &count);....if 
de50: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
de60: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
de70: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
de80: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
de90: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
dea0: 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62   retrying read b
deb0: 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74  uffer");.....ret
dec0: 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f  urn(cackey_read_
ded0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69  buffer(slot, ini
dee0: 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63  t_buffer, init_c
def0: 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e  ount, t_or_v, in
df00: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
df10: 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  t));...}....if (
df20: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
df30: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
df40: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
df50: 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09  == 0x6A86) {....
df60: 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d  .if (max_count =
df70: 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 1) {......brea
df80: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61  k;.....}......ma
df90: 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f  x_count = max_co
dfa0: 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f  unt / 2;......co
dfb0: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
dfc0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dfd0: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e  INTF("cackey_sen
dfe0: 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c  d_apdu() failed,
dff0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
e000: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74  ilure");.....ret
e010: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
e020: 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b  offset += count;
e030: 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  ....if (count < 
e040: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
e050: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e060: 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20  NTF("Short read 
e070: 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63  -- count = %i, c
e080: 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e  md[1] = %i", (in
e090: 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  t) count, (int) 
e0a0: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65  cmd[1]);.....bre
e0b0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  ak;...}..}..#ifd
e0c0: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
e0d0: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
e0e0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
e0f0: 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49   (offset > _POSI
e100: 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
e110: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e120: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63  INTF("Offset exc
e130: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
e140: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
e150: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
e160: 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25   %li, offset = %
e170: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
e180: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
e190: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
e1a0: 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  ffset);....retur
e1b0: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
e1c0: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  if.#endif...CACK
e1d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e1e0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
e1f0: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
e200: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
e210: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
e220: 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74  ...return(offset
e230: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
e240: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
e250: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
e260: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
e270: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
e280: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
e290: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
e2a0: 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a   aid_len);. *. *
e2b0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
e2c0: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
e2d0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
e2e0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
e2f0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
e300: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
e310: 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20  d char *aid. *  
e320: 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f         Buffer co
e330: 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20  ntaining Applet 
e340: 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  ID to select. *.
e350: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69   *     size_t ai
e360: 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  d_len. *        
e370: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
e380: 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41   in the "aid" (A
e390: 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65  pplet ID) parame
e3a0: 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ter. *. * RETURN
e3b0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
e3c0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
e3d0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
e3e0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
e3f0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
e400: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
e410: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
e420: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
e430: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
e440: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
e450: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
e460: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
e470: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73  ned char *aid, s
e480: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b  ize_t aid_len) {
e490: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
e4a0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e4b0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
e4c0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e4d0: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63  _PRINTBUF("Selec
e4e0: 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61  ting applet:", a
e4f0: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09  id, aid_len);...
e500: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
e510: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
e520: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
e530: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
e540: 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53  TR_SELECT, GSCIS
e550: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
e560: 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f  PLET, 0x00, aid_
e570: 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20  len, aid, 0x00, 
e580: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
e590: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
e5a0: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
e5b0: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...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 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
e5e0: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
e5f0: 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29   select applet")
e600: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b  ;....return(cack
e610: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
e620: 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f  (slot, aid, aid_
e630: 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  len));..}...if (
e640: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
e650: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
e660: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e670: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
e680: 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65   open applet, re
e690: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e6a0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e6b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
e6c0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
e6d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e6e0: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
e6f0: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
e700: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e710: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
e720: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
e730: 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63       cackey_pcsc
e740: 5f 69 64 5f 74 79 70 65 20 63 61 63 6b 65 79 5f  _id_type cackey_
e750: 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63  detect_and_selec
e760: 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 74  t_root_applet(st
e770: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e780: 20 2a 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 70   *slot, cackey_p
e790: 63 73 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65  csc_id_type type
e7a0: 5f 68 69 6e 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  _hint);. *. * AR
e7b0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
e7c0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
e7d0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
e7e0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
e7f0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
e800: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73  *     cackey_pcs
e810: 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f 68  c_id_type type_h
e820: 69 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 41  int. *         A
e830: 20 68 69 6e 74 20 61 73 20 74 6f 20 77 68 69 63   hint as to whic
e840: 68 20 74 79 70 65 20 6f 66 20 63 61 72 64 20 6d  h type of card m
e850: 69 67 68 74 20 62 65 20 69 6e 20 74 68 69 73 20  ight be in this 
e860: 73 6c 6f 74 20 28 43 41 43 20 6f 72 20 50 49 56  slot (CAC or PIV
e870: 29 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  ). *. * RETURN V
e880: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
e890: 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 20 20  EY_ID_TYPE_PIV  
e8a0: 20 20 20 20 20 49 66 20 74 68 65 20 63 61 72 64       If the card
e8b0: 20 63 6f 6e 6e 65 63 74 65 64 20 69 73 20 61 20   connected is a 
e8c0: 50 49 56 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  PIV. *     CACKE
e8d0: 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 20 20 20  Y_ID_TYPE_CAC   
e8e0: 20 20 20 20 49 66 20 74 68 65 20 63 61 72 64 20      If the card 
e8f0: 63 6f 6e 6e 65 63 74 65 64 20 69 73 20 61 20 43  connected is a C
e900: 41 43 20 77 69 74 68 20 74 68 65 20 43 43 43 0a  AC with the CCC.
e910: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e930: 61 70 70 6c 65 74 0a 20 2a 20 20 20 20 20 43 41  applet. *     CA
e940: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52  CKEY_ID_TYPE_ERR
e950: 4f 52 20 20 20 20 20 49 66 20 77 65 20 61 72 65  OR     If we are
e960: 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72   unable to deter
e970: 6d 69 6e 65 20 77 68 61 74 20 74 79 70 65 20 6f  mine what type o
e980: 66 20 63 61 72 64 0a 20 2a 20 20 20 20 20 20 20  f card. *       
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 69 73 20 63 6f 6e 6e 65 63         is connec
e9b0: 74 65 64 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ted. *. * NOTES.
e9c0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
e9d0: 74 69 6f 6e 20 72 65 73 65 6c 65 63 74 73 20 74  tion reselects t
e9e0: 68 65 20 22 72 6f 6f 74 22 20 61 70 70 6c 65 74  he "root" applet
e9f0: 2c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  , after this fun
ea00: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a  ction is called.
ea10: 20 2a 20 20 20 20 20 74 68 65 20 75 73 65 72 20   *     the user 
ea20: 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64 20  may be required 
ea30: 74 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e 0a 20  to login again. 
ea40: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
ea50: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
ea60: 20 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61   cackey_detect_a
ea70: 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61  nd_select_root_a
ea80: 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63  pplet(struct cac
ea90: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
eaa0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74  cackey_pcsc_id_t
eab0: 79 70 65 20 74 79 70 65 5f 68 69 6e 74 29 20 7b  ype type_hint) {
eac0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
ead0: 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43  ccc_aid[] = {GSC
eae0: 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20 70 69 76  IS_AID_CCC}, piv
eaf0: 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  _aid[] = {NISTSP
eb00: 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 49 44  800_73_3_PIV_AID
eb10: 7d 3b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  };..cackey_pcsc_
eb20: 69 64 5f 74 79 70 65 20 74 72 79 5f 74 79 70 65  id_type try_type
eb30: 73 5b 32 5d 2c 20 74 72 79 5f 74 79 70 65 3b 0a  s[2], try_type;.
eb40: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  .int send_ret;..
eb50: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
eb60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
eb70: 52 65 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20  Reselecting the 
eb80: 72 6f 6f 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a  root applet");..
eb90: 09 69 66 20 28 74 79 70 65 5f 68 69 6e 74 20 3d  .if (type_hint =
eba0: 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
ebb0: 5f 55 4e 4b 4e 4f 57 4e 29 20 7b 0a 09 09 74 79  _UNKNOWN) {...ty
ebc0: 70 65 5f 68 69 6e 74 20 3d 20 73 6c 6f 74 2d 3e  pe_hint = slot->
ebd0: 69 64 5f 74 79 70 65 5f 68 69 6e 74 3b 0a 09 7d  id_type_hint;..}
ebe0: 0a 0a 09 73 6c 6f 74 2d 3e 69 64 5f 74 79 70 65  ...slot->id_type
ebf0: 5f 68 69 6e 74 20 3d 20 43 41 43 4b 45 59 5f 49  _hint = CACKEY_I
ec00: 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a  D_TYPE_UNKNOWN;.
ec10: 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 5f 68  ..switch (type_h
ec20: 69 6e 74 29 20 7b 0a 09 09 63 61 73 65 20 43 41  int) {...case CA
ec30: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
ec40: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
ec50: 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67  G_PRINTF("Trying
ec60: 20 74 6f 20 72 65 73 65 6c 65 63 74 20 74 68 65   to reselect the
ec70: 20 50 49 56 20 72 6f 6f 74 20 61 70 70 6c 65 74   PIV root applet
ec80: 20 66 69 72 73 74 22 29 3b 0a 0a 09 09 09 74 72   first");.....tr
ec90: 79 5f 74 79 70 65 73 5b 30 5d 20 3d 20 43 41 43  y_types[0] = CAC
eca0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3b  KEY_ID_TYPE_PIV;
ecb0: 0a 09 09 09 74 72 79 5f 74 79 70 65 73 5b 31 5d  ....try_types[1]
ecc0: 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
ecd0: 45 5f 43 41 43 3b 0a 0a 09 09 09 62 72 65 61 6b  E_CAC;.....break
ece0: 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
ecf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ed00: 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20 72  NTF("Trying to r
ed10: 65 73 65 6c 65 63 74 20 74 68 65 20 43 41 43 20  eselect the CAC 
ed20: 43 43 43 20 61 70 70 6c 65 74 20 66 69 72 73 74  CCC applet first
ed30: 22 29 3b 0a 0a 09 09 09 74 72 79 5f 74 79 70 65  ");.....try_type
ed40: 73 5b 30 5d 20 3d 20 43 41 43 4b 45 59 5f 49 44  s[0] = CACKEY_ID
ed50: 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09 09 74 72  _TYPE_CAC;....tr
ed60: 79 5f 74 79 70 65 73 5b 31 5d 20 3d 20 43 41 43  y_types[1] = CAC
ed70: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3b  KEY_ID_TYPE_PIV;
ed80: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
ed90: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
eda0: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 74 72 79  dx < (sizeof(try
edb0: 5f 74 79 70 65 73 29 20 2f 20 73 69 7a 65 6f 66  _types) / sizeof
edc0: 28 74 72 79 5f 74 79 70 65 73 5b 30 5d 29 29 3b  (try_types[0]));
edd0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 74 72 79 5f   idx++) {...try_
ede0: 74 79 70 65 20 3d 20 74 72 79 5f 74 79 70 65 73  type = try_types
edf0: 5b 69 64 78 5d 3b 0a 0a 09 09 73 77 69 74 63 68  [idx];....switch
ee00: 20 28 74 72 79 5f 74 79 70 65 29 20 7b 0a 09 09   (try_type) {...
ee10: 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
ee20: 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 43 41  TYPE_CAC:.....CA
ee30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ee40: 46 28 22 54 72 79 69 6e 67 20 74 6f 20 73 65 6c  F("Trying to sel
ee50: 65 63 74 20 74 68 65 20 43 41 43 20 43 43 43 20  ect the CAC CCC 
ee60: 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 09 09 73  applet");......s
ee70: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
ee80: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
ee90: 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
eea0: 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
eeb0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
eec0: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
eed0: 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
eee0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eef0: 22 54 72 79 69 6e 67 20 74 6f 20 73 65 6c 65 63  "Trying to selec
ef00: 74 20 74 68 65 20 50 49 56 20 72 6f 6f 74 20 61  t the PIV root a
ef10: 70 70 6c 65 74 22 29 3b 0a 0a 09 09 09 09 73 65  pplet");......se
ef20: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
ef30: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
ef40: 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a  ot, piv_aid, siz
ef50: 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 0a  eof(piv_aid));..
ef60: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
ef70: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
ef80: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
ef90: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
efa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
efb0: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
efc0: 74 65 64 20 74 68 65 20 25 73 20 61 70 70 6c 65  ted the %s apple
efd0: 74 20 2d 2d 20 73 65 74 74 69 6e 67 20 74 68 65  t -- setting the
efe0: 20 5c 22 4c 4f 47 49 4e 20 52 45 51 55 49 52 45   \"LOGIN REQUIRE
eff0: 44 5c 22 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  D\" flag on the 
f000: 74 6f 6b 65 6e 22 2c 0a 09 09 09 09 74 72 79 5f  token",.....try_
f010: 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49  type == CACKEY_I
f020: 44 5f 54 59 50 45 5f 43 41 43 20 3f 20 22 43 41  D_TYPE_CAC ? "CA
f030: 43 22 20 3a 20 22 50 49 56 22 0a 09 09 09 29 3b  C" : "PIV"....);
f040: 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e  .....slot->token
f050: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
f060: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09  IN_REQUIRED;....
f070: 09 73 6c 6f 74 2d 3e 69 64 5f 74 79 70 65 5f 68  .slot->id_type_h
f080: 69 6e 74 20 3d 20 74 72 79 5f 74 79 70 65 3b 0a  int = try_type;.
f090: 0a 09 09 09 72 65 74 75 72 6e 28 74 72 79 5f 74  ....return(try_t
f0a0: 79 70 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ype);...}..}...C
f0b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f0c0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
f0d0: 6c 65 63 74 20 61 6e 79 20 61 70 70 6c 65 74 2c  lect any applet,
f0e0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
f0f0: 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72  ilure");...retur
f100: 6e 28 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  n(CACKEY_ID_TYPE
f110: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 20  _ERROR);.}../*. 
f120: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
f130: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
f140: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
f150: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f160: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36  ot *slot, uint16
f170: 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52  _t ef);. *. * AR
f180: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
f190: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
f1a0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
f1b0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
f1c0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
f1d0: 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65  *     uint16_t e
f1e0: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65  f. *         Ele
f1f0: 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73  mental File to s
f200: 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55  elect. *. * RETU
f210: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
f220: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
f230: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
f240: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
f250: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
f260: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
f270: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
f280: 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20  This selects an 
f290: 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20  Elementary File 
f2a0: 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63  (EF) under the c
f2b0: 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65  urrently selecte
f2c0: 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74  d. *     Dedicat
f2d0: 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a  ed File (DF). *.
f2e0: 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79   *     Typically
f2f0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
f300: 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20  after selecting 
f310: 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c  the correct Appl
f320: 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20  et (using. *    
f330: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
f340: 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61  pplet) for VM ca
f350: 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rds. *. */.stati
f360: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
f370: 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
f380: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f390: 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36  ot *slot, uint16
f3a0: 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e  _t ef) {..unsign
f3b0: 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b  ed char fid_buf[
f3c0: 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  2];..int send_re
f3d0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
f3e0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
f3f0: 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74  .");.../* Open t
f400: 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69  he elementary fi
f410: 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30  le */..fid_buf[0
f420: 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20  ] = (ef >> 8) & 
f430: 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31  0xff;..fid_buf[1
f440: 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a  ] = ef & 0xff;..
f450: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f460: 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20  INTF("Selecting 
f470: 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75  file: %04lx", (u
f480: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66  nsigned long) ef
f490: 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20  );...send_ret = 
f4a0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
f4b0: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
f4c0: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
f4d0: 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20  S_INSTR_SELECT, 
f4e0: 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65  0x02, 0x0C, size
f4f0: 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64  of(fid_buf), fid
f500: 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c  _buf, 0x00, NULL
f510: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
f520: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
f530: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
f540: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
f550: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
f560: 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20  d to open file, 
f570: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
f580: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
f590: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
f5a0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
f5b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f5c0: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
f5d0: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29   selected file")
f5e0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
f5f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
f600: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
f610: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
f620: 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75  ey_free_tlv(stru
f630: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
f640: 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a  tity *root);. *.
f650: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
f660: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
f670: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
f680: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f  ot. *         Ro
f690: 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69  ot of the TLV li
f6a0: 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65  st to start free
f6b0: 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ing. *. * RETURN
f6c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f   VALUE. *     No
f6d0: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ne. *. * NOTES. 
f6e0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
f6f0: 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c  ion frees the TL
f700: 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20  V linked listed 
f710: 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a  returned from. *
f720: 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61       "cackey_rea
f730: 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74  d_tlv". *. */.st
f740: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
f750: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
f760: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
f770: 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72  ty *root) {..str
f780: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
f790: 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65  ntity *curr, *ne
f7a0: 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d  xt;...if (root =
f7b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
f7c0: 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75  rn;..}...for (cu
f7d0: 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b  rr = root; curr;
f7e0: 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a   curr = next) {.
f7f0: 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f  ..next = curr->_
f800: 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20  next;....switch 
f810: 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09  (curr->tag) {...
f820: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
f830: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61  ACR_TABLE:....ca
f840: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
f850: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66  TIFICATE:.....if
f860: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b   (curr->value) {
f870: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
f880: 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09  >value);.....}..
f890: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f8a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
f8b0: 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72  URL:.....if (cur
f8c0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
f8d0: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
f8e0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
f8f0: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  l);.....}.....br
f900: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65  eak;...}....free
f910: 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74  (curr);..}...ret
f920: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  urn;.}../*. * SY
f930: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
f940: 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
f950: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
f960: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
f970: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
f980: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
f990: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
f9a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
f9b0: 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  v_entity *cackey
f9c0: 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74  _read_tlv(struct
f9d0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
f9e0: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
f9f0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
fa00: 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72  *curr_entity, *r
fa10: 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73  oot = NULL, *las
fa20: 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67  t = NULL;..unsig
fa30: 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75  ned char tlen_bu
fa40: 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31  f[2], tval_buf[1
fa50: 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e  024], *tval;..un
fa60: 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e  signed char vlen
fa70: 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75  _buf[2], vval_bu
fa80: 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a  f[8192], *vval;.
fa90: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
faa0: 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65  tmpbuf;..unsigne
fab0: 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e  d long tmpbuflen
fac0: 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c  ;..ssize_t tlen,
fad0: 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20   vlen;..ssize_t 
fae0: 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f  read_ret;..size_
faf0: 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20  t offset_t = 0, 
fb00: 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75  offset_v = 0;..u
fb10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
fb20: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  ;..size_t length
fb30: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ;.#ifdef HAVE_LI
fb40: 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65  BZ..int uncompre
fb50: 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a  ss_ret;.#endif..
fb60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fb70: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
fb80: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
fb90: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
fba0: 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c  (slot, tlen_buf,
fbb0: 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66   sizeof(tlen_buf
fbc0: 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b  ), 1, offset_t);
fbd0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
fbe0: 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75  = sizeof(tlen_bu
fbf0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
fc00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
fc10: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
fc20: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
fc30: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
fc40: 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28  );..}...tlen = (
fc50: 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  tlen_buf[1] << 8
fc60: 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | tlen_buf[0];
fc70: 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
fc80: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
fc90: 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c  (slot, vlen_buf,
fca0: 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66   sizeof(vlen_buf
fcb0: 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b  ), 2, offset_v);
fcc0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
fcd0: 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75  = sizeof(vlen_bu
fce0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
fcf0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
fd00: 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  d failed, return
fd10: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
fd20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
fd30: 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28  );..}...vlen = (
fd40: 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38  vlen_buf[1] << 8
fd50: 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b  ) | vlen_buf[0];
fd60: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fd70: 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67  PRINTF("Tag Leng
fd80: 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20  th = %lu, Value 
fd90: 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28  Length = %lu", (
fda0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74  unsigned long) t
fdb0: 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
fdc0: 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66  ong) vlen);...of
fdd0: 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66  fset_t += 2;..of
fde0: 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69  fset_v += 2;...i
fdf0: 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (tlen > sizeof
fe00: 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (tval_buf)) {...
fe10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fe20: 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20  NTF("Tag length 
fe30: 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65  is too large, re
fe40: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
fe50: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
fe60: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
fe70: 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76  vlen > sizeof(vv
fe80: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
fe90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fea0: 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69  ("Value length i
feb0: 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74  s too large, ret
fec0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
fed0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
fee0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
fef0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
ff00: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
ff10: 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31  val_buf, tlen, 1
ff20: 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66  , offset_t);..if
ff30: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c   (read_ret != tl
ff40: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
ff50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
ff60: 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
ff70: 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74  re T-buffer, ret
ff80: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
ff90: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
ffa0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f  ULL);..}...read_
ffb0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
ffc0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
ffd0: 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32  val_buf, vlen, 2
ffe0: 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66  , offset_v);..if
fff0: 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c   (read_ret != vl
10000 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
10010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
10020 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69  ble to read enti
10030 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74  re V-buffer, ret
10040 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
10050 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
10060 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20  ULL);..}...tval 
10070 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61  = tval_buf;..vva
10080 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77  l = vval_buf;..w
10090 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26  hile (tlen > 0 &
100a0 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09  & vlen > 0) {...
100b0 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74  tag = *tval;...t
100c0 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b  val++;...tlen--;
100d0 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d  ....if (*tval ==
100e0 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67   0xff) {....leng
100f0 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c  th = (tval[2] <<
10100 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09   8) | tval[1];..
10110 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09  ..tval += 3;....
10120 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65  tlen -= 3;...} e
10130 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  lse {....length 
10140 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c  = *tval;....tval
10150 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09  ++;....tlen--;..
10160 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
10170 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20  UG_PRINTF("Tag: 
10180 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b  %s (%02x)", CACK
10190 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
101a0 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28  G_TO_STR(tag), (
101b0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
101c0 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  g);...CACKEY_DEB
101d0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c  UG_PRINTBUF("Val
101e0 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  ue:", vval, leng
101f0 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74  th);....curr_ent
10200 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77  ity = NULL;...sw
10210 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09  itch (tag) {....
10220 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
10230 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72  ARDURL:.....curr
10240 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
10250 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
10260 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72  tity));.....curr
10270 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
10280 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28  ardurl = malloc(
10290 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
102a0 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
102b0 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  rl));......memcp
102c0 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  y(curr_entity->v
102d0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
102e0 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09  d, vval, 5);....
102f0 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
10300 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10310 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a  type = vval[5];.
10320 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
10330 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10340 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c  objectid = (vval
10350 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [6] << 8) | vval
10360 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [7];.....curr_en
10370 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
10380 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76  url->appid = (vv
10390 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[8] << 8) | vv
103a0 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72  al[9];......curr
103b0 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
103c0 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
103d0 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
103e0 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
103f0 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
10400 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09  _ACR_TABLE:.....
10410 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
10420 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
10430 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  r_entity));.....
10440 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
10450 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65  length);......me
10460 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
10470 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  l, length);.....
10480 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
10490 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
104a0 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68  r_entity->length
104b0 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63   = length;.....c
104c0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
104d0 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
104e0 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65  curr_entity->_ne
104f0 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  xt = NULL;......
10500 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
10510 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
10520 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  CATE:.....curr_e
10530 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
10540 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
10550 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41  ty));..#ifdef HA
10560 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62  VE_LIBZ.....tmpb
10570 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a  uflen = length *
10580 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d   2;.....tmpbuf =
10590 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
105a0 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72  n);......uncompr
105b0 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70  ess_ret = uncomp
105c0 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d  ress(tmpbuf, &tm
105d0 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c  pbuflen, vval, l
105e0 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28  ength);.....if (
105f0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21  uncompress_ret !
10600 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43  = Z_OK) {......C
10610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10620 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65  TF("Failed to de
10630 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70  compress, uncomp
10640 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20  ress() returned 
10650 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20  %i -- resorting 
10660 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c  to direct copy",
10670 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29   uncompress_ret)
10680 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65  ;.......tmpbufle
10690 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
106a0 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
106b0 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  vval, length);..
106c0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
106d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
106e0 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f  "Decompressed to
106f0 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62  :", tmpbuf, tmpb
10700 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09  uflen);.#else...
10710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10720 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a  RINTF("Missing Z
10730 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69  LIB Support, thi
10740 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  s certificate is
10750 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e   likely useless.
10760 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75  ..");......tmpbu
10770 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
10780 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
10790 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
107a0 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72  .#endif......cur
107b0 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20  r_entity->tag = 
107c0 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  tag;.....curr_en
107d0 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74  tity->length = t
107e0 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75  mpbuflen;.....cu
107f0 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
10800 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63   = tmpbuf;.....c
10810 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
10820 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
10830 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
10840 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a  CIS_TAG_PKCS15:.
10850 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
10860 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
10870 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
10880 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10890 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09  ->tag = tag;....
108a0 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
108b0 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b  lue_byte = vval[
108c0 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  0];.....curr_ent
108d0 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
108e0 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
108f0 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65  .}....vval += le
10900 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20  ngth;...vlen -= 
10910 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63  length;....if (c
10920 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55  urr_entity != NU
10930 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f  LL) {....if (roo
10940 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t == NULL) {....
10950 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74  .root = curr_ent
10960 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ity;....}.....if
10970 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20   (last != NULL) 
10980 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78  {.....last->_nex
10990 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
109a0 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d  ....}.....last =
109b0 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
109c0 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f  }..}...return(ro
109d0 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ot);.}../*. * SY
109e0 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
109f0 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
10a00 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
10a10 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
10a20 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10a30 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
10a40 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
10a50 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
10a60 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
10a70 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
10a80 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f  ty *start, size_
10a90 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65  t count, int fre
10aa0 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65  e_start) {..size
10ab0 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74  _t idx;...if (st
10ac0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
10ad0 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
10ae0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
10af0 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
10b00 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64  {...if (start[id
10b10 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20  x].certificate) 
10b20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b  {....free(start[
10b30 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10b40 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
10b50 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09  free_start) {...
10b60 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a  free(start);..}.
10b70 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61  ..return;.}..sta
10b80 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
10b90 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
10ba0 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  *cackey_copy_cer
10bb0 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  ts(struct cackey
10bc0 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
10bd0 64 65 73 74 2c 20 73 74 72 75 63 74 20 63 61 63  dest, struct cac
10be0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
10bf0 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74  y *start, size_t
10c00 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f   count) {..size_
10c10 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61  t idx;...if (sta
10c20 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
10c30 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
10c40 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e  ...if (dest == N
10c50 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20  ULL) {...dest = 
10c60 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64  malloc(sizeof(*d
10c70 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09  est) * count);..
10c80 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
10c90 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
10ca0 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69  dx++) {...dest[i
10cb0 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d 20 73 74  dx].id_type = st
10cc0 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65  art[idx].id_type
10cd0 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 64 65 73  ;....switch (des
10ce0 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 29 20  t[idx].id_type) 
10cf0 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
10d00 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
10d10 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64  ..memcpy(dest[id
10d20 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  x].card.cac.appl
10d30 65 74 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  et, start[idx].c
10d40 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20  ard.cac.applet, 
10d50 73 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d  sizeof(dest[idx]
10d60 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  .card.cac.applet
10d70 29 29 3b 0a 09 09 09 09 64 65 73 74 5b 69 64 78  ));.....dest[idx
10d80 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20  ].card.cac.file 
10d90 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  = start[idx].car
10da0 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09  d.cac.file;.....
10db0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
10dc0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
10dd0 56 3a 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d  V:.....dest[idx]
10de0 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  .card.piv.key_id
10df0 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61   = start[idx].ca
10e00 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09  rd.piv.key_id;..
10e10 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69  ...memcpy(dest[i
10e20 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62  dx].card.piv.lab
10e30 65 6c 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  el, start[idx].c
10e40 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73  ard.piv.label, s
10e50 69 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e  izeof(dest[idx].
10e60 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29  card.piv.label))
10e70 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
10e80 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
10e90 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
10ea0 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09  ...break;...}...
10eb0 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
10ec0 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72  icate_len = star
10ed0 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
10ee0 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69  te_len;...dest[i
10ef0 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74  dx].keysize = st
10f00 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65  art[idx].keysize
10f10 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  ;....dest[idx].c
10f20 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
10f30 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65  loc(dest[idx].ce
10f40 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
10f50 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64  ..memcpy(dest[id
10f60 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  x].certificate, 
10f70 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
10f80 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78  ficate, dest[idx
10f90 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
10fa0 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  n);..}...return(
10fb0 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  dest);.}../*. * 
10fc0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
10fd0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
10fe0 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
10ff0 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
11000 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
11010 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
11020 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
11030 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
11040 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
11050 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
11060 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
11070 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63  lot *slot, struc
11080 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
11090 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75  entity *certs, u
110a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f  nsigned long *co
110b0 75 6e 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70  unt) {..cackey_p
110c0 63 73 63 5f 69 64 5f 74 79 70 65 20 63 68 65 63  csc_id_type chec
110d0 6b 5f 69 64 5f 74 79 70 65 3b 0a 09 73 74 72 75  k_id_type;..stru
110e0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
110f0 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
11100 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
11110 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63  _tlv_entity *ccc
11120 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c  _tlv, *ccc_curr,
11130 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f   *app_tlv, *app_
11140 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20  curr;..unsigned 
11150 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70  char *piv_oid, p
11160 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d  iv_oid_pivauth[]
11170 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
11180 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c  _3_OID_PIVAUTH},
11190 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75   piv_oid_signatu
111a0 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30  re[] = {NISTSP80
111b0 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41  0_73_3_OID_SIGNA
111c0 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b  TURE}, piv_oid_k
111d0 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53  eymgt[] = {NISTS
111e0 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45  P800_73_3_OID_KE
111f0 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  YMGT};..unsigned
11200 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37   char curr_aid[7
11210 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
11220 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 2c 20  r buffer[8192], 
11230 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62  *buffer_p, *tmpb
11240 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  uf;..unsigned lo
11250 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09  ng outidx = 0;..
11260 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b  char *piv_label;
11270 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61  ..cackey_ret tra
11280 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73  nsaction_ret;..s
11290 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b  size_t read_ret;
112a0 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  ..size_t buffer_
112b0 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  len, tmpbuflen;.
112c0 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a  .int certs_resiz
112d0 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  able;..int send_
112e0 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b  ret, select_ret;
112f0 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70  ..int piv_key, p
11300 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 63 61 63  iv = 0;..int cac
11310 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 3b  hed_certs_valid;
11320 0a 09 69 6e 74 20 69 64 78 3b 0a 09 63 61 63 6b  ..int idx;..cack
11330 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
11340 69 64 5f 74 79 70 65 3b 0a 23 69 66 64 65 66 20  id_type;.#ifdef 
11350 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75  HAVE_LIBZ..int u
11360 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 09  ncompress_ret;..
11370 7a 5f 73 74 72 65 61 6d 20 67 7a 69 70 5f 73 74  z_stream gzip_st
11380 72 65 61 6d 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  ream;.#endif...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 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
113b0 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55  .if (count == NU
113c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
113d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75  EBUG_PRINTF("cou
113e0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75  nt is NULL, retu
113f0 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
11400 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
11410 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65  LL);..}...if (ce
11420 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts != NULL) {..
11430 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30  .if (*count == 0
11440 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
11450 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
11460 65 73 74 65 64 20 77 65 20 72 65 74 75 72 6e 20  ested we return 
11470 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74  0 objects, short
11480 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09  -circuit");.....
11490 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09  return(certs);..
114a0 09 7d 0a 09 7d 0a 0a 09 63 61 63 68 65 64 5f 63  .}..}...cached_c
114b0 65 72 74 73 5f 76 61 6c 69 64 20 3d 20 30 3b 0a  erts_valid = 0;.
114c0 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74  .if (!slot->slot
114d0 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28  _reset) {...if (
114e0 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
114f0 74 73 29 20 7b 0a 09 09 09 63 61 63 68 65 64 5f  ts) {....cached_
11500 63 65 72 74 73 5f 76 61 6c 69 64 20 3d 20 31 3b  certs_valid = 1;
11510 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63  .....if (slot->c
11520 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
11530 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 63 61 63  t > 0) {.....cac
11540 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 20  hed_certs_valid 
11550 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  = 1;....}...}..}
11560 0a 0a 09 69 66 20 28 63 61 63 68 65 64 5f 63 65  ...if (cached_ce
11570 72 74 73 5f 76 61 6c 69 64 29 20 7b 0a 09 09 69  rts_valid) {...i
11580 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c  f (certs == NULL
11590 29 20 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 6d  ) {....certs = m
115a0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65  alloc(sizeof(*ce
115b0 72 74 73 29 20 2a 20 73 6c 6f 74 2d 3e 63 61 63  rts) * slot->cac
115c0 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 29  hed_certs_count)
115d0 3b 0a 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c  ;....*count = sl
115e0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
115f0 5f 63 6f 75 6e 74 3b 0a 09 09 7d 20 65 6c 73 65  _count;...} else
11600 20 7b 0a 09 09 09 69 66 20 28 2a 63 6f 75 6e 74   {....if (*count
11610 20 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   > slot->cached_
11620 63 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  certs_count) {..
11630 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
11640 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
11650 6f 75 6e 74 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ount;....}...}..
11660 09 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65  ..cackey_copy_ce
11670 72 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d  rts(certs, slot-
11680 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a  >cached_certs, *
11690 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45  count);....CACKE
116a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
116b0 52 65 74 75 72 6e 69 6e 67 20 63 61 63 68 65 64  Returning cached
116c0 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 6f   certificates fo
116d0 72 20 74 68 69 73 20 73 6c 6f 74 20 28 63 61 72  r this slot (car
116e0 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72  d has not been r
116f0 65 73 65 74 20 61 6e 64 20 74 68 65 72 65 20 61  eset and there a
11700 72 65 20 63 61 63 68 65 64 20 63 65 72 74 73 20  re cached certs 
11710 61 76 61 69 6c 61 62 6c 65 29 22 29 3b 0a 0a 09  available)");...
11720 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
11730 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63  .}...if (slot->c
11740 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09  ached_certs) {..
11750 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
11760 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  ts(slot->cached_
11770 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63  certs, slot->cac
11780 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c  hed_certs_count,
11790 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61   1);....slot->ca
117a0 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c  ched_certs = NUL
117b0 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  L;..}.../* Begin
117c0 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72 61   a SmartCard tra
117d0 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61  nsaction */..tra
117e0 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63  nsaction_ret = c
117f0 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
11800 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09  saction(slot);..
11810 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f  if (transaction_
11820 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
11830 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
11840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11850 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74  ("Unable begin t
11860 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
11870 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
11880 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
11890 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70  LL);..}...id_typ
118a0 65 20 3d 20 63 61 63 6b 65 79 5f 64 65 74 65 63  e = cackey_detec
118b0 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f  t_and_select_roo
118c0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 43  t_applet(slot, C
118d0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e  ACKEY_ID_TYPE_UN
118e0 4b 4e 4f 57 4e 29 3b 0a 0a 09 73 77 69 74 63 68  KNOWN);...switch
118f0 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63   (id_type) {...c
11900 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
11910 50 45 5f 43 41 43 3a 0a 09 09 09 70 69 76 20 3d  PE_CAC:....piv =
11920 20 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09   0;.....break;..
11930 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
11940 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 70 69 76  TYPE_PIV:....piv
11950 20 3d 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b   = 1;.....break;
11960 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
11970 44 5f 54 59 50 45 5f 45 52 52 4f 52 3a 0a 09 09  D_TYPE_ERROR:...
11980 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
11990 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
119a0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
119b0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
119c0 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28  (slot);.....if (
119d0 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
119e0 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20 30 3b  .....*count = 0;
119f0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
11a00 28 4e 55 4c 4c 29 3b 0a 0a 09 09 09 62 72 65 61  (NULL);.....brea
11a10 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
11a20 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
11a30 4c 59 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  LY:....CACKEY_DE
11a40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11a50 72 2e 20 20 49 6d 70 6f 73 73 69 62 6c 65 20 63  r.  Impossible c
11a60 6f 6e 64 69 74 69 6f 6e 20 72 65 61 63 68 65 64  ondition reached
11a70 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  .");.....break;.
11a80 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
11a90 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
11aa0 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
11ab0 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
11ac0 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
11ad0 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
11ae0 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
11af0 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
11b00 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70   = 0;..}...if (p
11b10 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69 64 78  iv) {...for (idx
11b20 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b 20 69   = 0; idx < 3; i
11b30 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69 74 63  dx++) {....switc
11b40 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09 63 61  h (idx) {.....ca
11b50 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76 5f 6f  se 0:......piv_o
11b60 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70 69 76  id = piv_oid_piv
11b70 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76 5f 6b  auth;......piv_k
11b80 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
11b90 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48 3b  8_3_KEY_PIVAUTH;
11ba0 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20  ......piv_label 
11bb0 3d 20 22 41 75 74 68 65 6e 74 69 63 61 74 69 6f  = "Authenticatio
11bc0 6e 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  n";......break;.
11bd0 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09 09  ....case 1:.....
11be0 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f  .piv_oid = piv_o
11bf0 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09 09  id_signature;...
11c00 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
11c10 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
11c20 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09 09  SIGNATURE;......
11c30 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 53 69 67  piv_label = "Sig
11c40 6e 61 74 75 72 65 22 3b 0a 09 09 09 09 09 62 72  nature";......br
11c50 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32 3a  eak;.....case 2:
11c60 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20  ......piv_oid = 
11c70 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b 0a  piv_oid_keymgt;.
11c80 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e  .....piv_key = N
11c90 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45  ISTSP800_78_3_KE
11ca0 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09 70  Y_KEYMGT;......p
11cb0 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b 65 79 20  iv_label = "Key 
11cc0 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a 09 09 09  Management";....
11cd0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
11ce0 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
11cf0 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f  key_get_data(slo
11d00 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 6f  t, buffer, sizeo
11d10 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f 6f  f(buffer), piv_o
11d20 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 61  id);.....if (rea
11d30 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
11d40 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11d50 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
11d60 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
11d70 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09  ..outidx++;.....
11d80 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65  curr_id->keysize
11d90 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f 69   = -1;....curr_i
11da0 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43  d->id_type = CAC
11db0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3b  KEY_ID_TYPE_PIV;
11dc0 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72  ....curr_id->car
11dd0 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 70  d.piv.key_id = p
11de0 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65 6d 63 70  iv_key;....memcp
11df0 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  y(curr_id->card.
11e00 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69 76 5f 6c  piv.label, piv_l
11e10 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28 70 69 76  abel, strlen(piv
11e20 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b 0a 0a 09  _label) + 1);...
11e30 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
11e40 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72 65 61  ficate_len = rea
11e50 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72 5f 69  d_ret;....curr_i
11e60 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  d->certificate =
11e70 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d   malloc(curr_id-
11e80 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
11e90 29 3b 0a 0a 09 09 09 62 75 66 66 65 72 5f 6c 65  );.....buffer_le
11ea0 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66 65  n = sizeof(buffe
11eb0 72 29 3b 0a 09 09 09 62 75 66 66 65 72 5f 70 20  r);....buffer_p 
11ec0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
11ed0 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72 2c  rtlv_tag(buffer,
11ee0 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78   &buffer_len, 0x
11ef0 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72  70, curr_id->cer
11f00 74 69 66 69 63 61 74 65 2c 20 26 63 75 72 72 5f  tificate, &curr_
11f10 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
11f20 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 62 75  len);.....if (bu
11f30 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  ffer_p == NULL) 
11f40 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
11f50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 69  UG_PRINTF("Readi
11f60 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20 66  ng certificate f
11f70 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72 65 73 70  rom BER-TLV resp
11f80 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20 73 6b 69  onse failed, ski
11f90 70 70 69 6e 67 20 6b 65 79 20 25 69 22 2c 20 69  pping key %i", i
11fa0 64 78 29 3b 0a 0a 09 09 09 09 66 72 65 65 28 63  dx);......free(c
11fb0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11fc0 61 74 65 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ate);......curr_
11fd0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
11fe0 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 6f 75 74  = NULL;......out
11ff0 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e 74  idx--;......cont
12000 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
12010 66 20 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  f (curr_id->cert
12020 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 20 34 29  ificate_len > 4)
12030 20 7b 0a 09 09 09 09 69 66 20 28 6d 65 6d 63 6d   {.....if (memcm
12040 70 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  p(curr_id->certi
12050 66 69 63 61 74 65 2c 20 22 5c 78 31 66 5c 78 38  ficate, "\x1f\x8
12060 62 5c 78 30 38 5c 78 30 30 22 2c 20 34 29 20 3d  b\x08\x00", 4) =
12070 3d 20 30 29 20 7b 0a 23 69 66 64 65 66 20 48 41  = 0) {.#ifdef HA
12080 56 45 5f 4c 49 42 5a 0a 09 09 09 09 09 74 6d 70  VE_LIBZ......tmp
12090 62 75 66 6c 65 6e 20 3d 20 63 75 72 72 5f 69 64  buflen = curr_id
120a0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
120b0 6e 20 2a 20 32 3b 0a 09 09 09 09 09 74 6d 70 62  n * 2;......tmpb
120c0 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
120d0 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 43 41  uflen);.......CA
120e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
120f0 42 55 46 28 22 41 74 74 65 6d 70 74 69 6e 67 20  BUF("Attempting 
12100 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 3a 22 2c  to decompress:",
12110 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
12120 69 63 61 74 65 2c 20 63 75 72 72 5f 69 64 2d 3e  icate, curr_id->
12130 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
12140 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  ;.......gzip_str
12150 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c  eam.zalloc = NUL
12160 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  L;......gzip_str
12170 65 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c  eam.zfree = NULL
12180 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  ;......gzip_stre
12190 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c 4c  am.opaque = NULL
121a0 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72  ;.......gzip_str
121b0 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d 20 63  eam.next_in  = c
121c0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
121d0 61 74 65 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73  ate;......gzip_s
121e0 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d  tream.avail_in =
121f0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
12200 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09 09 09  icate_len;......
12210 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74  gzip_stream.next
12220 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 3b 0a 09  _out = tmpbuf;..
12230 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
12240 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74 6d 70 62  avail_out = tmpb
12250 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 09 75 6e 63  uflen;.......unc
12260 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e  ompress_ret = in
12270 66 6c 61 74 65 49 6e 69 74 28 26 67 7a 69 70 5f  flateInit(&gzip_
12280 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 69 66  stream);......if
12290 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
122a0 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09   == Z_OK) {.....
122b0 09 09 2f 2a 20 54 72 79 20 61 67 61 69 6e 20 61  ../* Try again a
122c0 73 20 61 20 67 7a 69 70 20 62 75 66 66 65 72 20  s a gzip buffer 
122d0 2a 2f 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72  */.......uncompr
122e0 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74  ess_ret = inflat
122f0 65 45 6e 64 28 26 67 7a 69 70 5f 73 74 72 65 61  eEnd(&gzip_strea
12300 6d 29 3b 0a 09 09 09 09 09 09 69 66 20 28 75 6e  m);.......if (un
12310 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20  compress_ret == 
12320 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 09 67  Z_OK) {........g
12330 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f  zip_stream.zallo
12340 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  c = NULL;.......
12350 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72  .gzip_stream.zfr
12360 65 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ee = NULL;......
12370 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6f 70  ..gzip_stream.op
12380 61 71 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  aque = NULL;....
12390 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
123a0 2e 6e 65 78 74 5f 69 6e 20 20 3d 20 63 75 72 72  .next_in  = curr
123b0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
123c0 3b 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74  ;........gzip_st
123d0 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d 20  ream.avail_in = 
123e0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
123f0 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09 09 09 09  cate_len;.......
12400 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78  .gzip_stream.nex
12410 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 3b 0a  t_out = tmpbuf;.
12420 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
12430 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74  am.avail_out = t
12440 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 09 09  mpbuflen;.......
12450 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  .uncompress_ret 
12460 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 32 28 26  = inflateInit2(&
12470 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20 33 31 29  gzip_stream, 31)
12480 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
12490 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ......if (uncomp
124a0 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b  ress_ret == Z_OK
124b0 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  ) {.......uncomp
124c0 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61  ress_ret = infla
124d0 74 65 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c  te(&gzip_stream,
124e0 20 30 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09   0);......}.....
124f0 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
12500 72 65 74 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f  ret == Z_STREAM_
12510 45 4e 44 29 20 7b 0a 09 09 09 09 09 09 75 6e 63  END) {.......unc
12520 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e  ompress_ret = in
12530 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73  flateEnd(&gzip_s
12540 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 7d 20 65  tream);......} e
12550 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f  lse {.......unco
12560 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 5a 5f 44  mpress_ret = Z_D
12570 41 54 41 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09  ATA_ERROR;......
12580 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  }......if (uncom
12590 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f  press_ret == Z_O
125a0 4b 29 20 7b 0a 09 09 09 09 09 09 74 6d 70 62 75  K) {.......tmpbu
125b0 66 6c 65 6e 20 3d 20 67 7a 69 70 5f 73 74 72 65  flen = gzip_stre
125c0 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09  am.total_out;...
125d0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
125e0 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f  G_PRINTBUF("Deco
125f0 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74  mpressed to:", t
12600 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
12610 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 63  );........free(c
12620 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12630 61 74 65 29 3b 0a 0a 09 09 09 09 09 09 63 75 72  ate);........cur
12640 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
12650 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
12660 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
12670 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 74 6d 70  ficate_len = tmp
12680 62 75 66 6c 65 6e 3b 0a 09 09 09 09 09 7d 20 65  buflen;......} e
12690 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  lse {.......CACK
126a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
126b0 22 44 65 63 6f 6d 70 72 65 73 73 69 6e 67 20 66  "Decompressing f
126c0 61 69 6c 65 64 21 20 75 6e 63 6f 6d 70 72 65 73  ailed! uncompres
126d0 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 22  s() returned %i"
126e0 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  , uncompress_ret
126f0 29 3b 0a 0a 09 09 09 09 09 09 66 72 65 65 28 74  );........free(t
12700 6d 70 62 75 66 29 3b 0a 09 09 09 09 09 7d 0a 23  mpbuf);......}.#
12710 65 6c 73 65 0a 09 09 09 09 09 43 41 43 4b 45 59  else......CACKEY
12720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
12730 72 72 6f 72 2e 20 20 57 65 20 67 6f 74 20 61 20  rror.  We got a 
12740 63 6f 6d 70 72 65 73 73 65 64 20 63 65 72 74 69  compressed certi
12750 66 69 63 61 74 65 20 62 75 74 20 77 65 20 64 6f  ficate but we do
12760 20 6e 6f 74 20 68 61 76 65 20 7a 6c 69 62 2e 20   not have zlib. 
12770 20 48 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   Hoping for the 
12780 62 65 73 74 2e 22 29 3b 0a 23 65 6e 64 69 66 0a  best.");.#endif.
12790 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09  ....}....}...}..
127a0 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65  } else {.../* Re
127b0 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65  ad all the apple
127c0 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27  ts from the CCC'
127d0 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74  s TLV */...ccc_t
127e0 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  lv = cackey_read
127f0 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f  _tlv(slot);..../
12800 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55  * Look for CARDU
12810 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70  RLs that cooresp
12820 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65  ond to PKI apple
12830 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63  ts */...for (ccc
12840 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b  _curr = ccc_tlv;
12850 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63   ccc_curr; ccc_c
12860 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e  urr = ccc_curr->
12870 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b  _next) {....CACK
12880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12890 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e  "Found tag: %s .
128a0 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  .. ", CACKEY_DEB
128b0 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
128c0 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67  TR(ccc_curr->tag
128d0 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f  ));.....if (ccc_
128e0 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43  curr->tag != GSC
128f0 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20  IS_TAG_CARDURL) 
12900 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
12910 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
12920 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
12930 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
12940 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09   CARDURLs)");...
12950 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
12960 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63  }.....if ((ccc_c
12970 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12980 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41  rl->apptype & CA
12990 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
129a0 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f  ) != CACKEY_TLV_
129b0 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43  APP_PKI) {.....C
129c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
129d0 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69  TF("  ... skippi
129e0 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63  ng it (we only c
129f0 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70  are about PKI ap
12a00 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c  plets, this appl
12a10 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f  et supports: %s/
12a20 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  %02x)", CACKEY_D
12a30 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
12a40 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  E_TO_STR(ccc_cur
12a50 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12a60 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73  ->apptype), (uns
12a70 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63  igned int) ccc_c
12a80 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
12a90 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09  rl->apptype);...
12aa0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
12ab0 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  }.....CACKEY_DEB
12ac0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44  UG_PRINTBUF("RID
12ad0 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  :", ccc_curr->va
12ae0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
12af0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
12b00 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12b10 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b  ->rid));....CACK
12b20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12b30 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
12b40 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
12b50 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
12b60 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
12b70 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
12b80 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
12b90 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
12ba0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
12bb0 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  id);....CACKEY_D
12bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a  EBUG_PRINTF("Obj
12bd0 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78  ectID = %s/%04lx
12be0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
12bf0 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
12c00 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  R(ccc_curr->valu
12c10 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
12c20 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  tid), (unsigned 
12c30 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e  long) ccc_curr->
12c40 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
12c50 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65  bjectid);.....me
12c60 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63  mcpy(curr_aid, c
12c70 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12c80 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a  ardurl->rid, siz
12c90 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  eof(ccc_curr->va
12ca0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
12cb0 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ));....curr_aid[
12cc0 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
12cd0 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72   - 2] = (ccc_cur
12ce0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12cf0 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20  ->appid >> 8) & 
12d00 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69  0xff;....curr_ai
12d10 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
12d20 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75  d) - 1] = ccc_cu
12d30 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12d40 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b  l->appid & 0xff;
12d50 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66  ...../* Select f
12d60 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20  ound applet ... 
12d70 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74  */....select_ret
12d80 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
12d90 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75  _applet(slot, cu
12da0 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
12db0 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66  urr_aid));....if
12dc0 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
12dd0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
12de0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12df0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
12e00 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70  led to select ap
12e10 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70  plet, skipping p
12e20 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
12e30 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
12e40 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
12e50 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f  ..../* ... and o
12e60 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a  bject (file) */.
12e70 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
12e80 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
12e90 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72  le(slot, ccc_cur
12ea0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12eb0 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09  ->objectid);....
12ec0 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
12ed0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
12ee0 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
12ef0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
12f00 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20  ailed to select 
12f10 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70  file, skipping p
12f20 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
12f30 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
12f40 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
12f50 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..../* Process t
12f60 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c  his file's TLV l
12f70 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69  ooking for certi
12f80 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70  ficates */....ap
12f90 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72  p_tlv = cackey_r
12fa0 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09  ead_tlv(slot);..
12fb0 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72  ....for (app_cur
12fc0 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70  r = app_tlv; app
12fd0 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20  _curr; app_curr 
12fe0 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78  = app_curr->_nex
12ff0 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  t) {.....CACKEY_
13000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
13010 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41  und tag: %s", CA
13020 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
13030 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63  TAG_TO_STR(app_c
13040 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09  urr->tag));.....
13050 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61  if (app_curr->ta
13060 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
13070 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
13080 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13090 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
130a0 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
130b0 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 45  ly care about CE
130c0 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a  RTIFICATEs)");..
130d0 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
130e0 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69  ...}......curr_i
130f0 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64  d = &certs[outid
13100 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b  x];.....outidx++
13110 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e  ;......curr_id->
13120 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59  id_type = CACKEY
13130 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09  _ID_TYPE_CAC;...
13140 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
13150 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
13160 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
13170 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  eof(curr_id->car
13180 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
13190 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72  ....curr_id->car
131a0 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63 63  d.cac.file = ccc
131b0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
131c0 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a  durl->objectid;.
131d0 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
131e0 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 09  size = -1;......
131f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13200 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72  NTF("Filling cur
13210 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
13220 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20  pplet (%p) with 
13230 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72  %lu bytes:", cur
13240 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
13250 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64  pplet, (unsigned
13260 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75   long) sizeof(cu
13270 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
13280 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41  applet));.....CA
13290 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
132a0 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72  BUF("VAL:", curr
132b0 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
132c0 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72  plet, sizeof(cur
132d0 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
132e0 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75  pplet));......cu
132f0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
13300 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72  te_len = app_cur
13310 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09  r->length;......
13320 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
13330 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
13340 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
13350 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d  te_len);.....mem
13360 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  cpy(curr_id->cer
13370 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75  tificate, app_cu
13380 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f  rr->value, curr_
13390 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
133a0 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  len);......if (o
133b0 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
133c0 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72 74   {......if (cert
133d0 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09  s_resizable) {..
133e0 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32  .....*count *= 2
133f0 3b 0a 09 09 09 09 09 09 69 66 20 28 2a 63 6f 75  ;.......if (*cou
13400 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09  nt != 0) {......
13410 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f  ..certs = reallo
13420 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28  c(certs, sizeof(
13430 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e  *certs) * (*coun
13440 74 29 29 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  t));.......} els
13450 65 20 7b 0a 09 09 09 09 09 09 09 63 65 72 74 73  e {........certs
13460 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 7d   = NULL;.......}
13470 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
13480 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
13490 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  .}.....}....}...
134a0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  ..cackey_free_tl
134b0 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09  v(app_tlv);.....
134c0 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
134d0 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61  ount) {.....brea
134e0 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  k;....}...}....c
134f0 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63  ackey_free_tlv(c
13500 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63  cc_tlv);..}...*c
13510 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a  ount = outidx;..
13520 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a  .if (certs_resiz
13530 61 62 6c 65 29 20 7b 0a 09 09 69 66 20 28 2a 63  able) {...if (*c
13540 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
13550 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
13560 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
13570 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
13580 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
13590 09 66 72 65 65 28 63 65 72 74 73 29 3b 0a 0a 09  .free(certs);...
135a0 09 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  ..certs = NULL;.
135b0 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63  ..}..}...slot->c
135c0 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 63 61  ached_certs = ca
135d0 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
135e0 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f  NULL, certs, *co
135f0 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63  unt);..slot->cac
13600 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20  hed_certs_count 
13610 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54  = *count;.../* T
13620 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61  erminate SmartCa
13630 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
13640 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
13650 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
13660 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
13670 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
13680 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
13690 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
136a0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
136b0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
136c0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
136d0 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
136e0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
136f0 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e  ze_t cackey_sign
13700 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20 63  decrypt(struct c
13710 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
13720 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
13730 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
13740 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ty, unsigned cha
13750 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62  r *buf, size_t b
13760 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  uflen, unsigned 
13770 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69  char *outbuf, si
13780 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20  ze_t outbuflen, 
13790 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69 6e  int padInput, in
137a0 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b  t unpadOutput) {
137b0 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  ..cackey_pcsc_id
137c0 5f 74 79 70 65 20 69 64 5f 74 79 70 65 2c 20 63  _type id_type, c
137d0 68 65 63 6b 5f 69 64 5f 74 79 70 65 3b 0a 09 75  heck_id_type;..u
137e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 79 6e  nsigned char dyn
137f0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31  _auth_template[1
13800 30 5d 2c 20 2a 64 79 6e 5f 61 75 74 68 5f 74 6d  0], *dyn_auth_tm
13810 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
13820 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74  char *tmpbuf, *t
13830 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66  mpbuf_s, *outbuf
13840 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70 3b 0a 09  _s, *outbuf_p;..
13850 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 79  unsigned char by
13860 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 2c  tes_to_send, p1,
13870 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67 6e 65   class;..unsigne
13880 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70 65  d char blocktype
13890 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65  ;..cackey_ret se
138a0 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f  nd_ret;..uint16_
138b0 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73 69  t respcode;..ssi
138c0 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30 2c  ze_t retval = 0,
138d0 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 73   unpadoffset;..s
138e0 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c  ize_t tmpbuflen,
138f0 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62   padlen, tmpoutb
13900 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 5f 6c 65  uflen, outbuf_le
13910 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70  n;..int free_tmp
13920 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65  buf = 0;..int le
13930 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
13940 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
13950 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d  ");...if (slot =
13960 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
13970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13980 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73  "Error.  slot is
13990 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
139a0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
139b0 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (buf == NULL) {.
139c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
139d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62  RINTF("Error.  b
139e0 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
139f0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
13a00 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20  ..if (outbuf == 
13a10 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
13a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13a30 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73  rror.  outbuf is
13a40 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
13a50 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
13a60 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
13a70 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
13a80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13a90 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 20  r.  identity is 
13aa0 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
13ab0 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
13ac0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
13ad0 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
13ae0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13af0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13b00 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
13b10 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c  _identity is NUL
13b20 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
13b30 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70 65  1);..}...id_type
13b40 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73   = identity->pcs
13b50 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74  c_identity->id_t
13b60 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74 79 70  ype;..if (id_typ
13b70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  e == CACKEY_ID_T
13b80 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29 20 7b  YPE_CERT_ONLY) {
13b90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13ba0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13bb0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
13bc0 64 65 6e 74 69 74 79 20 69 73 20 43 41 43 4b 45  dentity is CACKE
13bd0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
13be0 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e 6e 6f  NLY, which canno
13bf0 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 69  t be used for si
13c00 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09  gn/decrypt");...
13c10 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
13c20 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
13c30 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
13c40 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
13c50 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
13c60 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 62 72  _TYPE_CAC:....br
13c70 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a  eak;...default:.
13c80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13c90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
13ca0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
13cb0 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 61  dentity is not a
13cc0 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c 75 65   supported value
13cd0 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25 6c 78  . Type is: 0x%lx
13ce0 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c 20 43   (PIV = 0x%lx, C
13cf0 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20 28 75  AC = 0x%lx)", (u
13d00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
13d10 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  _type, (unsigned
13d20 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44   long) CACKEY_ID
13d30 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e 73 69  _TYPE_PIV, (unsi
13d40 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45  gned long) CACKE
13d50 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29 3b 0a  Y_ID_TYPE_CAC);.
13d60 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13d70 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
13d80 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73  e identity Key s
13d90 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ize */..if (iden
13da0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13db0 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30  ity->keysize < 0
13dc0 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e  ) {...identity->
13dd0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
13de0 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f  eysize = x509_to
13df0 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74  _keysize(identit
13e00 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13e10 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 69  ->certificate, i
13e20 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13e30 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
13e40 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  ate_len);..}.../
13e50 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f  * Pad message to
13e60 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   key size */..if
13e70 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09   (padInput) {...
13e80 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
13e90 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
13ea0 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69  size > 0) {....i
13eb0 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65  f (buflen != ide
13ec0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
13ed0 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b  tity->keysize) {
13ee0 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
13ef0 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  > (identity->pcs
13f00 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
13f10 69 7a 65 20 2d 20 33 29 29 20 7b 0a 09 09 09 09  ize - 3)) {.....
13f20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13f30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65  INTF("Error.  Me
13f40 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
13f50 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79  ge to sign/decry
13f60 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  pt");.......retu
13f70 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09  rn(-1);.....}...
13f80 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69  ...tmpbuflen = i
13f90 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13fa0 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b  entity->keysize;
13fb0 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
13fc0 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
13fd0 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  .....free_tmpbuf
13fe0 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65   = 1;......padle
13ff0 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20  n = tmpbuflen - 
14000 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09  buflen - 3;.....
14010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14020 49 4e 54 46 28 22 4e 65 65 64 20 74 6f 20 70 61  INTF("Need to pa
14030 64 20 74 68 65 20 62 75 66 66 65 72 20 77 69 74  d the buffer wit
14040 68 20 25 6c 6c 75 20 62 79 74 65 73 20 28 74 6d  h %llu bytes (tm
14050 70 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20  pbuflen = %llu, 
14060 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75 29 22 2c  buflen = %llu)",
14070 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
14080 6c 6f 6e 67 29 20 70 61 64 6c 65 6e 2c 20 28 75  long) padlen, (u
14090 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
140a0 67 29 20 74 6d 70 62 75 66 6c 65 6e 2c 20 28 75  g) tmpbuflen, (u
140b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
140c0 67 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  g) buflen);.....
140d0 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45  ./* RSA PKCS#1 E
140e0 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50  MSA-PKCS1-v1_5 P
140f0 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d  adding */.....tm
14100 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a  pbuf[0] = 0x00;.
14110 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20  ....tmpbuf[1] = 
14120 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74  0x01;.....memset
14130 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46  (&tmpbuf[2], 0xF
14140 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09  F, padlen);.....
14150 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20  tmpbuf[padlen + 
14160 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65  2]= 0x00;.....me
14170 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64  mcpy(&tmpbuf[pad
14180 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62  len + 3], buf, b
14190 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43  uflen);......CAC
141a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
141b0 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20  UF("Unpadded:", 
141c0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09  buf, buflen);...
141d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
141e0 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
141f0 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
14200 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  flen);....} else
14210 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20   {.....tmpbuf = 
14220 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c  buf;.....tmpbufl
14230 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
14240 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
14250 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30  ;.....padlen = 0
14260 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
14270 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
14280 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
14290 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65   to determine ke
142a0 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74  y size, hoping t
142b0 68 65 20 6d 65 73 73 61 67 65 20 69 73 20 70 72  he message is pr
142c0 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21 22 29  operly padded!")
142d0 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62  ;.....tmpbuf = b
142e0 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e  uf;....tmpbuflen
142f0 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72   = buflen;....fr
14300 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
14310 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
14320 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d  }..} else {...tm
14330 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d  pbuf = buf;...tm
14340 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
14350 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ;...free_tmpbuf 
14360 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20  = 0;...padlen = 
14370 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  0;..}.../* Begin
14380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
14390 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
143a0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
143b0 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
143c0 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09  rect applet */..
143d0 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
143e0 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
143f0 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
14400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14410 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20  INTF("Selecting 
14420 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20  applet found at 
14430 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74  %p ...", identit
14440 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
14450 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
14460 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  t);....cackey_se
14470 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
14480 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
14490 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e  _identity->card.
144a0 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65  cac.applet, size
144b0 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  of(identity->pcs
144c0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
144d0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a  .cac.applet));..
144e0 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
144f0 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09 09  rect file */....
14500 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
14510 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  le(slot, identit
14520 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
14530 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 29  ->card.cac.file)
14540 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
14550 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14560 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f 61 75  E_PIV:....dyn_au
14570 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d 20 3d  th_template[0] =
14580 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f 61 75   0x7C;....dyn_au
14590 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d 20 3d  th_template[1] =
145a0 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
145b0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d 20 3d  th_template[2] =
145c0 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36   ((tmpbuflen + 6
145d0 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  ) & 0xff00) >> 8
145e0 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
145f0 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74 6d 70  mplate[3] = (tmp
14600 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78  buflen + 6) & 0x
14610 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61 75 74  00ff;....dyn_aut
14620 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20 3d 20  h_template[4] = 
14630 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
14640 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d 20  h_template[5] = 
14650 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x00;....dyn_aut
14660 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d 20  h_template[6] = 
14670 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x81;....dyn_aut
14680 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d 20  h_template[7] = 
14690 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
146a0 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d 20  h_template[8] = 
146b0 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 66  (tmpbuflen & 0xf
146c0 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79  f00) >> 8;....dy
146d0 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
146e0 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26  9] = tmpbuflen &
146f0 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 64 79 6e   0x00ff;.....dyn
14700 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 3d 20 6d  _auth_tmpbuf = m
14710 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 20  alloc(tmpbuflen 
14720 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  + sizeof(dyn_aut
14730 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09  h_template));...
14740 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68  .memcpy(dyn_auth
14750 5f 74 6d 70 62 75 66 2c 20 64 79 6e 5f 61 75 74  _tmpbuf, dyn_aut
14760 68 5f 74 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65  h_template, size
14770 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  of(dyn_auth_temp
14780 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d 63 70  late));....memcp
14790 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75  y(dyn_auth_tmpbu
147a0 66 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61  f + sizeof(dyn_a
147b0 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20 74  uth_template), t
147c0 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
147d0 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f  );.....if (free_
147e0 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 66 72  tmpbuf) {.....fr
147f0 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09 09 7d  ee(tmpbuf);....}
14800 0a 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 2b  .....tmpbuflen +
14810 3d 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  = sizeof(dyn_aut
14820 68 5f 74 65 6d 70 6c 61 74 65 29 3b 0a 09 09 09  h_template);....
14830 74 6d 70 62 75 66 20 3d 20 64 79 6e 5f 61 75 74  tmpbuf = dyn_aut
14840 68 5f 74 6d 70 62 75 66 3b 0a 09 09 09 66 72 65  h_tmpbuf;....fre
14850 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09  e_tmpbuf = 1;...
14860 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
14870 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
14880 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65  ERT_ONLY:....bre
14890 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75 66 5f  ak;..}...tmpbuf_
148a0 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74  s = tmpbuf;..out
148b0 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a  buf_s = outbuf;.
148c0 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66 6c 65  .while (tmpbufle
148d0 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74 62 75 66  n) {...tmpoutbuf
148e0 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b  len = outbuflen;
148f0 0a 0a 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
14900 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
14910 4d 54 55 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  MTU) {....bytes_
14920 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43 4b 45 59  to_send = CACKEY
14930 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 20 65  _APDU_MTU;...} e
14940 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  lse {....bytes_t
14950 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c  o_send = tmpbufl
14960 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f  en;...}....send_
14970 72 65 74 20 3d 20 43 41 43 4b 45 59 5f 50 43 53  ret = CACKEY_PCS
14980 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a 09 09 73  C_E_GENERIC;...s
14990 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20  witch (id_type) 
149a0 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
149b0 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
149c0 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20  ..if (tmpbuflen 
149d0 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  > CACKEY_APDU_MT
149e0 55 29 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30  U) {......p1 = 0
149f0 78 38 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30  x80;......le = 0
14a00 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  x00;.....} else 
14a10 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78 30 30  {......p1 = 0x00
14a20 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30  ;......le = 0x00
14a30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e  ;.....}......sen
14a40 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
14a50 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
14a60 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
14a70 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49  L_PLATFORM, GSCI
14a80 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52  S_INSTR_SIGNDECR
14a90 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c 20 62  YPT, p1, 0x00, b
14aa0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d  ytes_to_send, tm
14ab0 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63  pbuf, le, &respc
14ac0 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d  ode, outbuf, &tm
14ad0 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09  poutbuflen);....
14ae0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
14af0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
14b00 49 56 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62  IV:.....if (tmpb
14b10 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
14b20 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09  PDU_MTU) {......
14b30 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 09  class = 0x10;...
14b40 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
14b50 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
14b60 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f 43 4c  class = GSCIS_CL
14b70 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09 09 09  ASS_ISO7816;....
14b80 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09 09 09  ..le = 256;.....
14b90 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20  }......send_ret 
14ba0 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
14bb0 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20  du(slot, class, 
14bc0 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49  NISTSP800_73_3_I
14bd0 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49  NSTR_GENAUTH, NI
14be0 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47  STSP800_78_3_ALG
14bf0 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65 6e 74  O_RSA2048, ident
14c00 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
14c10 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79  ty->card.piv.key
14c20 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65  _id, bytes_to_se
14c30 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20  nd, tmpbuf, le, 
14c40 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75  &respcode, outbu
14c50 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e  f, &tmpoutbuflen
14c60 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
14c70 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
14c80 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a  TYPE_CERT_ONLY:.
14c90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
14ca0 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
14cb0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
14cc0 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 66 72 65  OK) {....if (fre
14cd0 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
14ce0 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
14cf0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
14d00 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  _s);.....}....}.
14d10 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ..../* End trans
14d20 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
14d30 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
14d40 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
14d50 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
14d60 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
14d70 52 59 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  RY) {.....CACKEY
14d80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
14d90 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c  DPU Sending Fail
14da0 65 64 20 2d 2d 20 72 65 74 72 79 69 6e 67 2e 22  ed -- retrying."
14db0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 63  );......return(c
14dc0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
14dd0 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79  t(slot, identity
14de0 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 2c 20 6f  , buf, buflen, o
14df0 75 74 62 75 66 2c 20 6f 75 74 62 75 66 6c 65 6e  utbuf, outbuflen
14e00 2c 20 70 61 64 49 6e 70 75 74 2c 20 75 6e 70 61  , padInput, unpa
14e10 64 4f 75 74 70 75 74 29 29 3b 0a 09 09 09 7d 0a  dOutput));....}.
14e20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14e30 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65  _PRINTF("ADPU Se
14e40 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20  nding Failed -- 
14e50 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
14e60 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 72  or.");.....if (r
14e70 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  espcode == 0x698
14e80 32 20 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d 3d  2 || respcode ==
14e90 20 30 78 36 65 30 30 20 7c 7c 20 72 65 73 70 63   0x6e00 || respc
14ea0 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b  ode == 0x6d00) {
14eb0 0a 09 09 09 09 69 66 20 28 72 65 73 70 63 6f 64  .....if (respcod
14ec0 65 20 3d 3d 20 30 78 36 65 30 30 29 20 7b 0a 09  e == 0x6e00) {..
14ed0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14ee0 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 5c 22 57  _PRINTF("Got \"W
14ef0 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c 20 74 68  RONG CLASS\", th
14f00 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  is means we are 
14f10 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77  talking to the w
14f20 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b  rong object (lik
14f30 65 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  ely because the 
14f40 63 61 72 64 20 77 65 6e 74 20 61 77 61 79 29 20  card went away) 
14f50 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a  -- resetting");.
14f60 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 72  ....} else if (r
14f70 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 64 30  espcode == 0x6d0
14f80 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  0) {......CACKEY
14f90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47  _DEBUG_PRINTF("G
14fa0 6f 74 20 5c 22 49 4e 56 41 4c 49 44 20 49 4e 53  ot \"INVALID INS
14fb0 54 52 55 43 54 49 4f 4e 5c 22 2c 20 74 68 69 73  TRUCTION\", this
14fc0 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 74 61   means we are ta
14fd0 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f  lking to the wro
14fe0 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c  ng object (likel
14ff0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  y because the ca
15000 72 64 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d  rd went away) --
15010 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a 09 09   resetting");...
15020 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
15030 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15040 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74  NTF("Security st
15050 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66  atus not satisif
15060 69 65 64 20 28 72 65 73 70 63 6f 64 65 20 3d 20  ied (respcode = 
15070 30 78 25 30 34 78 29 2e 20 20 52 65 74 75 72 6e  0x%04x).  Return
15080 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20  ing NEEDLOGIN", 
15090 28 69 6e 74 29 20 72 65 73 70 63 6f 64 65 29 3b  (int) respcode);
150a0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b  .....}......cack
150b0 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
150c0 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 63  et(slot);......c
150d0 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64  ackey_detect_and
150e0 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70  _select_root_app
150f0 6c 65 74 28 73 6c 6f 74 2c 20 43 41 43 4b 45 59  let(slot, CACKEY
15100 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
15110 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f  );......slot->to
15120 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
15130 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
15140 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
15150 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
15160 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  GIN);....}.....i
15170 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
15180 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
15190 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
151a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
151b0 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e  NTF("Token absen
151c0 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54 4f  t.  Returning TO
151d0 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09  KENABSENT");....
151e0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
151f0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
15200 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
15210 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
15220 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09  BSENT);....}....
15230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15240 49 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20  INTF("Something 
15250 77 65 6e 74 20 77 72 6f 6e 67 20 64 75 72 69 6e  went wrong durin
15260 67 20 73 69 67 6e 69 6e 67 2c 20 72 65 73 65 74  g signing, reset
15270 74 69 6e 67 20 74 68 65 20 73 6c 6f 74 20 61 6e  ting the slot an
15280 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
15290 20 62 65 73 74 2e 22 29 3b 0a 0a 09 09 09 63 61   best.");.....ca
152a0 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
152b0 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63 6b  nect();.....cack
152c0 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
152d0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 64 65  );.....cackey_de
152e0 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f  tect_and_select_
152f0 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  root_applet(slot
15300 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  , CACKEY_ID_TYPE
15310 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 09 09 72  _UNKNOWN);.....r
15320 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
15330 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
15340 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62  }....tmpbuf += b
15350 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09  ytes_to_send;...
15360 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74  tmpbuflen -= byt
15370 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f  es_to_send;....o
15380 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62  utbuf += tmpoutb
15390 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c  uflen;...outbufl
153a0 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c  en -= tmpoutbufl
153b0 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20  en;...retval += 
153c0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d  tmpoutbuflen;..}
153d0 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
153e0 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62  uf) {...if (tmpb
153f0 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28  uf_s) {....free(
15400 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09  tmpbuf_s);...}..
15410 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74  }...outbuf = out
15420 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20  buf_s;.../* End 
15430 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
15440 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
15450 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
15460 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
15470 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
15480 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
15490 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
154a0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
154b0 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
154c0 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
154d0 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
154e0 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
154f0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
15500 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
15510 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
15520 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
15530 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
15540 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
15550 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
15560 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
15570 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65  f.#endif.../* We
15580 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68 65   must remove the
15590 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65 74   "7C" tag to get
155a0 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75 72   to the signatur
155b0 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  e */..switch (id
155c0 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
155d0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
155e0 49 56 3a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  IV:....outbuf_le
155f0 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
15600 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
15610 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
15620 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
15630 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c  _len, 0x7C, NULL
15640 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
15650 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
15660 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
15670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15680 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
15690 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
156a0 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
156b0 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 37  ON was not a 0x7
156c0 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67  C tag, returning
156d0 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
156e0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
156f0 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20  ...}.....retval 
15700 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09  = outbuf_len;...
15710 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
15720 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
15730 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
15740 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
15750 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
15760 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x82, NULL,  &o
15770 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
15780 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
15790 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
157a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
157b0 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
157c0 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
157d0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
157e0 73 20 6e 6f 74 20 61 20 30 78 38 32 20 77 69 74  s not a 0x82 wit
157f0 68 69 6e 20 61 20 30 78 37 43 20 74 61 67 2c 20  hin a 0x7C tag, 
15800 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
15810 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74  lure");......ret
15820 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09  urn(-1);....}...
15830 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75  ..retval = outbu
15840 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b  f_len;.....break
15850 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
15860 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 63  ID_TYPE_CAC:...c
15870 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
15880 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
15890 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20  .break;..}.../* 
158a0 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09  Unpad reply */..
158b0 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74 29  if (unpadOutput)
158c0 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c 20   {...if (retval 
158d0 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  < 3) {....CACKEY
158e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
158f0 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c  eply is too smal
15900 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61 62  l, we are not ab
15910 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70  le to unpad -- p
15920 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20  assing back and 
15930 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62  hoping for the b
15940 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b  est!");.....CACK
15950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15960 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
15970 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
15980 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
15990 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09  ong) retval);...
159a0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
159b0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62  ...}....if (outb
159c0 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20 7b  uf[0] != 0x00) {
159d0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
159e0 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f 67  _PRINTF("Unrecog
159f0 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73 63  nized padding sc
15a00 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67 20  heme -- passing 
15a10 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
15a20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
15a30 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15a40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15a50 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
15a60 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
15a70 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
15a80 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
15a90 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
15aa0 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74  .blocktype = out
15ab0 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f  buf[1];...unpado
15ac0 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77  ffset = 0;....sw
15ad0 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65 29  itch (blocktype)
15ae0 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30 3a   {....case 0x00:
15af0 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
15b00 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66 69  Scheme 1, the fi
15b10 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  rst non-zero byt
15b20 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  e is the start o
15b30 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f  f data */.....fo
15b40 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
15b50 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
15b60 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
15b70 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
15b80 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
15b90 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30 29  offset] != 0x00)
15ba0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
15bb0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
15bc0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
15bd0 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x01:...../* Pad
15be0 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20 70  ding Scheme 2, p
15bf0 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78 46  ad bytes are 0xF
15c00 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78  F followed by 0x
15c10 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  00 */.....for (u
15c20 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
15c30 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
15c40 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
15c50 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
15c60 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
15c70 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a 09  et] != 0xFF) {..
15c80 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
15c90 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20  unpadoffset] == 
15ca0 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09 75  0x00) {........u
15cb0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
15cc0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15cd0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
15ce0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15cf0 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
15d00 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75  padding data fou
15d10 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  nd, returning in
15d20 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64   failure, should
15d30 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30 20   have been 0x00 
15d40 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28  found 0x%02x", (
15d50 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75  unsigned int) ou
15d60 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
15d70 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74 75  ]);.........retu
15d80 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a  rn(-1);.......}.
15d90 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
15da0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15db0 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
15dc0 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
15dd0 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
15de0 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
15df0 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46 46  d have been 0xFF
15e00 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
15e10 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
15e20 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
15e30 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74 75  t]);........retu
15e40 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09  rn(-1);......}..
15e50 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
15e60 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
15e70 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
15e80 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65 73  eme 3, pad bytes
15e90 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69   are non-zero fi
15ea0 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66 6f  rst zero byte fo
15eb0 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65 72  und is the seper
15ec0 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09 09  ator byte */....
15ed0 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
15ee0 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
15ef0 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
15f00 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
15f10 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
15f20 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78  padoffset] == 0x
15f30 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70 61  00) {.......unpa
15f40 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
15f50 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
15f60 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
15f70 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61  ...}....if (unpa
15f80 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61 6c  doffset > retval
15f90 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
15fa0 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
15fb0 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  et greater than 
15fc0 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72  reply size, abor
15fd0 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66 66  ting.  (unpadoff
15fe0 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76 61  set = %lu, retva
15ff0 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  l = %lu)", (unsi
16000 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64  gned long) unpad
16010 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e 65  offset, (unsigne
16020 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b  d long) retval);
16030 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
16040 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
16050 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
16060 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c  added:", outbuf,
16070 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
16080 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73  val -= unpadoffs
16090 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75  et;...memmove(ou
160a0 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 75  tbuf, outbuf + u
160b0 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74 76  npadoffset, retv
160c0 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  al);....CACKEY_D
160d0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
160e0 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75  npadded:", outbu
160f0 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  f, retval);..}..
16100 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16110 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
16120 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
16130 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
16140 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
16150 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
16160 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  val);.}../*. * S
16170 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
16180 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
16190 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
161a0 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
161b0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
161c0 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
161d0 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
161e0 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
161f0 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
16200 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
16210 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
16220 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
16230 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
16240 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30  D reader_len = 0
16250 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f  , state = 0, pro
16260 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c  tocol = 0, atr_l
16270 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41  en;..BYTE atr[MA
16280 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f  X_ATR_SIZE];..LO
16290 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73  NG status_ret, s
162a0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
162b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
162c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
162d0 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69  );...if (slot->i
162e0 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43  nternal) {...CAC
162f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16300 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  ("Returning toke
16310 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72  n present (inter
16320 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09  nal token)");...
16330 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
16340 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
16350 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  NT);..}...pcsc_c
16360 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
16370 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
16380 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
16390 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
163a0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
163b0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
163c0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
163d0 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
163e0 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
163f0 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b   token absent");
16400 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
16410 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
16420 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  SENT);..}...CACK
16430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16440 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74  "Calling SCardSt
16450 61 74 75 73 28 29 20 74 6f 20 64 65 74 65 72 6d  atus() to determ
16460 69 6e 65 20 63 61 72 64 20 73 74 61 74 75 73 22  ine card status"
16470 29 3b 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73  );...atr_len = s
16480 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61  izeof(atr);..sta
16490 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
164a0 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
164b0 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
164c0 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
164d0 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
164e0 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69  , &atr_len);...i
164f0 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d  f (status_ret ==
16500 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
16510 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43  _HANDLE) {...CAC
16520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16530 28 22 53 43 61 72 64 53 74 61 74 75 73 28 29 20  ("SCardStatus() 
16540 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
16550 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c  _INVALID_HANDLE,
16560 20 6d 61 72 6b 69 6e 67 20 61 73 20 6e 6f 74 20   marking as not 
16570 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65  already connecte
16580 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61  d and trying aga
16590 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d  in");...cackey_m
165a0 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
165b0 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f  lot);....pcsc_co
165c0 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
165d0 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
165e0 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73  slot);...if (pcs
165f0 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
16600 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
16610 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
16620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
16630 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  ble to connect t
16640 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
16650 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
16660 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
16670 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
16680 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09  ABSENT);...}....
16690 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
166a0 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61  NTF("Calling SCa
166b0 72 64 53 74 61 74 75 73 28 29 20 61 67 61 69 6e  rdStatus() again
166c0 22 29 3b 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d  ");....atr_len =
166d0 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09   sizeof(atr);...
166e0 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
166f0 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
16700 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
16710 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
16720 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
16730 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
16740 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  .}...if (status_
16750 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
16760 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b  UCCESS) {...cack
16770 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
16780 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20  et(slot);....if 
16790 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53  (status_ret == S
167a0 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
167b0 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
167c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
167d0 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65  et required, ple
167e0 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a  ase hold...");..
167f0 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  ...scard_reconn_
16800 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63  ret = cackey_rec
16810 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
16820 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
16830 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54  _T0 | SCARD_PROT
16840 4f 43 4f 4c 5f 54 31 29 3b 0a 09 09 09 69 66 20  OCOL_T1);....if 
16850 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  (scard_reconn_re
16860 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
16870 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52  CESS) {...../* R
16880 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
16890 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
168a0 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
168b0 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
168c0 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
168d0 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
168e0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
168f0 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  h--;......slot->
16900 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
16910 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
16920 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  ...cackey_begin_
16930 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
16940 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
16950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16960 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73  F("Reset success
16970 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22  ful, requerying"
16980 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65  );.....status_re
16990 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
169a0 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
169b0 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
169c0 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
169d0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
169e0 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73  _len);.....if (s
169f0 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
16a00 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
16a10 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16a20 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20  G_PRINTF("Still 
16a30 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20  unable to query 
16a40 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74  card status, ret
16a50 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
16a60 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75  ent.  SCardStatu
16a70 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  s() = %s", CACKE
16a80 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
16a90 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61  RDERR_TO_STR(sta
16aa0 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  tus_ret));......
16ab0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
16ac0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
16ad0 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  T);.....}....} e
16ae0 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
16af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
16b00 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65  nable to reconne
16b10 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
16b20 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
16b30 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e  nt.  SCardReconn
16b40 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43  ect() = %s", CAC
16b50 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
16b60 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
16b70 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29  card_reconn_ret)
16b80 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
16b90 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
16ba0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
16bb0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
16bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16bd0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65  F("Unable to que
16be0 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
16bf0 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
16c00 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
16c10 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
16c20 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
16c30 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
16c40 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
16c50 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
16c60 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
16c70 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  NT);...}..}...if
16c80 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44   ((state & SCARD
16c90 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52  _ABSENT) == SCAR
16ca0 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41  D_ABSENT) {...CA
16cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16cc0 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e  F("Card is absen
16cd0 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  t, returning tok
16ce0 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
16cf0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
16d00 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
16d10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
16d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16d30 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
16d40 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72  sent.");...retur
16d50 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
16d60 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d  TOKENPRESENT);.}
16d70 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
16d80 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
16d90 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
16da0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
16db0 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
16dc0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
16dd0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
16de0 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
16df0 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 74 5f  _ret cackey_set_
16e00 70 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  pin(struct cacke
16e10 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
16e20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
16e30 5f 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c  _pin, unsigned l
16e40 6f 6e 67 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 2c  ong old_pin_len,
16e50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16e60 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  pin, unsigned lo
16e70 6e 67 20 70 69 6e 5f 6c 65 6e 29 20 7b 0a 09 73  ng pin_len) {..s
16e80 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
16e90 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
16ea0 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
16eb0 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f  signed char cac_
16ec0 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20  pin[8] = {0xFF, 
16ed0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
16ee0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
16ef0 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69  FF, 0xFF};..unsi
16f00 67 6e 65 64 20 63 68 61 72 20 6f 6c 64 5f 63 61  gned char old_ca
16f10 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
16f20 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
16f30 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
16f40 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e  0xFF, 0xFF};..un
16f50 73 69 67 6e 65 64 20 63 68 61 72 20 70 69 6e 5f  signed char pin_
16f60 75 70 64 61 74 65 5b 73 69 7a 65 6f 66 28 63 61  update[sizeof(ca
16f70 63 5f 70 69 6e 29 20 2b 20 73 69 7a 65 6f 66 28  c_pin) + sizeof(
16f80 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 5d 3b 0a 09  old_cac_pin)];..
16f90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
16fa0 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36  m_certs;..uint16
16fb0 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  _t response_code
16fc0 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
16fd0 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e  aining;..int sen
16fe0 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f  d_ret;..int key_
16ff0 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30  reference = 0x00
17000 3b 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c  ;.../* Apparentl
17010 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20  y, CAC PINs are 
17020 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65  *EXACTLY* 8 byte
17030 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69  s long -- pad wi
17040 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73  th 0xFF if too s
17050 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
17060 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d  _len >= 8) {...m
17070 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
17080 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20  in, 8);..} else 
17090 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
170a0 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e  in, pin, pin_len
170b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f  );..}...if (old_
170c0 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a  pin_len >= 8) {.
170d0 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f 63 61 63  ..memcpy(old_cac
170e0 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 2c 20 38  _pin, old_pin, 8
170f0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
17100 65 6d 63 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69  emcpy(old_cac_pi
17110 6e 2c 20 6f 6c 64 5f 70 69 6e 2c 20 6f 6c 64 5f  n, old_pin, old_
17120 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  pin_len);..}.../
17130 2a 20 43 6f 6e 63 61 74 65 6e 61 74 65 20 62 6f  * Concatenate bo
17140 74 68 20 50 49 4e 73 20 74 6f 67 65 74 68 65 72  th PINs together
17150 20 74 6f 20 73 65 6e 64 20 61 73 20 61 20 73 69   to send as a si
17160 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  ngle instruction
17170 20 2a 2f 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f   */..memcpy(pin_
17180 75 70 64 61 74 65 2c 20 6f 6c 64 5f 63 61 63 5f  update, old_cac_
17190 70 69 6e 2c 20 73 69 7a 65 6f 66 28 6f 6c 64 5f  pin, sizeof(old_
171a0 63 61 63 5f 70 69 6e 29 29 3b 0a 09 6d 65 6d 63  cac_pin));..memc
171b0 70 79 28 70 69 6e 5f 75 70 64 61 74 65 20 2b 20  py(pin_update + 
171c0 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70  sizeof(old_cac_p
171d0 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 73 69  in), cac_pin, si
171e0 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 29 3b 0a  zeof(cac_pin));.
171f0 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e 73  ../* Reject PINs
17200 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f 20 73   which are too s
17210 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
17220 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41  _len < 5) {...CA
17230 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17240 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4e 65 77  F("Rejecting New
17250 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f   PIN which is to
17260 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20  o short (length 
17270 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61  = %lu, must be a
17280 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f  tleast 5)", pin_
17290 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
172a0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
172b0 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  DPIN);..}...if (
172c0 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3c 20 35 29  old_pin_len < 5)
172d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
172e0 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74  G_PRINTF("Reject
172f0 69 6e 67 20 4f 6c 64 20 50 49 4e 20 77 68 69 63  ing Old PIN whic
17300 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28  h is too short (
17310 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75  length = %lu, mu
17320 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29  st be atleast 5)
17330 22 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b  ", old_pin_len);
17340 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
17350 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
17360 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20 61 75  ;..}.../* PIV au
17370 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 75 73 65  thentication use
17380 73 20 61 20 22 6b 65 79 5f 72 65 66 65 72 65 6e  s a "key_referen
17390 63 65 22 20 6f 66 20 30 78 38 30 20 2a 2f 0a 09  ce" of 0x80 */..
173a0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
173b0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
173c0 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20  rts(slot, NULL, 
173d0 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66  &num_certs);..if
173e0 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 20   (num_certs > 0 
173f0 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  && pcsc_identiti
17400 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
17410 73 77 69 74 63 68 20 28 70 63 73 63 5f 69 64 65  switch (pcsc_ide
17420 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79  ntities[0].id_ty
17430 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41  pe) {....case CA
17440 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
17450 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
17460 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61  UG_PRINTF("We ha
17470 76 65 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20  ve PIV card, so 
17480 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  we will attempt 
17490 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65 20  to authenticate 
174a0 75 73 69 6e 67 20 74 68 65 20 50 49 56 20 41 70  using the PIV Ap
174b0 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65  plication key re
174c0 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09  ference");......
174d0 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20  key_reference = 
174e0 30 78 38 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b  0x80;.....break;
174f0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
17500 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63  .break;...}....c
17510 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
17520 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
17530 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
17540 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 61  ..}.../* Issue a
17550 20 53 65 74 20 50 49 4e 20 28 43 48 41 4e 47 45   Set PIN (CHANGE
17560 20 52 45 46 45 52 45 4e 43 45 29 20 2a 2f 0a 09   REFERENCE) */..
17570 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
17580 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
17590 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
175a0 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
175b0 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52 45  TR_CHANGE_REFERE
175c0 4e 43 45 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72  NCE, 0x00, key_r
175d0 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66  eference, sizeof
175e0 28 70 69 6e 5f 75 70 64 61 74 65 29 2c 20 70 69  (pin_update), pi
175f0 6e 5f 75 70 64 61 74 65 2c 20 30 78 30 30 2c 20  n_update, 0x00, 
17600 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
17610 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  NULL, NULL);...i
17620 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
17630 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
17640 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e   {...if ((respon
17650 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30  se_code & 0x63C0
17660 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09  ) == 0x63C0) {..
17670 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  ..tries_remainin
17680 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  g = (response_co
17690 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43  de & 0xF);.....C
176a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
176b0 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
176c0 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20  tion failed, %i 
176d0 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22  tries remaining"
176e0 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  , tries_remainin
176f0 67 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  g);.....return(C
17700 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
17710 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  PIN);...}....if 
17720 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d  (response_code =
17730 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43  = 0x6983) {....C
17740 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17750 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
17760 74 20 50 49 4e 2c 20 64 65 76 69 63 65 20 69 73  t PIN, device is
17770 20 6c 6f 63 6b 65 64 20 6f 72 20 63 68 61 6e 67   locked or chang
17780 69 6e 67 20 74 68 65 20 50 49 4e 20 69 73 20 64  ing the PIN is d
17790 69 73 61 62 6c 65 64 22 29 3b 0a 0a 09 09 09 72  isabled");.....r
177a0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
177b0 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  C_E_LOCKED);...}
177c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
177d0 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
177e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
177f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
17800 20 43 68 61 6e 67 65 20 73 75 63 63 65 65 64 65   Change succeede
17810 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  d");...return(CA
17820 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
17830 0a 0a 09 2f 2a 20 44 69 73 61 62 6c 65 20 61 20  .../* Disable a 
17840 77 61 72 6e 69 6e 67 2c 20 73 69 6e 63 65 20 74  warning, since t
17850 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  his is only used
17860 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 20 2a   in debug mode *
17870 2f 0a 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  /..tries_remaini
17880 6e 67 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  ng = tries_remai
17890 6e 69 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  ning;.}../*. * S
178a0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
178b0 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
178c0 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
178d0 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
178e0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
178f0 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
17900 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
17910 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
17920 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74 20  ey_login(struct 
17930 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
17940 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
17950 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20   *pin, unsigned 
17960 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e  long pin_len, in
17970 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  t *tries_remaini
17980 6e 67 5f 70 2c 20 69 6e 74 20 72 65 74 72 69 65  ng_p, int retrie
17990 73 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  s) {..struct cac
179a0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
179b0 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
179c0 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  es;..unsigned ch
179d0 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20  ar cac_pin[8] = 
179e0 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46  {0xFF, 0xFF, 0xF
179f0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
17a00 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d  xFF, 0xFF, 0xFF}
17a10 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
17a20 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e   num_certs;..uin
17a30 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63  t16_t response_c
17a40 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f  ode;..int tries_
17a50 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20  remaining;..int 
17a60 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b  send_ret;..int k
17a70 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30  ey_reference = 0
17a80 78 30 30 2c 20 68 61 76 65 5f 70 69 76 20 3d 20  x00, have_piv = 
17a90 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 63  0;..cackey_ret c
17aa0 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 74 6f 6b 65  onnect_ret, toke
17ab0 6e 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49 6e 64 69  n_ret;.../* Indi
17ac0 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20  cate that we do 
17ad0 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68  not know about h
17ae0 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72  ow many tries ar
17af0 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09  e remaining */..
17b00 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
17b10 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65  ing_p) {...*trie
17b20 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20  s_remaining_p = 
17b30 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61  -1;..}.../* Appa
17b40 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73  rently, CAC PINs
17b50 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38   are *EXACTLY* 8
17b60 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70   bytes long -- p
17b70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20  ad with 0xFF if 
17b80 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
17b90 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20   (pin_len >= 8) 
17ba0 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
17bb0 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  in, pin, 8);..} 
17bc0 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
17bd0 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69  cac_pin, pin, pi
17be0 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  n_len);..}.../* 
17bf0 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63  Reject PINs whic
17c00 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20  h are too short 
17c10 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
17c20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 5) {...CACKEY_
17c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17c40 6a 65 63 74 69 6e 67 20 50 49 4e 20 77 68 69 63  jecting PIN whic
17c50 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28  h is too short (
17c60 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75  length = %lu, mu
17c70 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29  st be atleast 5)
17c80 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09  ", pin_len);....
17c90 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
17ca0 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d  SC_E_BADPIN);..}
17cb0 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e  .../* PIV authen
17cc0 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20  tication uses a 
17cd0 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20  "key_reference" 
17ce0 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63  of 0x80 */..pcsc
17cf0 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
17d00 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
17d10 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
17d20 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75  _certs);..if (nu
17d30 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70  m_certs > 0 && p
17d40 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
17d50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74  = NULL) {...swit
17d60 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  ch (pcsc_identit
17d70 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20  ies[0].id_type) 
17d80 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
17d90 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
17da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17db0 52 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 50  RINTF("We have P
17dc0 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77  IV card, so we w
17dd0 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ill attempt to a
17de0 75 74 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e  uthenticate usin
17df0 67 20 74 68 65 20 50 49 56 20 41 70 70 6c 69 63  g the PIV Applic
17e00 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65  ation key refere
17e10 6e 63 65 22 29 3b 0a 0a 09 09 09 09 68 61 76 65  nce");......have
17e20 5f 70 69 76 20 3d 20 31 3b 0a 09 09 09 09 62 72  _piv = 1;.....br
17e30 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  eak;....default:
17e40 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
17e50 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
17e60 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
17e70 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
17e80 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 61   1);..}...if (ha
17e90 76 65 5f 70 69 76 20 3d 3d 20 31 29 20 7b 0a 09  ve_piv == 1) {..
17ea0 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d  .key_reference =
17eb0 20 30 78 38 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 49   0x80;..}.../* I
17ec0 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20  ssue PIN Verify 
17ed0 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
17ee0 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
17ef0 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
17f00 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
17f10 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30  _INSTR_VERIFY, 0
17f20 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e  x00, key_referen
17f30 63 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  ce, sizeof(cac_p
17f40 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78  in), cac_pin, 0x
17f50 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f  00, &response_co
17f60 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  de, NULL, NULL);
17f70 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
17f80 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
17f90 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65  _OK) {...if ((re
17fa0 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
17fb0 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29  63C0) == 0x63C0)
17fc0 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61   {....tries_rema
17fd0 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73  ining = (respons
17fe0 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a  e_code & 0xF);..
17ff0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18000 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
18010 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c  fication failed,
18020 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e   %i tries remain
18030 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61  ing", tries_rema
18040 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28  ining);.....if (
18050 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
18060 70 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f  p) {.....*tries_
18070 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72  remaining_p = tr
18080 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09  ies_remaining;..
18090 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
180a0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
180b0 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  PIN);...}....if 
180c0 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d  (response_code =
180d0 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43  = 0x6983) {....C
180e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
180f0 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
18100 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76  tion failed, dev
18110 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b  ice is locked");
18120 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
18130 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
18140 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
18150 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30  sponse_code == 0
18160 78 36 64 30 30 29 20 7b 0a 09 09 09 69 66 20 28  x6d00) {....if (
18170 72 65 74 72 69 65 73 20 3e 20 30 29 20 7b 0a 09  retries > 0) {..
18180 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18190 50 52 49 4e 54 46 28 22 47 6f 74 20 49 53 4f 20  PRINTF("Got ISO 
181a0 37 38 31 36 20 52 65 73 70 6f 6e 73 65 20 5c 22  7816 Response \"
181b0 36 44 20 30 30 5c 22 20 69 6e 20 72 65 73 70 6f  6D 00\" in respo
181c0 6e 73 65 20 74 6f 20 61 20 56 45 52 49 46 59 20  nse to a VERIFY 
181d0 72 65 71 75 65 73 74 2e 22 29 3b 0a 09 09 09 09  request.");.....
181e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
181f0 4e 54 46 28 22 57 65 20 64 69 64 20 6e 6f 74 20  NTF("We did not 
18200 65 78 70 65 63 74 20 74 68 69 73 20 62 65 63 61  expect this beca
18210 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 6d 65  use it is not me
18220 6e 74 69 6f 6e 65 64 20 69 6e 20 4e 49 53 54 20  ntioned in NIST 
18230 53 50 20 38 30 30 2d 37 33 2d 33 20 50 61 72 74  SP 800-73-3 Part
18240 20 32 20 53 65 63 74 69 6f 6e 20 33 2e 32 2e 31   2 Section 3.2.1
18250 20 6f 72 20 47 53 43 2d 49 53 20 76 32 2e 31 22   or GSC-IS v2.1"
18260 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
18270 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 61  BUG_PRINTF("We a
18280 72 65 20 67 6f 69 6e 67 20 74 6f 20 74 72 79 20  re going to try 
18290 74 6f 20 72 65 73 65 74 20 74 68 65 20 63 61 72  to reset the car
182a0 64 20 61 6e 64 20 73 65 6c 65 63 74 20 74 68 65  d and select the
182b0 20 61 70 70 6c 65 74 20 61 67 61 69 6e 2e 22 29   applet again.")
182c0 3b 0a 0a 09 09 09 09 69 66 20 28 6e 75 6d 5f 63  ;......if (num_c
182d0 65 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63  erts > 0 && pcsc
182e0 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
182f0 55 4c 4c 29 20 7b 0a 09 09 09 09 09 63 61 63 6b  ULL) {......cack
18300 65 79 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65  ey_detect_and_se
18310 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74  lect_root_applet
18320 28 73 6c 6f 74 2c 20 70 63 73 63 5f 69 64 65 6e  (slot, pcsc_iden
18330 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70  tities[0].id_typ
18340 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  e);.....}......c
18350 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
18360 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
18370 09 09 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  ..connect_ret = 
18380 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
18390 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69  ard(slot);.....i
183a0 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  f (connect_ret !
183b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
183c0 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  OK) {......CACKE
183d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
183e0 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
183f0 65 63 74 20 61 66 74 65 72 20 72 65 73 65 74 74  ect after resett
18400 69 6e 67 20 74 68 65 20 63 61 72 64 2c 20 72 65  ing the card, re
18410 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
18420 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72  .");.......retur
18430 6e 28 63 6f 6e 6e 65 63 74 5f 72 65 74 29 3b 0a  n(connect_ret);.
18440 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
18450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18460 56 65 72 69 66 79 69 6e 67 20 77 65 20 73 74 69  Verifying we sti
18470 6c 6c 20 68 61 76 65 20 61 20 74 6f 6b 65 6e 2e  ll have a token.
18480 22 29 3b 0a 09 09 09 09 74 6f 6b 65 6e 5f 72 65  ");.....token_re
18490 74 20 3d 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  t = cackey_token
184a0 5f 70 72 65 73 65 6e 74 28 73 6c 6f 74 29 3b 0a  _present(slot);.
184b0 09 09 09 09 69 66 20 28 74 6f 6b 65 6e 5f 72 65  ....if (token_re
184c0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
184d0 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
184e0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
184f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
18500 65 6e 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20  en not present, 
18510 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
18520 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  or.");.......ret
18530 75 72 6e 28 74 6f 6b 65 6e 5f 72 65 74 29 3b 0a  urn(token_ret);.
18540 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
18550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18560 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67 69 6e 20  Trying to login 
18570 61 67 61 69 6e 22 29 3b 0a 09 09 09 09 72 65 74  again");.....ret
18580 75 72 6e 28 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  urn(cackey_login
18590 28 73 6c 6f 74 2c 20 70 69 6e 2c 20 70 69 6e 5f  (slot, pin, pin_
185a0 6c 65 6e 2c 20 74 72 69 65 73 5f 72 65 6d 61 69  len, tries_remai
185b0 6e 69 6e 67 5f 70 2c 20 72 65 74 72 69 65 73 20  ning_p, retries 
185c0 2d 20 31 29 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  - 1));....}...}.
185d0 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
185e0 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
185f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
18600 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
18610 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63  Verification suc
18620 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75  ceeded");...retu
18630 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
18640 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
18650 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
18660 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
18670 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
18680 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
18690 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
186a0 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
186b0 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
186c0 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
186d0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f  pcsc_identity_to
186e0 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61  _label(struct ca
186f0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
18700 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
18710 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62  signed char *lab
18720 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  el_buf, unsigned
18730 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f   long label_buf_
18740 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  len) {..unsigned
18750 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74   long certificat
18760 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61  e_len;..void *la
18770 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20  bel_asn1;..void 
18780 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69  *certificate;..i
18790 6e 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  nt x509_read_ret
187a0 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  ;...certificate 
187b0 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
187c0 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
187d0 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
187e0 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
187f0 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
18800 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30  tificate_len < 0
18810 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  ) {...return(-1)
18820 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64  ;..}...x509_read
18830 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
18840 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61  ubject(certifica
18850 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
18860 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26  len, (void **) &
18870 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66  label_asn1);..if
18880 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
18890 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
188a0 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
188b0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64  ead_ret = x509_d
188c0 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65  n_to_string(labe
188d0 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61  l_asn1, x509_rea
188e0 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20  d_ret, (char *) 
188f0 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c  label_buf, label
18900 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b  _buf_len, "CN");
18910 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
18920 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35  ret <= 0) {...x5
18930 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
18940 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28  09_dn_to_string(
18950 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39  label_asn1, x509
18960 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72  _read_ret, (char
18970 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c   *) label_buf, l
18980 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55  abel_buf_len, NU
18990 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39  LL);....if (x509
189a0 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  _read_ret <= 0) 
189b0 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  {....return(-1);
189c0 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
189d0 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
189e0 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
189f0 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78  SSIZE_MAX..if (x
18a00 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f  509_read_ret > _
18a10 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
18a20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18a30 47 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72  G_PRINTF("x509_r
18a40 65 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20  ead_ret exceeds 
18a50 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
18a60 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
18a70 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
18a80 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d   x509_read_ret =
18a90 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
18aa0 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
18ab0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18ac0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b   x509_read_ret);
18ad0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
18ae0 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .}.#  endif.#end
18af0 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39  if...return(x509
18b00 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f  _read_ret);.}../
18b10 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
18b20 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
18b30 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
18b40 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a  x_create(void **
18b50 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
18b60 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
18b70 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
18b80 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
18b90 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
18ba0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
18bb0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18bc0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
18bd0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
18be0 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
18bf0 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
18c00 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
18c10 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
18c20 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74  alloc(sizeof(*pt
18c30 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09  hread_mutex));..
18c40 09 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75  .if (!pthread_mu
18c50 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  tex) {....CACKEY
18c60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
18c70 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  ailed to allocat
18c80 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09  e memory.");....
18c90 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
18ca0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
18cb0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
18cc0 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f  ex_init(pthread_
18cd0 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09  mutex, NULL);...
18ce0 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
18cf0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
18d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18d10 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
18d20 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64  _init() returned
18d30 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
18d40 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
18d50 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
18d60 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20  ..}....*mutex = 
18d70 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
18d80 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
18d90 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
18da0 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  eMutex) {....cus
18db0 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
18dc0 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
18dd0 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
18de0 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
18df0 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
18e00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18e10 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
18e20 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
18e30 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
18e40 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
18e50 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
18e60 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
18e70 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
18e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18e90 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
18ea0 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
18eb0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
18ec0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
18ed0 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
18ee0 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
18ef0 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20  mutex_lock(void 
18f00 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
18f10 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
18f20 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
18f30 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
18f40 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
18f50 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
18f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
18f70 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
18f80 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
18f90 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
18fa0 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
18fb0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
18fc0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
18fd0 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
18fe0 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
18ff0 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74  ad_mutex_lock(pt
19000 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09  hread_mutex);...
19010 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
19020 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
19030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19040 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
19050 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64  _lock() returned
19060 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
19070 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
19080 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
19090 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
190a0 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
190b0 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  LockMutex) {....
190c0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
190d0 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
190e0 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
190f0 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
19100 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
19110 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19120 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
19130 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
19140 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
19150 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
19160 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
19170 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
19180 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
19190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
191a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
191b0 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
191c0 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
191d0 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
191e0 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
191f0 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
19200 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64  utex_unlock(void
19210 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72   *mutex) {..pthr
19220 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
19230 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
19240 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
19250 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
19260 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
19270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19280 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
19290 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
192a0 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
192b0 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
192c0 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
192d0 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
192e0 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65   mutex;....pthre
192f0 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
19300 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
19310 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
19320 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
19330 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
19340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19350 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
19360 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74  tex_unlock() ret
19370 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
19380 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
19390 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
193a0 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  -1);...}..} else
193b0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
193c0 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
193d0 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
193e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
193f0 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d  gs.UnlockMutex(m
19400 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
19410 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
19420 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
19430 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19440 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  F("cackey_args.U
19450 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74  nlockMutex() ret
19460 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
19470 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
19480 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
19490 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
194a0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
194b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
194c0 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
194d0 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
194e0 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61  eturn(0);.}..sta
194f0 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45  tic CK_ATTRIBUTE
19500 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f  _PTR cackey_get_
19510 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42  attributes(CK_OB
19520 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63  JECT_CLASS objec
19530 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63  tclass, struct c
19540 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
19550 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
19560 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
19570 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c  ntity_num, CK_UL
19580 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
19590 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
195a0 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31  BOOL ck_true = 1
195b0 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  ;..static CK_BBO
195c0 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b  OL ck_false = 0;
195d0 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53  ..static CK_TRUS
195e0 54 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43  T ck_trusted = C
195f0 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41  K_TRUSTED_DELEGA
19600 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e  TOR;..CK_ULONG n
19610 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74  umattrs = 0, ret
19620 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41  val_count;..CK_A
19630 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75  TTRIBUTE_TYPE cu
19640 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43  rr_attr_type;..C
19650 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72  K_ATTRIBUTE curr
19660 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a  _attr, *retval;.
19670 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61  .CK_VOID_PTR pVa
19680 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  lue;..CK_ULONG u
19690 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f  lValueLen;..CK_O
196a0 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f  BJECT_CLASS ck_o
196b0 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b  bject_class;..CK
196c0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
196d0 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  E ck_certificate
196e0 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54  _type;..CK_KEY_T
196f0 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b  YPE ck_key_type;
19700 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63  ..CK_UTF8CHAR uc
19710 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53  TmpBuf[1024];..S
19720 48 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f  HA1Context sha1_
19730 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64  ctx;..MD5_CTX md
19740 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20  5_ctx;..uint8_t 
19750 73 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61  sha1_hash[SHA1Ha
19760 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f  shSize];..uint8_
19770 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61  t md5_hash[MD5Ha
19780 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e  shSize];..unsign
19790 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69  ed char *certifi
197a0 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63  cate;..ssize_t c
197b0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
197c0 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72   -1, x509_read_r
197d0 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f  et;..int pValue_
197e0 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  free;...CACKEY_D
197f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
19800 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73  led (objectClass
19810 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79   = %lu, identity
19820 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28  _num = %lu).", (
19830 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
19840 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e  bjectclass, iden
19850 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75  tity_num);...*pu
19860 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66  lCount = 0;...if
19870 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
19880 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
19890 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
198a0 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
198b0 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
198c0 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
198d0 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
198e0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
198f0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41  PE_TRUST) {...CA
19900 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19910 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
19920 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69  bjects (NULL), i
19930 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c  nvalid object cl
19940 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ass");....return
19950 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
19960 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20  Get Cert */..if 
19970 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
19980 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
19990 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
199a0 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
199b0 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
199c0 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64  identiy provided
199d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
199e0 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66  LL);..}...certif
199f0 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
19a00 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
19a10 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
19a20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
19a30 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
19a40 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
19a50 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74  en == -1 || cert
19a60 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29  ificate == NULL)
19a70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
19a80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
19a90 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
19aa0 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74  ULL), this ident
19ab0 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ity does not hav
19ac0 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69  e an X.509 certi
19ad0 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
19ae0 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69  d with it and wi
19af0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a  ll not work");..
19b00 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
19b10 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
19b20 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20  hat certificate 
19b30 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64  is ASN.1 encoded
19b40 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
19b50 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f  te */..if (x509_
19b60 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
19b70 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
19b80 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20  te_len, NULL) < 
19b90 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
19ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
19bb0 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
19bc0 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30  (NULL), the X.50
19bd0 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73  9 certificate as
19be0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
19bf0 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e  is identity is n
19c00 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72  ot valid");....r
19c10 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
19c20 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d  ..retval_count =
19c30 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d   64;..retval = m
19c40 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75  alloc(retval_cou
19c50 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
19c60 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75  val));...for (cu
19c70 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30  rr_attr_type = 0
19c80 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
19c90 20 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20 63   < 0xce5363bf; c
19ca0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29  urr_attr_type++)
19cb0 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74   {...if (curr_at
19cc0 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30  tr_type == 0x800
19cd0 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  ) {....curr_attr
19ce0 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33  _type = 0xce5363
19cf0 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75  00;...}....pValu
19d00 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56  e_free = 0;...pV
19d10 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
19d20 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
19d30 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69  LONG) -1;....swi
19d40 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74  tch (curr_attr_t
19d50 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
19d60 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41  KA_CLASS:.....CA
19d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19d80 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19d90 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53  tribute CKA_CLAS
19da0 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  S (0x%08lx) ..."
19db0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19dc0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
19dd0 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63  );......ck_objec
19de0 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74  t_class = object
19df0 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c  class;......pVal
19e00 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f  ue = &ck_object_
19e10 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c  class;.....ulVal
19e20 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
19e30 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b  k_object_class);
19e40 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19e50 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19e60 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
19e70 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
19e80 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f  ed long) *((CK_O
19e90 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70  BJECT_CLASS *) p
19ea0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
19eb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19ec0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19ed0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19ee0 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09   CKA_TOKEN:.....
19ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19f00 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19f10 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f  attribute CKA_TO
19f20 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  KEN (0x%08lx) ..
19f30 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19f40 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19f50 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
19f60 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
19f70 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
19f80 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
19f90 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19fa0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19fb0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
19fc0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
19fd0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
19fe0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
19ff0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1a000 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1a010 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1a020 09 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56  ...case CKA_PRIV
1a030 41 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ATE:.....CACKEY_
1a040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a050 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1a060 74 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28  te CKA_PRIVATE (
1a070 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1a080 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1a090 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1a0a0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1a0b0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
1a0c0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1a0d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a0e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1a0f0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1a100 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1a110 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  ot a Netscape tr
1a120 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1a130 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1a140 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1a150 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
1a160 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1a170 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
1a180 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a190 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a1a0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1a1b0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1a1c0 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1a1d0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1a1e0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1a1f0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1a200 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1a210 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45  .case CKA_TRUSTE
1a220 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  D:.....CACKEY_DE
1a230 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1a240 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1a250 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78   CKA_TRUSTED (0x
1a260 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1a270 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1a280 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1a290 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1a2a0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1a2b0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1a2c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a2d0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1a2e0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1a2f0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1a300 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1a310 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1a320 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1a330 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
1a340 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
1a350 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1a360 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
1a370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a380 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1a390 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1a3a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1a3b0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1a3c0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1a3d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1a3e0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1a3f0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1a400 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09  A_MODIFIABLE:...
1a410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a420 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1a430 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1a440 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30  MODIFIABLE (0x%0
1a450 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1a460 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1a470 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1a480 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
1a490 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
1a4a0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1a4b0 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
1a4c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a4d0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1a4e0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1a4f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a500 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1a510 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1a520 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a530 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1a540 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1a550 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09   CKA_LABEL:.....
1a560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a570 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1a580 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41  attribute CKA_LA
1a590 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BEL (0x%08lx) ..
1a5a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1a5b0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1a5c0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 69 64  pe);......if (id
1a5d0 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 20  entity->id_type 
1a5e0 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  == CACKEY_ID_TYP
1a5f0 45 5f 50 49 56 29 20 7b 0a 09 09 09 09 09 70 56  E_PIV) {......pV
1a600 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  alue = identity-
1a610 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 3b  >card.piv.label;
1a620 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1a630 20 3d 20 73 74 72 6c 65 6e 28 70 56 61 6c 75 65   = strlen(pValue
1a640 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
1a650 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1a660 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72  = snprintf((char
1a670 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69   *) ucTmpBuf, si
1a680 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20  zeof(ucTmpBuf), 
1a690 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c  "Identity #%lu",
1a6a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a6b0 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a   identity_num);.
1a6c0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63  .....pValue = uc
1a6d0 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 09 69 66  TmpBuf;.......if
1a6e0 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20   (ulValueLen >= 
1a6f0 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29  sizeof(ucTmpBuf)
1a700 29 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  ) {.......ulValu
1a710 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 09  eLen = 0;.......
1a720 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
1a730 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
1a740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a750 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1a760 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
1a770 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a780 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a790 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a7a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ....case CKA_VAL
1a7b0 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  UE:.....CACKEY_D
1a7c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1a7d0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1a7e0 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25  e CKA_VALUE (0x%
1a7f0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a800 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a810 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a820 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74  ..switch (object
1a830 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61  class) {......ca
1a840 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  se CKO_PRIVATE_K
1a850 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  EY:.......CACKEY
1a860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a870 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1a880 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1a890 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65 20  e are a private 
1a8a0 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  key.");........b
1a8b0 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
1a8c0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1a8d0 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ST:.......CACKEY
1a8e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a8f0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1a900 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1a910 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1a920 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1a930 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
1a940 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42  ....case CKO_PUB
1a950 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69  LIC_KEY:.......i
1a960 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
1a970 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
1a980 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
1a990 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79  = x509_to_pubkey
1a9a0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
1a9b0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
1a9c0 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09  pValue);........
1a9d0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
1a9e0 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09 09  t < 0) { .......
1a9f0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1aa00 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ........} else {
1aa10 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75 65  .........ulValue
1aa20 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
1aa30 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09  ret;........}...
1aa40 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72 65  ....}........bre
1aa50 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ak;......case CK
1aa60 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  O_CERTIFICATE:..
1aa70 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65  .....pValue = ce
1aa80 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09  rtificate;......
1aa90 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65  .ulValueLen = ce
1aaa0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
1aab0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1aac0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
1aad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1aae0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
1aaf0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
1ab00 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1ab10 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1ab20 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1ab30 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41  A_ISSUER:.....CA
1ab40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ab50 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1ab60 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55  tribute CKA_ISSU
1ab70 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
1ab80 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1ab90 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1aba0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1abb0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
1abc0 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
1abd0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
1abe0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1abf0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1ac00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1ac10 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1ac20 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1ac30 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
1ac40 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
1ac50 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1ac60 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1ac70 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1ac80 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1ac90 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1aca0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1acb0 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69  _to_issuer(certi
1acc0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
1acd0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
1ace0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
1acf0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
1ad00 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
1ad10 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
1ad20 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
1ad30 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
1ad40 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
1ad50 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
1ad60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1ad70 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
1ad80 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
1ad90 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1ada0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1adb0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1adc0 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a  A_SERIAL_NUMBER:
1add0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1ade0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1adf0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1ae00 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
1ae10 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1ae20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ae30 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1ae40 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1ae50 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
1ae60 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
1ae70 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
1ae80 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1ae90 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1aea0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1aeb0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1aec0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1aed0 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
1aee0 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65  cate or Netscape
1aef0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1af00 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1af10 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
1af20 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
1af30 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
1af40 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
1af50 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
1af60 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
1af70 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
1af80 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
1af90 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
1afa0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
1afb0 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
1afc0 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
1afd0 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
1afe0 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
1aff0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b000 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b010 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
1b020 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
1b030 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1b040 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1b050 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1b060 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43  A_SUBJECT:.....C
1b070 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b080 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1b090 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42  ttribute CKA_SUB
1b0a0 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e  JECT (0x%08lx) .
1b0b0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1b0c0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1b0d0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1b0e0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
1b0f0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
1b100 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b110 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b120 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1b130 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1b140 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
1b150 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ate");.......bre
1b160 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
1b170 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
1b180 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
1b190 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
1b1a0 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
1b1b0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
1b1c0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
1b1d0 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
1b1e0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
1b1f0 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
1b200 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
1b210 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
1b220 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
1b230 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
1b240 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
1b250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b260 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1b270 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
1b280 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b290 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1b2a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1b2b0 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43  se CKA_ID:.....C
1b2c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b2d0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1b2e0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20  ttribute CKA_ID 
1b2f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1b300 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b310 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1b320 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1b330 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
1b340 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1b350 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b360 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1b370 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1b380 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1b390 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1b3a0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1b3b0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1b3c0 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d  ...ucTmpBuf[0] =
1b3d0 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20   ((identity_num 
1b3e0 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66  + 1) >> 8) & 0xf
1b3f0 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  f;.....ucTmpBuf[
1b400 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f  1] =  (identity_
1b410 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b  num + 1) & 0xff;
1b420 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1b430 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c  ucTmpBuf;.....ul
1b440 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09  ValueLen = 2;...
1b450 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b460 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1b470 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1b480 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1b490 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1b4a0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1b4b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
1b4c0 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
1b4d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b4e0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1b4f0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1b500 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
1b510 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
1b520 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1b530 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1b540 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1b550 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
1b560 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
1b570 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b580 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1b590 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1b5a0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1b5b0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
1b5c0 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
1b5d0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
1b5e0 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
1b5f0 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20  one certificate 
1b600 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63  type */.....ck_c
1b610 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20  ertificate_type 
1b620 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09  = CKC_X_509;....
1b630 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63  ..pValue = &ck_c
1b640 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
1b650 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1b660 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74  = sizeof(ck_cert
1b670 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a  ificate_type);..
1b680 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b690 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1b6a0 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30  turning CKC_X_50
1b6b0 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  9 (%lu) (%p/%lu)
1b6c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1b6d0 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
1b6e0 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
1b6f0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
1b700 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1b710 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1b720 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1b730 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
1b740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b750 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1b760 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b   attribute CKA_K
1b770 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78  EY_TYPE (0x%08lx
1b780 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b790 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b7a0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1b7b0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
1b7c0 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
1b7d0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
1b7e0 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
1b7f0 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  Y) {......CACKEY
1b800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b810 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b820 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b830 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e  e are not a key.
1b840 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1b850 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
1b860 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
1b870 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09  ne key type */..
1b880 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d  ...ck_key_type =
1b890 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70   CKK_RSA;......p
1b8a0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f  Value = &ck_key_
1b8b0 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
1b8c0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1b8d0 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09  _key_type);.....
1b8e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b8f0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1b900 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c  ning CKK_RSA (%l
1b910 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
1b920 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
1b930 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
1b940 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
1b950 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1b960 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1b970 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1b980 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
1b990 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  GN:.....CACKEY_D
1b9a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1b9b0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1b9c0 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30  e CKA_SIGN (0x%0
1b9d0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1b9e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1b9f0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1ba00 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1ba10 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
1ba20 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1ba30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ba40 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1ba50 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1ba60 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
1ba70 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1ba80 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1ba90 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
1baa0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1bab0 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
1bac0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
1bad0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
1bae0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1baf0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
1bb00 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1bb10 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
1bb20 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
1bb30 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1bb40 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
1bb50 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1bb60 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1bb70 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
1bb80 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1bb90 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
1bba0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
1bbb0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1bbc0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1bbd0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1bbe0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
1bbf0 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41  _RECOVER:.....CA
1bc00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bc10 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1bc20 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e  tribute CKA_SIGN
1bc30 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c  _RECOVER (0x%08l
1bc40 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1bc50 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1bc60 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1bc70 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1bc80 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1bc90 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1bca0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bcb0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1bcc0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1bcd0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
1bce0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1bcf0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1bd00 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
1bd10 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79  e currently only
1bd20 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20 77   support "Sign w
1bd30 69 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a 2f  ith Appendix" */
1bd40 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1bd50 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
1bd60 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1bd70 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
1bd80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bd90 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1bda0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
1bdb0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1bdc0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
1bdd0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1bde0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1bdf0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1be00 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1be10 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54  case CKA_DECRYPT
1be20 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1be30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1be40 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1be50 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78 25  CKA_DECRYPT (0x%
1be60 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1be70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1be80 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1be90 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1bea0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1beb0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1bec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bed0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1bee0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1bef0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1bf00 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1bf10 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1bf20 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
1bf30 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1bf40 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1bf50 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y || objectclass
1bf60 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   == CKO_PUBLIC_K
1bf70 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
1bf80 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
1bf90 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1bfa0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
1bfb0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1bfc0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1bfd0 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
1bfe0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1bff0 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
1c000 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1c010 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1c020 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1c030 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1c040 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
1c050 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
1c060 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1c070 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1c080 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1c090 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45  ;....case CKA_SE
1c0a0 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43  NSITIVE:.....CAC
1c0b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c0c0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1c0d0 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49  ribute CKA_SENSI
1c0e0 54 49 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TIVE (0x%08lx) .
1c0f0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1c100 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1c110 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1c120 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1c130 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1c140 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1c150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1c160 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1c170 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1c180 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1c190 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1c1a0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c1b0 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
1c1c0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
1c1d0 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
1c1e0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1c1f0 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
1c200 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1c210 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
1c220 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
1c230 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
1c240 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1c250 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
1c260 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
1c270 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c280 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1c290 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
1c2a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c2b0 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
1c2c0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
1c2d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c2e0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1c2f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1c300 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
1c310 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
1c320 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1c330 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1c340 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
1c350 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1c360 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c370 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1c380 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1c390 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1c3a0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1c3b0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c3c0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1c3d0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1c3e0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1c3f0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1c400 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1c410 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1c420 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1c430 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
1c440 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
1c450 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
1c460 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
1c470 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
1c480 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
1c490 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
1c4a0 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
1c4b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1c4c0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
1c4d0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1c4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1c4f0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1c500 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1c510 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1c520 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1c530 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1c540 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1c550 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1c560 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1c570 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43  A_MODULUS:.....C
1c580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c590 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1c5a0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44  ttribute CKA_MOD
1c5b0 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e  ULUS (0x%08lx) .
1c5c0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1c5d0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1c5e0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1c5f0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1c600 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1c610 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1c620 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1c630 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1c640 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1c650 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1c660 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1c670 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c680 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
1c690 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
1c6a0 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
1c6b0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
1c6c0 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69  _modulus(certifi
1c6d0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
1c6e0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
1c6f0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
1c700 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
1c710 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
1c720 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
1c730 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
1c740 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
1c750 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
1c760 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1c770 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1c780 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
1c790 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
1c7a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1c7b0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1c7c0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1c7d0 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e  A_PUBLIC_EXPONEN
1c7e0 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
1c7f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1c800 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1c810 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
1c820 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e  NENT (0x%08lx) .
1c830 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1c840 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1c850 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1c860 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1c870 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1c880 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1c890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1c8a0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1c8b0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1c8c0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1c8d0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1c8e0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c8f0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
1c900 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
1c910 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
1c920 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
1c930 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69 66  _exponent(certif
1c940 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1c950 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
1c960 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
1c970 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
1c980 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
1c990 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
1c9a0 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
1c9b0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
1c9c0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
1c9d0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1c9e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1c9f0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
1ca00 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
1ca10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1ca20 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1ca30 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1ca40 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41 4c  KA_TRUST_DIGITAL
1ca50 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09 63  _SIGNATURE:....c
1ca60 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f  ase CKA_TRUST_NO
1ca70 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09  N_REPUDIATION:..
1ca80 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1ca90 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e  _KEY_ENCIPHERMEN
1caa0 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  T:....case CKA_T
1cab0 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48  RUST_DATA_ENCIPH
1cac0 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20  ERMENT:....case 
1cad0 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47  CKA_TRUST_KEY_AG
1cae0 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  REEMENT:....case
1caf0 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43   CKA_TRUST_KEY_C
1cb00 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73  ERT_SIGN:....cas
1cb10 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f  e CKA_TRUST_CRL_
1cb20 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  SIGN:....case CK
1cb30 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41  A_TRUST_SERVER_A
1cb40 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  UTH:....case CKA
1cb50 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
1cb60 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  TH:....case CKA_
1cb70 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49  TRUST_CODE_SIGNI
1cb80 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NG:....case CKA_
1cb90 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54  TRUST_EMAIL_PROT
1cba0 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b  ECTION:.....CACK
1cbb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cbc0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1cbd0 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
1cbe0 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ... (0x%08lx) ..
1cbf0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1cc00 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1cc10 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
1cc20 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a   = &ck_trusted;.
1cc30 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1cc40 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74   sizeof(ck_trust
1cc50 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ed);......CACKEY
1cc60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1cc70 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1cc80 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1cc90 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1cca0 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61 6c  CK_TRUST *) pVal
1ccb0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1ccc0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1ccd0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1cce0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1ccf0 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48  A_CERT_SHA1_HASH
1cd00 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1cd10 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1cd20 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1cd30 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
1cd40 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SH (0x%08lx) ...
1cd50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1cd60 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1cd70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1cd80 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
1cd90 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1cda0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1cdb0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1cdc0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1cdd0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1cde0 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70  re not a Netscap
1cdf0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
1ce00 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1ce10 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52 65  ...}......SHA1Re
1ce20 73 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b 0a  set(&sha1_ctx);.
1ce30 09 09 09 09 53 48 41 31 49 6e 70 75 74 28 26 73  ....SHA1Input(&s
1ce40 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66 69  ha1_ctx, certifi
1ce50 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
1ce60 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41 31  e_len);.....SHA1
1ce70 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74 78  Result(&sha1_ctx
1ce80 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09  , sha1_hash);...
1ce90 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61 31  ...pValue = sha1
1cea0 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c  _hash;.....ulVal
1ceb0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73  ueLen = sizeof(s
1cec0 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09  ha1_hash);......
1ced0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cee0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1cef0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
1cf00 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1cf10 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1cf20 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1cf30 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d  .case CKA_CERT_M
1cf40 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43  D5_HASH:.....CAC
1cf50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cf60 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1cf70 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f  ribute CKA_CERT_
1cf80 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30 38 6c  MD5_HASH (0x%08l
1cf90 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1cfa0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1cfb0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1cfc0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
1cfd0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1cfe0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1cff0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d000 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1d010 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1d020 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
1d030 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1d040 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1d050 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1d060 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74 78  MD5Init(&md5_ctx
1d070 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74 65  );.....MD5Update
1d080 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74 69  (&md5_ctx, certi
1d090 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
1d0a0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44  ate_len);.....MD
1d0b0 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c  5Final(md5_hash,
1d0c0 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09   &md5_ctx);.....
1d0d0 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61  .pValue = md5_ha
1d0e0 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  sh;.....ulValueL
1d0f0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f  en = sizeof(md5_
1d100 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b  hash);......CACK
1d110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d120 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1d130 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
1d140 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1d150 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1d160 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
1d170 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65  ault:.....pValue
1d180 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56   = NULL;.....ulV
1d190 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
1d1a0 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61  NG) -1;.....brea
1d1b0 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28  k;...}....if (((
1d1c0 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65  CK_LONG) ulValue
1d1d0 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e  Len) != ((CK_LON
1d1e0 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20  G) -1)) {..../* 
1d1f0 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f  Push curr_attr o
1d200 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f  nto the stack */
1d210 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79  ....curr_attr.ty
1d220 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74  pe = curr_attr_t
1d230 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74  ype;....curr_att
1d240 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75  r.ulValueLen = u
1d250 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63  lValueLen;.....c
1d260 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20  urr_attr.pValue 
1d270 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74  = malloc(curr_at
1d280 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  tr.ulValueLen);.
1d290 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
1d2a0 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c  ttr.pValue, pVal
1d2b0 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c  ue, curr_attr.ul
1d2c0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69  ValueLen);.....i
1d2d0 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26  f (pValue_free &
1d2e0 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  & pValue) {.....
1d2f0 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09  free(pValue);...
1d300 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74  .}.....if (numat
1d310 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f  trs >= retval_co
1d320 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61  unt) {.....retva
1d330 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
1d340 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
1d350 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
1d360 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65  l));....}.....me
1d370 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d  mcpy(&retval[num
1d380 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74  attrs], &curr_at
1d390 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  tr, sizeof(curr_
1d3a0 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74  attr));....numat
1d3b0 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  trs++;...}..}...
1d3c0 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20  if (numattrs != 
1d3d0 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f  0) {...retval_co
1d3e0 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a  unt = numattrs;.
1d3f0 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1d400 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61  oc(retval, retva
1d410 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
1d420 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65  (*retval));..} e
1d430 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74  lse {...free(ret
1d440 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20  val);....retval 
1d450 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75  = NULL;..}...*pu
1d460 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  lCount = numattr
1d470 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  s;...CACKEY_DEBU
1d480 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1d490 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20  ing %lu objects 
1d4a0 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73  (%p).", numattrs
1d4b0 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74 76 61  , (void *) retva
1d4c0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
1d4d0 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
1d4e0 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
1d4f0 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1d500 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1d510 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20  ty *identities, 
1d520 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1d530 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
1d540 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
1d550 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73  *curr_attr;..uns
1d560 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64  igned long id_id
1d570 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69  x, attr_idx;...i
1d580 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  f (identities ==
1d590 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74   NULL || identit
1d5a0 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20  ies_count == 0) 
1d5b0 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
1d5c0 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 30  .for (id_idx = 0
1d5d0 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 74  ; id_idx < ident
1d5e0 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f  ities_count; id_
1d5f0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69  idx++) {...if (i
1d600 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1d610 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
1d620 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
1d630 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
1d640 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69   identities[id_i
1d650 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
1d660 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b  ount; attr_idx++
1d670 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74  ) {.....curr_att
1d680 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73 5b  r = &identities[
1d690 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1d6a0 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  es[attr_idx];...
1d6b0 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
1d6c0 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  ->pValue) {.....
1d6d0 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d  .free(curr_attr-
1d6e0 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a  >pValue);.....}.
1d6f0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 65  ...}.....if (ide
1d700 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1d710 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09  attributes) {...
1d720 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65  ..free(identitie
1d730 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1d740 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  utes);....}.....
1d750 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1d760 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  s(identities[id_
1d770 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1d780 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09  ty, 1, 1);...}..
1d790 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69 74  }...free(identit
1d7a0 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ies);.}..static 
1d7b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61  unsigned long ca
1d7c0 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
1d7d0 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
1d7e0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
1d7f0 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73  *identities, uns
1d800 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64  igned long num_d
1d810 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e 73  od_certs) {..uns
1d820 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 5f  igned long cert_
1d830 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20 30 3b  idx, id_idx = 0;
1d840 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
1d850 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  s == NULL) {...r
1d860 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65  eturn(num_dod_ce
1d870 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66  rts * 3);..}...f
1d880 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30  or (cert_idx = 0
1d890 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d  ; cert_idx < num
1d8a0 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72 74  _dod_certs; cert
1d8b0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e  _idx++) {...iden
1d8c0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1d8d0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e  csc_identity = N
1d8e0 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65  ULL;...identitie
1d8f0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1d900 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
1d910 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f  t_attributes(CKO
1d920 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20 26 65  _CERTIFICATE, &e
1d930 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f  xtra_certs[cert_
1d940 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63  idx], 0xf000 | c
1d950 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1d960 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1d970 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1d980 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69  ..id_idx++;....i
1d990 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1d9a0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1d9b0 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
1d9c0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1d9d0 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1d9e0 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1d9f0 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20  CKO_PUBLIC_KEY, 
1da00 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72  &extra_certs[cer
1da10 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c  t_idx], 0xf000 |
1da20 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1da30 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1da40 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1da50 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09  ;...id_idx++;...
1da60 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1da70 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1da80 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e  y = NULL;...iden
1da90 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1daa0 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
1dab0 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
1dac0 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  s(CKO_NETSCAPE_T
1dad0 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72  RUST, &extra_cer
1dae0 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
1daf0 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
1db00 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
1db10 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1db20 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
1db30 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ++;..}...return(
1db40 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74  id_idx);.}..stat
1db50 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
1db60 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
1db70 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
1db80 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
1db90 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
1dba0 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66  gned long *ids_f
1dbb0 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20  ound) {..struct 
1dbc0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1dbd0 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
1dbe0 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63  ities;..struct c
1dbf0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
1dc00 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
1dc10 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69  igned long num_i
1dc20 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72  ds, id_idx, curr
1dc30 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67  _id_type;..unsig
1dc40 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
1dc50 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  ts, num_dod_cert
1dc60 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e  s, cert_idx;..in
1dc70 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  t include_extra_
1dc80 63 65 72 74 73 20 3d 20 30 2c 20 69 6e 63 6c 75  certs = 0, inclu
1dc90 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09  de_dod_certs;...
1dca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dcb0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1dcc0 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20  ..if (ids_found 
1dcd0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1dce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dcf0 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f  ("Error.  ids_fo
1dd00 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  und is NULL");..
1dd10 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
1dd20 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1dd30 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c  Y_CARD_SLOT_INCL
1dd40 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53 0a  UDE_EXTRA_CERTS.
1dd50 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  .include_extra_c
1dd60 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66  erts = 1;.#endif
1dd70 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1dd80 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f  ACKEY_DOD_CERTS_
1dd90 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d  ON_HW_SLOTS") !=
1dda0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1ddb0 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1ddc0 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74   1;..}...if (get
1ddd0 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44  env("CACKEY_NO_D
1dde0 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53  OD_CERTS_ON_HW_S
1ddf0 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LOTS") != NULL) 
1de00 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  {...include_extr
1de10 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a  a_certs = 0;..}.
1de20 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e  .#ifdef CACKEY_N
1de30 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69  O_EXTRA_CERTS..i
1de40 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1de50 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20  Y_EXTRA_CERTS") 
1de60 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1de70 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1de80 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   1;..} else {...
1de90 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1dea0 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a  s = 0;..}.#else.
1deb0 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1dec0 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1ded0 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1dee0 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1def0 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  rts = 0;..} else
1df00 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1df10 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23  _certs = 1;..}.#
1df20 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c  endif...if (incl
1df30 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b  ude_dod_certs) {
1df40 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ...num_dod_certs
1df50 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f   = sizeof(extra_
1df60 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  certs) / sizeof(
1df70 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b  extra_certs[0]);
1df80 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d  ..} else {...num
1df90 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1dfa0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69  .}...if (slot->i
1dfb0 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d  nternal) {...num
1dfc0 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ids = cackey_re
1dfd0 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1dfe0 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f  s(NULL, num_dod_
1dff0 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e  certs);....if (n
1e000 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a 09  um_ids != 0) {..
1e010 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d  ..identities = m
1e020 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20  alloc(num_ids * 
1e030 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1e040 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  es));.....cackey
1e050 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1e060 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 2c  ties(identities,
1e070 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1e080 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69  ...} else {....i
1e090 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
1e0a0 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f  ;...}....*ids_fo
1e0b0 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a  und = num_ids;..
1e0c0 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74  ..return(identit
1e0d0 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  ies);..}...pcsc_
1e0e0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
1e0f0 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
1e100 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  lot, NULL, &num_
1e110 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73  certs);..if (pcs
1e120 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
1e130 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e  NULL) {.../* Con
1e140 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43  vert number of C
1e150 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f  erts to number o
1e160 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e  f objects */...n
1e170 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52  um_ids = (CKO_PR
1e180 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f  IVATE_KEY - CKO_
1e190 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29  CERTIFICATE + 1)
1e1a0 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09   * num_certs;...
1e1b0 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74  .if (include_ext
1e1c0 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e  ra_certs) {....n
1e1d0 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65 79  um_ids += cackey
1e1e0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1e1f0 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64  ties(NULL, num_d
1e200 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a  od_certs);...}..
1e210 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d  ..identities = m
1e220 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20  alloc(num_ids * 
1e230 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1e240 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20  es));..../* Add 
1e250 63 65 72 74 69 66 69 63 61 74 65 73 2c 20 70 75  certificates, pu
1e260 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20 70  blic keys, and p
1e270 72 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f 6d  rivate keys from
1e280 20 74 68 65 20 73 6d 61 72 74 63 61 72 64 20 2a   the smartcard *
1e290 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a  /...id_idx = 0;.
1e2a0 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
1e2b0 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
1e2c0 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  num_certs; cert_
1e2d0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20  idx++) {....for 
1e2e0 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20  (curr_id_type = 
1e2f0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b  CKO_CERTIFICATE;
1e300 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d   curr_id_type <=
1e310 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
1e320 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b  ; curr_id_type++
1e330 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69  ) {.....identiti
1e340 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1e350 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
1e360 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75  et_attributes(cu
1e370 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73  rr_id_type, &pcs
1e380 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1e390 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78  t_idx], cert_idx
1e3a0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1e3b0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1e3c0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64  _count);......id
1e3d0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1e3e0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
1e3f0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
1e400 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1e410 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1e420 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69  ));.....memcpy(i
1e430 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1e440 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c  ].pcsc_identity,
1e450 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   &pcsc_identitie
1e460 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a  s[cert_idx], siz
1e470 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b  eof(*identities[
1e480 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1e490 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64  ntity));......id
1e4a0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1e4b0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  .pcsc_identity->
1e4c0 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61  certificate = ma
1e4d0 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69  lloc(pcsc_identi
1e4e0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1e4f0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1e500 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e  .....memcpy(iden
1e510 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1e520 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
1e530 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, pcsc_
1e540 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1e550 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
1e560 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
1e570 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
1e580 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
1e590 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09  ...id_idx++;....
1e5a0 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63  }...}....if (inc
1e5b0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1e5c0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1e5d0 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c  BUG_PRINTF("Incl
1e5e0 75 64 69 6e 67 20 55 53 20 47 6f 76 65 72 6e 6d  uding US Governm
1e5f0 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65 73  ent Certificates
1e600 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c 6f   on hardware slo
1e610 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  t");.....cackey_
1e620 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1e630 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 20 2b  ies(identities +
1e640 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64   id_idx, num_dod
1e650 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09  _certs);...}....
1e660 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1e670 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  s(pcsc_identitie
1e680 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29  s, num_certs, 1)
1e690 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20  ;....*ids_found 
1e6a0 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65  = num_ids;....re
1e6b0 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29  turn(identities)
1e6c0 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e  ;..}...*ids_foun
1e6d0 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e  d = 0;..return(N
1e6e0 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ULL);.}..static 
1e6f0 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
1e700 79 5f 67 65 74 5f 70 69 6e 28 63 68 61 72 20 2a  y_get_pin(char *
1e710 70 69 6e 62 75 66 29 20 7b 0a 09 46 49 4c 45 20  pinbuf) {..FILE 
1e720 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72 20 2a 66  *pinfd;..char *f
1e730 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74 20 70  gets_ret;..int p
1e740 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 69 66 20  close_ret;...if 
1e750 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
1e760 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and == NULL) {..
1e770 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
1e780 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
1e790 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75 66 20  .}...if (pinbuf 
1e7a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
1e7b0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1e7c0 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
1e7d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e7e0 49 4e 54 46 28 22 43 41 43 4b 45 59 5f 50 49 4e  INTF("CACKEY_PIN
1e7f0 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25 73 22 2c 20  _COMMAND = %s", 
1e800 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1e810 6e 64 29 3b 0a 0a 09 70 69 6e 66 64 20 3d 20 70  nd);...pinfd = p
1e820 6f 70 65 6e 28 63 61 63 6b 65 79 5f 70 69 6e 5f  open(cackey_pin_
1e830 63 6f 6d 6d 61 6e 64 2c 20 22 72 22 29 3b 0a 09  command, "r");..
1e840 69 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e 55 4c  if (pinfd == NUL
1e850 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1e860 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e870 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65 20 74  r.  %s: Unable t
1e880 6f 20 72 75 6e 22 2c 20 63 61 63 6b 65 79 5f 70  o run", cackey_p
1e890 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09  in_command);....
1e8a0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
1e8b0 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d  SC_E_BADPIN);..}
1e8c0 0a 0a 09 66 67 65 74 73 5f 72 65 74 20 3d 20 66  ...fgets_ret = f
1e8d0 67 65 74 73 28 70 69 6e 62 75 66 2c 20 33 32 2c  gets(pinbuf, 32,
1e8e0 20 70 69 6e 66 64 29 3b 0a 09 69 66 20 28 66 67   pinfd);..if (fg
1e8f0 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29  ets_ret == NULL)
1e900 20 7b 0a 09 09 70 69 6e 62 75 66 5b 30 5d 20 3d   {...pinbuf[0] =
1e910 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 70 63 6c 6f   '\0';..}...pclo
1e920 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73 65 28  se_ret = pclose(
1e930 70 69 6e 66 64 29 3b 0a 09 69 66 20 28 70 63 6c  pinfd);..if (pcl
1e940 6f 73 65 5f 72 65 74 20 3d 3d 20 2d 31 20 26 26  ose_ret == -1 &&
1e950 20 65 72 72 6e 6f 20 3d 3d 20 45 43 48 49 4c 44   errno == ECHILD
1e960 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e970 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 74 69 63  UG_PRINTF("Notic
1e980 65 2e 20 20 70 63 6c 6f 73 65 28 29 20 69 6e 64  e.  pclose() ind
1e990 69 63 61 74 65 64 20 69 74 20 63 6f 75 6c 64 20  icated it could 
1e9a0 6e 6f 74 20 67 65 74 20 74 68 65 20 73 74 61 74  not get the stat
1e9b0 75 73 20 6f 66 20 74 68 65 20 63 68 69 6c 64 2c  us of the child,
1e9c0 20 61 73 73 75 6d 69 6e 67 20 69 74 20 73 75 63   assuming it suc
1e9d0 63 65 65 65 64 65 64 20 21 22 29 3b 0a 0a 09 09  ceeeded !");....
1e9e0 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 30 3b 0a  pclose_ret = 0;.
1e9f0 09 7d 0a 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f  .}...if (pclose_
1ea00 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  ret != 0) {...CA
1ea10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ea20 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 65  F("Error.  %s: e
1ea30 78 69 74 65 64 20 77 69 74 68 20 6e 6f 6e 2d 7a  xited with non-z
1ea40 65 72 6f 20 73 74 61 74 75 73 20 6f 66 20 25 69  ero status of %i
1ea50 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ", cackey_pin_co
1ea60 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73 65 5f 72 65  mmand, pclose_re
1ea70 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
1ea80 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
1ea90 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74  IN);..}...if (st
1eaa0 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 3c 20 31  rlen(pinbuf) < 1
1eab0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1eac0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ead0 2e 20 20 25 73 3a 20 72 65 74 75 72 6e 65 64 20  .  %s: returned 
1eae0 6e 6f 20 64 61 74 61 22 2c 20 63 61 63 6b 65 79  no data", cackey
1eaf0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a  _pin_command);..
1eb00 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
1eb10 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
1eb20 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62 75 66 5b  .}...if (pinbuf[
1eb30 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d  strlen(pinbuf) -
1eb40 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09   1] == '\n') {..
1eb50 09 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70  .pinbuf[strlen(p
1eb60 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 20 27 5c  inbuf) - 1] = '\
1eb70 30 27 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  0';..}...return(
1eb80 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
1eb90 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1eba0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ebb0 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b  C_Initialize)(CK
1ebc0 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41  _VOID_PTR pInitA
1ebd0 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49  rgs) {..CK_C_INI
1ebe0 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f  TIALIZE_ARGS CK_
1ebf0 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33  PTR args;..uint3
1ec00 32 5f 74 20 69 64 78 2c 20 68 69 67 68 65 73 74  2_t idx, highest
1ec10 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65  _slot;..int mute
1ec20 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 09 69 6e 74  x_init_ret;..int
1ec30 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72   include_dod_cer
1ec40 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ts;...CACKEY_DEB
1ec50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ec60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
1ec70 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1ec80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ec90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1eca0 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c   Already initial
1ecb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1ecc0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1ecd0 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49  ALREADY_INITIALI
1ece0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
1ecf0 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c  InitArgs != NULL
1ed00 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e  ) {...args = pIn
1ed10 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79  itArgs;...memcpy
1ed20 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61  (&cackey_args, a
1ed30 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b  rgs, sizeof(cack
1ed40 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66  ey_args));....if
1ed50 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
1ed60 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
1ed70 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
1ed80 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
1ed90 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  s->LockMutex == 
1eda0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
1edb0 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  lockMutex == NUL
1edc0 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73  L) {....if (args
1edd0 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d  ->CreateMutex !=
1ede0 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
1edf0 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e  estroyMutex != N
1ee00 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
1ee10 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  kMutex != NULL |
1ee20 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
1ee30 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex != NULL) {..
1ee40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ee50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
1ee60 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c  ome, but not All
1ee70 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69   threading primi
1ee80 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22  tives provided."
1ee90 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
1eea0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1eeb0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65  );....}...}..} e
1eec0 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61  lse {...cackey_a
1eed0 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20  rgs.CreateMutex 
1eee0 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1eef0 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74  _args.DestroyMut
1ef00 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1ef10 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
1ef20 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1ef30 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
1ef40 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1ef50 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
1ef60 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
1ef70 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1ef80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1ef90 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1efa0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1efb0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1efc0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1efd0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
1efe0 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  0;..}...for (idx
1eff0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1f000 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1f010 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1f020 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
1f030 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  x++) {...cackey_
1f040 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76  slots[idx].activ
1f050 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  e = 0;...cackey_
1f060 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
1f070 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
1f080 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1f090 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
1f0a0 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b  epth = 0;...cack
1f0b0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
1f0c0 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
1f0d0 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61  w_lock = 0;...ca
1f0e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1f0f0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
1f100 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1f110 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  dx].token_flags 
1f120 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1f130 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d  ots[idx].label =
1f140 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1f150 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72  slots[idx].inter
1f160 6e 61 6c 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  nal = 0;...cacke
1f170 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 64 5f  y_slots[idx].id_
1f180 74 79 70 65 5f 68 69 6e 74 20 3d 20 43 41 43 4b  type_hint = CACK
1f190 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f  EY_ID_TYPE_UNKNO
1f1a0 57 4e 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  WN;..}..#ifdef C
1f1b0 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1f1c0 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76  ERTS..if (getenv
1f1d0 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43  ("CACKEY_EXTRA_C
1f1e0 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1f1f0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1f200 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c  certs = 1;..} el
1f210 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1f220 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1f230 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65  .#else..if (gete
1f240 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
1f250 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1f260 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65  ULL) {...include
1f270 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1f280 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c  .} else {...incl
1f290 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1f2a0 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69  1;..}.#endif...i
1f2b0 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  f (include_dod_c
1f2c0 65 72 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09 43  erts == 0) {...C
1f2d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f2e0 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f  TF("Asked not to
1f2f0 20 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72   include DoD cer
1f300 74 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20  tificates");..} 
1f310 65 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74  else {...highest
1f320 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28  _slot = (sizeof(
1f330 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1f340 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f350 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09  ots[0])) - 1;...
1f360 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f370 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20  INTF("Including 
1f380 44 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f  DoD certs in slo
1f390 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  t %lu", (unsigne
1f3a0 64 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f  d long) highest_
1f3b0 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79  slot);....cackey
1f3c0 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1f3d0 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  lot].active = 1;
1f3e0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f3f0 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e  highest_slot].in
1f400 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61  ternal = 1;...ca
1f410 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1f420 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  st_slot].label =
1f430 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
1f440 2a 29 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e  *) "US Governmen
1f450 74 20 43 65 72 74 69 66 69 63 61 74 65 73 22 3b  t Certificates";
1f460 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f470 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63  highest_slot].pc
1f480 73 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43  sc_reader = "CAC
1f490 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73  Key";...cackey_s
1f4a0 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1f4b0 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t].token_flags =
1f4c0 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f   0;..}...cackey_
1f4d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
1f4e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62  ...if (!cackey_b
1f4f0 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09  iglock_init) {..
1f500 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  .mutex_init_ret 
1f510 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63  = cackey_mutex_c
1f520 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69  reate(&cackey_bi
1f530 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d  glock);....if (m
1f540 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d  utex_init_ret !=
1f550 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
1f560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f570 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74  ror.  Mutex init
1f580 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65  ialization faile
1f590 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
1f5a0 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b  (CKR_CANT_LOCK);
1f5b0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62  ...}....cackey_b
1f5c0 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b  iglock_init = 1;
1f5d0 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66 69 6e 65 20  ..}.../* Define 
1f5e0 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f  a command to pro
1f5f0 6d 70 74 20 75 73 65 72 20 66 6f 72 20 61 20 50  mpt user for a P
1f600 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20 43 41 43  IN */.#ifdef CAC
1f610 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1f620 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f  DEFAULT..cackey_
1f630 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74  pin_command = st
1f640 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52  rdup(CACKEY_MACR
1f650 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  O_DEFAULT_XSTR(C
1f660 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1f670 44 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e  D_DEFAULT));.#en
1f680 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  dif..#ifdef CACK
1f690 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58  EY_PIN_COMMAND_X
1f6a0 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 69 66  ONLY_DEFAULT..if
1f6b0 20 28 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41   (getenv("DISPLA
1f6c0 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Y") != NULL) {..
1f6d0 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1f6e0 61 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41 43  and = strdup(CAC
1f6f0 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c  KEY_MACRO_DEFAUL
1f700 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49  T_XSTR(CACKEY_PI
1f710 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f  N_COMMAND_XONLY_
1f720 44 45 46 41 55 4c 54 29 29 3b 0a 09 7d 0a 23 65  DEFAULT));..}.#e
1f730 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e  ndif...if (geten
1f740 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  v("CACKEY_PIN_CO
1f750 4d 4d 41 4e 44 22 29 20 21 3d 20 4e 55 4c 4c 29  MMAND") != NULL)
1f760 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f   {...cackey_pin_
1f770 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70  command = strdup
1f780 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1f790 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 29 3b 0a  PIN_COMMAND"));.
1f7a0 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  .}...if (getenv(
1f7b0 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1f7c0 41 4e 44 5f 58 4f 4e 4c 59 22 29 20 21 3d 20 4e  AND_XONLY") != N
1f7d0 55 4c 4c 20 26 26 20 67 65 74 65 6e 76 28 22 44  ULL && getenv("D
1f7e0 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c  ISPLAY") != NULL
1f7f0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e  ) {...cackey_pin
1f800 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75  _command = strdu
1f810 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59  p(getenv("CACKEY
1f820 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1f830 4c 59 22 29 29 3b 0a 09 7d 0a 0a 23 69 66 64 65  LY"));..}..#ifde
1f840 66 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53  f CACKEY_READERS
1f850 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45  _INCLUDE_ONLY_DE
1f860 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65  FAULT..cackey_re
1f870 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1f880 6c 79 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b  ly = strdup(CACK
1f890 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54  EY_MACRO_DEFAULT
1f8a0 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41  _XSTR(CACKEY_REA
1f8b0 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c  DERS_INCLUDE_ONL
1f8c0 59 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e  Y_DEFAULT));.#en
1f8d0 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  dif..#ifdef CACK
1f8e0 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55  EY_READERS_EXCLU
1f8f0 44 45 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b  DE_DEFAULT..cack
1f900 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1f910 64 65 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b  de = strdup(CACK
1f920 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54  EY_MACRO_DEFAULT
1f930 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 52 45 41  _XSTR(CACKEY_REA
1f940 44 45 52 53 5f 45 58 43 4c 55 44 45 5f 44 45 46  DERS_EXCLUDE_DEF
1f950 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  AULT));.#endif..
1f960 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1f970 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c  KEY_READERS_INCL
1f980 55 44 45 5f 4f 4e 4c 59 22 29 20 21 3d 20 4e 55  UDE_ONLY") != NU
1f990 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72  LL) {...cackey_r
1f9a0 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f  eaders_include_o
1f9b0 6e 6c 79 20 3d 20 73 74 72 64 75 70 28 67 65 74  nly = strdup(get
1f9c0 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44  env("CACKEY_READ
1f9d0 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59  ERS_INCLUDE_ONLY
1f9e0 22 29 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  "));....if (cack
1f9f0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1fa00 64 65 5f 6f 6e 6c 79 5b 30 5d 20 3d 3d 20 27 5c  de_only[0] == '\
1fa10 30 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  0') {....free(ca
1fa20 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1fa30 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09  lude_only);.....
1fa40 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1fa50 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55  nclude_only = NU
1fa60 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  LL;...}..}...if 
1fa70 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1fa80 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45 22  READERS_EXCLUDE"
1fa90 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1faa0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
1fab0 63 6c 75 64 65 20 3d 20 73 74 72 64 75 70 28 67  clude = strdup(g
1fac0 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45  etenv("CACKEY_RE
1fad0 41 44 45 52 53 5f 45 58 43 4c 55 44 45 22 29 29  ADERS_EXCLUDE"))
1fae0 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  ;....if (cackey_
1faf0 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 5b  readers_exclude[
1fb00 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09  0] == '\0') {...
1fb10 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61  .free(cackey_rea
1fb20 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a  ders_exclude);..
1fb30 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ...cackey_reader
1fb40 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c  s_exclude = NULL
1fb50 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  ;...}..}...CACKE
1fb60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fb70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1fb80 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1fb90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1fba0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1fbb0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1fbc0 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56  C_Finalize)(CK_V
1fbd0 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65  OID_PTR pReserve
1fbe0 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
1fbf0 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
1fc00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1fc10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73  d.");...if (pRes
1fc20 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  erved != NULL) {
1fc30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fc40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1fc50 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20  Reserved is not 
1fc60 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1fc70 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1fc80 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1fc90 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1fca0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1fcb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fcc0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1fcd0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1fce0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1fcf0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1fd00 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
1fd10 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1fd20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1fd30 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1fd40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1fd50 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
1fd60 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
1fd70 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20  ns[idx].active) 
1fd80 7b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73  {....C_CloseSess
1fd90 69 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d  ion(idx);...}..}
1fda0 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
1fdb0 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 31  disconnect_all(1
1fdc0 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  );...for (idx = 
1fdd0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1fde0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1fdf0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1fe00 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
1fe10 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
1fe20 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65  _slots[idx].inte
1fe30 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69  rnal) {....conti
1fe40 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  nue;...}....if (
1fe50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1fe60 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ].cached_certs) 
1fe70 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
1fe80 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73 6c  _certs(cackey_sl
1fe90 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1fea0 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73 6c  certs, cackey_sl
1feb0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1fec0 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b  certs_count, 1);
1fed0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1fee0 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
1fef0 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  rts = NULL;...}.
1ff00 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  .}...cackey_pcsc
1ff10 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
1ff20 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
1ff30 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29  command != NULL)
1ff40 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
1ff50 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a  _pin_command);..
1ff60 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  ..cackey_pin_com
1ff70 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  mand = NULL;..}.
1ff80 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61  ..if (cackey_rea
1ff90 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
1ffa0 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  y != NULL) {...f
1ffb0 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65  ree(cackey_reade
1ffc0 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29  rs_include_only)
1ffd0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64  ;....cackey_read
1ffe0 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1fff0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66   = NULL;..}...if
20000 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73   (cackey_readers
20010 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55 4c 4c  _exclude != NULL
20020 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
20030 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64  y_readers_exclud
20040 65 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65  e);....cackey_re
20050 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20  aders_exclude = 
20060 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
20070 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
20080 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
20090 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
200a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
200b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
200c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
200d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
200e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49  ON(CK_RV, C_GetI
200f0 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52  nfo)(CK_INFO_PTR
20100 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
20110 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
20120 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
20130 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
20140 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
20150 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44  TF8CHAR libraryD
20160 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22  escription[] = "
20170 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45  CACKey";...CACKE
20180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20190 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
201a0 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
201b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
201c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
201d0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
201e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
201f0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
20200 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
20210 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
20220 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20230 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
20240 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
20250 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20260 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
20270 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20280 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
20290 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
202a0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
202b0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
202c0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
202d0 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56  pInfo->cryptokiV
202e0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
202f0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
20300 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
20310 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d  > 8) & 0xff;...m
20320 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
20330 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
20340 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
20350 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
20360 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
20370 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
20380 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c   manufacturerID,
20390 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74   sizeof(manufact
203a0 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09  urerID) - 1);...
203b0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30  pInfo->flags = 0
203c0 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  x00;...memset(pI
203d0 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
203e0 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
203f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  zeof(pInfo->libr
20400 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29  aryDescription))
20410 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
20420 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
20430 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63  ion, libraryDesc
20440 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28  ription, sizeof(
20450 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
20460 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  on) - 1);...pInf
20470 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f  o->libraryVersio
20480 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
20490 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
204a0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
204b0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72  Info->libraryVer
204c0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61  sion.minor = (ca
204d0 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
204e0 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
204f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20500 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20510 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
20520 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
20530 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  (CKR_OK);.}../*.
20540 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20   * Process list 
20550 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20  of readers, and 
20560 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62  create mapping b
20570 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61  etween reader na
20580 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20  me and slot ID. 
20590 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
205a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
205b0 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42  etSlotList)(CK_B
205c0 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e  BOOL tokenPresen
205d0 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  t, CK_SLOT_ID_PT
205e0 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f  R pSlotList, CK_
205f0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
20600 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e  nt) {..static in
20610 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31  t first_call = 1
20620 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
20630 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  val;..int pcsc_c
20640 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f  onnect_ret;..CK_
20650 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f  ULONG count, slo
20660 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72  t_count = 0, cur
20670 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b  rslot, slot_idx;
20680 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
20690 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  ders, *pcsc_read
206a0 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61  ers_s, *pcsc_rea
206b0 64 65 72 73 5f 65 3b 0a 09 63 68 61 72 20 2a 72  ders_e;..char *r
206c0 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74  eader_check_patt
206d0 65 72 6e 3b 0a 09 44 57 4f 52 44 20 70 63 73 63  ern;..DWORD pcsc
206e0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c  _readers_len;..L
206f0 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72 65  ONG scard_listre
20700 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a 65  aders_ret;..size
20710 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  _t curr_reader_l
20720 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  en;..int slot_re
20730 73 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64  set;..int includ
20740 65 5f 72 65 61 64 65 72 3b 0a 0a 09 43 41 43 4b  e_reader;...CACK
20750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20760 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
20770 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55   (pulCount == NU
20780 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
20790 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
207a0 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20  or. pulCount is 
207b0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
207c0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
207d0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
207e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
207f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20810 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20820 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20830 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20840 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20850 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
20860 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
20870 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
20880 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
20890 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
208a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
208b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
208c0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
208d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
208e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
208f0 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61  R);..}.../* Clea
20900 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  r list of slots 
20910 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d  */..slot_reset =
20920 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   0;..if (pSlotLi
20930 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73  st) {...if (firs
20940 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72  t_call) {....fir
20950 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09  st_call = 0;....
20960 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  .slot_reset = 1;
20970 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e  ...}..../* If an
20980 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68  y of the slots h
20990 61 76 65 20 62 65 65 6e 20 72 65 73 65 74 20 74  ave been reset t
209a0 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e  hen purge all in
209b0 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68  formation and ch
209c0 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66  eck again */...f
209d0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
209e0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
209f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
20a00 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
20a10 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
20a20 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
20a30 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
20a40 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72  [currslot].inter
20a50 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  nal) {.....conti
20a60 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  nue;....}.....if
20a70 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
20a80 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
20a90 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
20aa0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63  ;....}.....if (c
20ab0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
20ac0 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  slot].slot_reset
20ad0 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73  ) {.....slot_res
20ae0 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65  et = 1;......bre
20af0 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ak;....}...}....
20b00 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20  if (slot_reset) 
20b10 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
20b20 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e  G_PRINTF("Purgin
20b30 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72  g all slot infor
20b40 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f  mation.");...../
20b50 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
20b60 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
20b70 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
20b80 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20  ly being supply 
20b90 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  the slot informa
20ba0 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
20bb0 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
20bc0 63 74 5f 61 6c 6c 28 31 29 3b 0a 0a 09 09 09 66  ct_all(1);.....f
20bd0 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
20be0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
20bf0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
20c00 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
20c10 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
20c20 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
20c30 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
20c40 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
20c50 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e  rnal) {......con
20c60 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
20c70 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
20c80 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20  urrslot].active 
20c90 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  = 0;....}...}..}
20ca0 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
20cb0 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
20cc0 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
20cd0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
20ce0 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
20cf0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
20d00 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
20d10 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
20d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20d30 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
20d40 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73  PC/SC failed, as
20d50 73 75 6d 69 6e 67 20 6e 6f 20 68 61 72 64 77 61  suming no hardwa
20d60 72 65 20 73 6c 6f 74 73 22 29 3b 0a 09 7d 20 65  re slots");..} e
20d70 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61  lse {...pcsc_rea
20d80 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09  ders_len = 0;...
20d90 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  .scard_listreade
20da0 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
20db0 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65  stReaders(*cacke
20dc0 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e  y_pcsc_handle, N
20dd0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63  ULL, NULL, &pcsc
20de0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a  _readers_len);..
20df0 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
20e00 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
20e10 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
20e20 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  R) {....CACKEY_D
20e30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20e40 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61  or. SCardListRea
20e50 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20  ders() returned 
20e60 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52  SCARD_F_COMM_ERR
20e70 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e  OR, assuming Con
20e80 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
20e90 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f   went away. Reco
20ea0 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09  nnecting.");....
20eb0 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
20ec0 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61  connect();....ca
20ed0 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
20ee0 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  t();.....CACKEY_
20ef0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
20f00 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65  ying SCardListRe
20f10 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b  aders() again");
20f20 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
20f30 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
20f40 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
20f50 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
20f60 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70  , NULL, NULL, &p
20f70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
20f80 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ;...}....if (sca
20f90 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
20fa0 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e  et == SCARD_E_IN
20fb0 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
20fc0 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  R) {....CACKEY_D
20fd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20fe0 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61  or. SCardListRea
20ff0 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20  ders() returned 
21000 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43  SCARD_E_INSUFFIC
21010 49 45 4e 54 5f 42 55 46 46 45 52 2c 20 61 73 73  IENT_BUFFER, ass
21020 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61 20  uming this is a 
21030 62 75 67 20 28 65 2e 67 2e 2c 20 47 6f 6f 67 6c  bug (e.g., Googl
21040 65 20 50 43 53 43 29 20 61 6e 64 20 61 6c 6c 6f  e PCSC) and allo
21050 63 61 74 69 6e 67 20 61 20 6d 61 73 73 69 76 65  cating a massive
21060 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
21070 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 61   to hold the rea
21080 64 65 72 20 6c 69 73 74 2e 22 29 3b 0a 0a 09 09  der list.");....
21090 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  .pcsc_readers_le
210a0 6e 20 3d 20 33 32 37 36 38 3b 0a 09 09 09 73 63  n = 32768;....sc
210b0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
210c0 72 65 74 20 3d 20 53 43 41 52 44 5f 53 5f 53 55  ret = SCARD_S_SU
210d0 43 43 45 53 53 3b 0a 09 09 7d 0a 0a 09 09 69 66  CCESS;...}....if
210e0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
210f0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
21100 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63  _S_SUCCESS && pc
21110 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21  sc_readers_len !
21120 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72  = 0) {....pcsc_r
21130 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28  eaders = malloc(
21140 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
21150 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65  );....pcsc_reade
21160 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_s = pcsc_read
21170 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c  ers;.....scard_l
21180 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
21190 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
211a0 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
211b0 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73  andle, NULL, pcs
211c0 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63  c_readers, &pcsc
211d0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
211e0 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
211f0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
21200 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
21210 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  {.....pcsc_reade
21220 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_e = pcsc_read
21230 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65  ers + pcsc_reade
21240 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20  rs_len;....../* 
21250 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20  Start with Slot 
21260 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61  ID 1, to avoid a
21270 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52   bug in GDM on R
21280 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75  HEL */...../* Bu
21290 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a  g 594911: https:
212a0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61  //bugzilla.redha
212b0 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63  t.com/show_bug.c
212c0 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a  gi?id=594911 */.
212d0 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31  ....currslot = 1
212e0 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63 73  ;.....while (pcs
212f0 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73 63  c_readers < pcsc
21300 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09  _readers_e) {...
21310 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20  .../* Find next 
21320 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a  available slot *
21330 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75  /......for (; cu
21340 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
21350 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
21360 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
21370 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
21380 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69  lot++) {.......i
21390 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
213a0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
213b0 65 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61  e) {........brea
213c0 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  k;.......}......
213d0 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61  }.......curr_rea
213e0 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  der_len = strlen
213f0 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
21400 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63 5f  ......if ((pcsc_
21410 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72  readers + curr_r
21420 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73  eader_len) > pcs
21430 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09  c_readers_e) {..
21440 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
21450 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72  .}.......if (cur
21460 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20  r_reader_len == 
21470 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  0) {.......break
21480 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
21490 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28  f (currslot >= (
214a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
214b0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
214c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
214d0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
214e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
214f0 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73  und more readers
21500 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20   than slots are 
21510 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09  available!");...
21520 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
21530 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  .}.......CACKEY_
21540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
21550 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 20 28  und reader: %s (
21560 63 75 72 72 73 6c 6f 74 20 3d 20 25 6c 75 29 22  currslot = %lu)"
21570 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20  , pcsc_readers, 
21580 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21590 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  currslot);......
215a0 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64  .if (cackey_read
215b0 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
215c0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
215d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
215e0 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f 20  RINTF("Asked to 
215f0 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20 72 65 61  include only rea
21600 64 65 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25  ders matching: %
21610 73 22 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65  s", cackey_reade
21620 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29  rs_include_only)
21630 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c 75 64 65  ;........include
21640 5f 72 65 61 64 65 72 20 3d 20 30 3b 0a 09 09 09  _reader = 0;....
21650 09 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  ...reader_check_
21660 70 61 74 74 65 72 6e 20 3d 20 63 61 63 6b 65 79  pattern = cackey
21670 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
21680 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09 7d 20 65 6c  _only;......} el
21690 73 65 20 69 66 20 28 63 61 63 6b 65 79 5f 72 65  se if (cackey_re
216a0 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 21 3d  aders_exclude !=
216b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43   NULL) {.......C
216c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
216d0 54 46 28 22 41 73 6b 65 64 20 74 6f 20 65 78 63  TF("Asked to exc
216e0 6c 75 64 65 20 72 65 61 64 65 72 73 20 6d 61 74  lude readers mat
216f0 63 68 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b  ching: %s", cack
21700 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
21710 64 65 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c  de);........incl
21720 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a  ude_reader = 1;.
21730 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65  ......reader_che
21740 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61 63  ck_pattern = cac
21750 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
21760 75 64 65 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ude;......} else
21770 20 7b 0a 09 09 09 09 09 09 69 6e 63 6c 75 64 65   {.......include
21780 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a 09 09 09  _reader = 1;....
21790 09 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  ...reader_check_
217a0 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c 3b 0a  pattern = NULL;.
217b0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
217c0 28 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61  (reader_check_pa
217d0 74 74 65 72 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  ttern != NULL) {
217e0 0a 09 09 09 09 09 09 69 66 20 28 73 74 72 73 74  .......if (strst
217f0 72 28 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20  r(pcsc_readers, 
21800 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74  reader_check_pat
21810 74 65 72 6e 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  tern) != NULL) {
21820 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
21830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 69  EBUG_PRINTF("Thi
21840 73 20 72 65 61 64 65 72 20 6d 61 74 63 68 65 64  s reader matched
21850 20 74 68 65 20 70 61 74 74 65 72 6e 2e 22 29 3b   the pattern.");
21860 0a 09 09 09 09 09 09 0a 09 09 09 09 09 09 09 69  ...............i
21870 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
21880 21 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 3b  !include_reader;
21890 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
218a0 0a 09 09 09 09 09 69 66 20 28 69 6e 63 6c 75 64  ......if (includ
218b0 65 5f 72 65 61 64 65 72 20 21 3d 20 31 29 20 7b  e_reader != 1) {
218c0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
218d0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6b 69 70  BUG_PRINTF("Skip
218e0 70 69 6e 67 20 74 68 69 73 20 72 65 61 64 65 72  ping this reader
218f0 2e 22 29 3b 0a 0a 09 09 09 09 09 09 70 63 73 63  .");........pcsc
21900 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72  _readers += curr
21910 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b  _reader_len + 1;
21920 0a 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ........continue
21930 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 2f  ;......}......./
21940 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
21950 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
21960 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
21970 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73  ly being asked s
21980 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
21990 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
219a0 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
219b0 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 6c  ) {.......if (sl
219c0 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09  ot_reset) {.....
219d0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
219e0 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
219f0 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61 63   = 1;........cac
21a00 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21a10 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  ot].internal = 0
21a20 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
21a30 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
21a40 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74  pcsc_reader = st
21a50 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72  rdup(pcsc_reader
21a60 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65  s);........cacke
21a70 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21a80 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
21a90 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09  ected = 0;......
21aa0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
21ab0 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63  urrslot].transac
21ac0 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
21ad0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
21ae0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
21af0 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
21b00 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09  w_lock = 0;.....
21b10 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
21b20 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c  n_command == NUL
21b30 4c 29 20 7b 0a 09 09 09 09 09 09 09 09 63 61 63  L) {.........cac
21b40 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21b50 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
21b60 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
21b70 49 52 45 44 3b 0a 09 09 09 09 09 09 09 7d 20 65  IRED;........} e
21b80 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 63 61  lse {.........ca
21b90 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
21ba0 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot].token_flags
21bb0 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 7d 0a 09   = 0;........}..
21bc0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
21bd0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
21be0 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  el = NULL;......
21bf0 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
21c00 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
21c10 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21c20 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ]);.......}.....
21c30 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
21c40 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
21c50 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
21c60 76 65 29 20 7b 0a 09 09 09 09 09 09 09 2f 2a 20  ve) {......../* 
21c70 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e 63  Artificially inc
21c80 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65 72  rease the number
21c90 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74 73   of active slots
21ca0 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62 65   by what will be
21cb0 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a 09  come active */..
21cc0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
21cd0 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
21ce0 20 69 6e 2d 61 63 74 69 76 65 20 73 6c 6f 74 20   in-active slot 
21cf0 25 6c 75 2c 20 62 75 74 20 69 74 20 77 69 6c 6c  %lu, but it will
21d00 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
21d10 20 61 20 72 65 73 65 74 20 2d 2d 20 6d 61 72 6b   a reset -- mark
21d20 69 6e 67 20 61 73 20 61 63 74 69 76 65 20 66 6f  ing as active fo
21d30 72 20 61 63 63 6f 75 6e 74 69 6e 67 20 70 75 72  r accounting pur
21d40 70 6f 73 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  poses", (unsigne
21d50 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74  d long) currslot
21d60 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c 6f 74 5f  );.........slot_
21d70 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 09 7d  count++;.......}
21d80 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72  ......}......cur
21d90 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70  rslot++;.......p
21da0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63  csc_readers += c
21db0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b  urr_reader_len +
21dc0 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65   1;.....}....} e
21dd0 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
21de0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
21df0 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43  econd call to SC
21e00 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
21e10 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
21e20 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
21e30 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
21e40 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
21e50 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
21e60 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
21e70 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
21e80 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63  ...}.....free(pc
21e90 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09  sc_readers_s);..
21ea0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
21eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21ec0 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  ("First call to 
21ed0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
21ee0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
21ef0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
21f00 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
21f10 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
21f20 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21f30 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
21f40 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
21f50 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 6f 72 20 28  ;...}..}...for (
21f60 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
21f70 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
21f80 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
21f90 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
21fa0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
21fb0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  lot++) {...if (c
21fc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
21fd0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
21fe0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21ff0 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63  PRINTF("Found ac
22000 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 72  tive slot %lu, r
22010 65 61 64 65 72 20 3d 20 25 73 22 2c 20 28 75 6e  eader = %s", (un
22020 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
22030 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 73 6c  rslot, cackey_sl
22040 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
22050 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09  sc_reader);.....
22060 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09  slot_count++;...
22070 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
22080 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22090 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
220a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
220b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
220c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
220d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
220e0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
220f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
22100 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22110 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
22120 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c  pSlotList == NUL
22130 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74  L) {...*pulCount
22140 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
22150 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22160 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22170 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46   CKR_OK (%i).  F
22180 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73  ound %lu readers
22190 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e  , but not storin
221a0 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69 73 74  g IDs (pSlotList
221b0 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f   == NULL)", CKR_
221c0 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  OK, (unsigned lo
221d0 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  ng) slot_count);
221e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
221f0 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d  K);..}...count =
22200 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20   *pulCount;..if 
22210 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f  (count < slot_co
22220 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  unt) {...CACKEY_
22230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22240 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61  ror. User alloca
22250 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c  ted %lu entries,
22260 20 62 75 74 20 77 65 20 68 61 76 65 20 25 6c 75   but we have %lu
22270 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e   entries.", coun
22280 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a  t, slot_count);.
22290 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
222a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
222b0 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  g CKR_BUFFER_TOO
222c0 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  _SMALL");....ret
222d0 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54  urn(CKR_BUFFER_T
222e0 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a  OO_SMALL);...}..
222f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
22300 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
22310 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22320 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
22330 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
22340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22350 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
22360 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
22370 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22380 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22390 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a  ..slot_idx = 0;.
223a0 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
223b0 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20 3c 20   0; (currslot < 
223c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
223d0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
223e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
223f0 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
22400 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22410 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
22420 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74  ctive) {....cont
22430 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
22440 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75  (slot_idx >= cou
22450 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
22460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22470 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61  ror. User alloca
22480 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c  ted %lu entries,
22490 20 62 75 74 20 77 65 20 6a 75 73 74 20 74 72 69   but we just tri
224a0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
224b0 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20  he %lu index -- 
224c0 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74  ignoring", count
224d0 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09  , slot_idx);....
224e0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
224f0 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74  ..pSlotList[slot
22500 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74  _idx] = currslot
22510 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a  ;...slot_idx++;.
22520 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
22530 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22540 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22550 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22560 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22570 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22580 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22590 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
225a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
225b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
225c0 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f  OR);..}...*pulCo
225d0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
225e0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
225f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
22600 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
22610 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
22620 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75  rs.", CKR_OK, (u
22630 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c  nsigned long) sl
22640 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ot_count);...ret
22650 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74  urn(CKR_OK);...t
22660 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f  okenPresent = to
22670 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53  kenPresent; /* S
22680 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
22690 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
226a0 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  /.}..CK_DEFINE_F
226b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
226c0 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b  _GetSlotInfo)(CK
226d0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
226e0 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54   CK_SLOT_INFO_PT
226f0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
22700 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73  ic CK_UTF8CHAR s
22710 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d  lotDescription[]
22720 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22   = "CACKey Slot"
22730 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
22740 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f  val;..int bytes_
22750 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45  to_copy;...CACKE
22760 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22770 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22780 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
22790 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
227a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
227b0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
227c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
227d0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
227e0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
227f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
22800 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22810 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
22820 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
22830 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22840 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
22850 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
22860 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
22870 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
22880 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
22890 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
228a0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
228b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
228c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
228d0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
228e0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
228f0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
22900 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
22910 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
22920 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
22930 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
22940 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
22950 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22960 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
22970 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
22980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22990 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
229a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
229b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
229c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
229d0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
229e0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
229f0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
22a00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22a10 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
22a20 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
22a30 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
22a40 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
22a50 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
22a60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
22a70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22a80 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
22a90 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
22aa0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  LID);..}...pInfo
22ab0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
22ac0 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61  _SLOT;...if (!ca
22ad0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22ae0 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  D].internal) {..
22af0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
22b00 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44   CKF_REMOVABLE_D
22b10 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28  EVICE;..}...if (
22b20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
22b30 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
22b40 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43  ts[slotID]) == C
22b50 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
22b60 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 70  ENPRESENT) {...p
22b70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  Info->flags |= C
22b80 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54  KF_TOKEN_PRESENT
22b90 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f  ;..}...bytes_to_
22ba0 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 63 61  copy = strlen(ca
22bb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22bc0 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  D].pcsc_reader);
22bd0 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70 49 6e  ..if (sizeof(pIn
22be0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
22bf0 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63  ID) < bytes_to_c
22c00 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73 5f 74  opy) {...bytes_t
22c10 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28  o_copy = sizeof(
22c20 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
22c30 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63  rerID);..}..memc
22c40 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
22c50 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b 65 79  cturerID, cackey
22c60 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
22c70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79 74 65  csc_reader, byte
22c80 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75  s_to_copy);...mu
22c90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
22ca0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22cb0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22cc0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
22cd0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
22ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22cf0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
22d00 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22d10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22d20 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22d30 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
22d40 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e  >slotDescription
22d50 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
22d60 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
22d70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
22d80 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
22d90 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63  iption, slotDesc
22da0 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28  ription, sizeof(
22db0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29  slotDescription)
22dc0 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
22dd0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
22de0 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
22df0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
22e00 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09 70 49  cturerID));...pI
22e10 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
22e20 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61  sion.major = (ca
22e30 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
22e40 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
22e50 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
22e60 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
22e70 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
22e80 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
22e90 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  ff;...pInfo->fir
22ea0 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  mwareVersion.maj
22eb0 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66  or = 0x00;..pInf
22ec0 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
22ed0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b  on.minor = 0x00;
22ee0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22ef0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22f00 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
22f10 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
22f20 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
22f30 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22f40 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b  (CK_RV, C_GetTok
22f50 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  enInfo)(CK_SLOT_
22f60 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f  ID slotID, CK_TO
22f70 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  KEN_INFO_PTR pIn
22f80 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
22f90 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
22fa0 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
22fb0 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
22fc0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
22fd0 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c  HAR defaultLabel
22fe0 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f  [] = "Unknown To
22ff0 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ken";..static CK
23000 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b  _UTF8CHAR model[
23010 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b  ] = "CAC Token";
23020 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
23030 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
23040 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
23050 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
23060 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65  um_certs;..ssize
23070 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69  _t label_ret;..i
23080 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
23090 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c  ..int use_defaul
230a0 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45  t_label;...CACKE
230b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
230c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
230d0 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
230e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
230f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23100 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
23110 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23120 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
23130 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
23140 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
23150 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23160 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
23170 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
23180 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23190 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
231a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
231b0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
231c0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
231d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
231e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
231f0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
23200 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23210 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
23220 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
23230 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
23240 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
23250 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
23260 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
23270 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
23280 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
23290 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
232a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
232b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
232c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
232d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
232e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
232f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23300 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23310 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23320 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23330 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
23340 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
23350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23360 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
23370 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
23380 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
23390 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
233a0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
233b0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
233c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
233d0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
233e0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
233f0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
23400 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
23410 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ent(&cackey_slot
23420 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41  s[slotID]) != CA
23430 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
23440 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41  NPRESENT) {...CA
23450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23460 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70  F("No token is p
23470 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44  resent in slotID
23480 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29   = %lu", slotID)
23490 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
234a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
234b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
234c0 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f  urn(CKR_TOKEN_NO
234d0 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a  T_PRESENT);..}..
234e0 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f  ./* Determine to
234f0 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63  ken label from c
23500 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
23510 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61  memset(pInfo->la
23520 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  bel, ' ', sizeof
23530 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
23540 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
23550 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63  bel = 1;...if (c
23560 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23570 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c  ID].label == NUL
23580 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e  L) {...pcsc_iden
23590 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
235a0 72 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b  read_certs(&cack
235b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
235c0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
235d0 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ts);...if (pcsc_
235e0 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
235f0 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d  LL) {....if (num
23600 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09  _certs > 0) {...
23610 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61  ..label_ret = ca
23620 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
23630 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63  ty_to_label(pcsc
23640 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e  _identities, pIn
23650 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  fo->label, sizeo
23660 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
23670 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f  ;.....if (label_
23680 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  ret > 0) {......
23690 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
236a0 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63  l = 0;.......cac
236b0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
236c0 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63  ].label = malloc
236d0 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c  (sizeof(pInfo->l
236e0 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65  abel));.......me
236f0 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74  mcpy(cackey_slot
23700 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
23710 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73   pInfo->label, s
23720 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
23730 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  el));.....}....}
23740 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
23750 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
23760 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
23770 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  s, 1);...}..} el
23780 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  se {...memcpy(pI
23790 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b  nfo->label, cack
237a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
237b0 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  .label, sizeof(p
237c0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
237d0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
237e0 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  bel = 0;..}...mu
237f0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
23800 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
23810 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23820 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
23830 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
23840 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23850 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
23860 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
23870 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
23880 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
23890 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66 61 75  ...if (use_defau
238a0 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65  lt_label) {...me
238b0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
238c0 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c  l, defaultLabel,
238d0 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c   sizeof(defaultL
238e0 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a  abel) - 1);..}..
238f0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
23900 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
23910 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
23920 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
23930 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
23940 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
23950 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  D, manufacturerI
23960 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61  D, sizeof(manufa
23970 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a  cturerID) - 1);.
23980 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
23990 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  model, ' ', size
239a0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29  of(pInfo->model)
239b0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
239c0 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20  ->model, model, 
239d0 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20  sizeof(model) - 
239e0 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
239f0 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72  fo->serialNumber
23a00 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
23a10 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65  nfo->serialNumbe
23a20 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  r));...memset(pI
23a30 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20  nfo->utcTime, ' 
23a40 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
23a50 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49  >utcTime));...pI
23a60 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
23a70 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61  sion.major = (ca
23a80 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
23a90 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
23aa0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
23ab0 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
23ac0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
23ad0 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
23ae0 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  ff;...pInfo->fir
23af0 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  mwareVersion.maj
23b00 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66  or = 0x00;..pInf
23b10 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
23b20 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b  on.minor = 0x00;
23b30 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
23b40 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54  = CKF_WRITE_PROT
23b50 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53 45 52  ECTED | CKF_USER
23b60 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _PIN_INITIALIZED
23b70 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49   | CKF_TOKEN_INI
23b80 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65  TIALIZED | cacke
23b90 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
23ba0 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 69  token_flags;...i
23bb0 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
23bc0 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  mmand != NULL) {
23bd0 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
23be0 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43 54 45 44  |= CKF_PROTECTED
23bf0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 5f  _AUTHENTICATION_
23c00 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  PATH;..}...pInfo
23c10 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f  ->ulMaxSessionCo
23c20 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61  unt = (sizeof(ca
23c30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
23c40 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
23c50 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31  essions[0])) - 1
23c60 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73  ;..pInfo->ulSess
23c70 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
23c80 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
23c90 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
23ca0 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75  lMaxRwSessionCou
23cb0 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e  nt = 0;..pInfo->
23cc0 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ulRwSessionCount
23cd0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
23ce0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
23cf0 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c  pInfo->ulMaxPinL
23d00 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f  en = 128;..pInfo
23d10 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20  ->ulMinPinLen = 
23d20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74  0;..pInfo->ulTot
23d30 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d  alPublicMemory =
23d40 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
23d50 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
23d60 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69  nfo->ulFreePubli
23d70 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  cMemory = CK_UNA
23d80 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
23d90 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
23da0 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f  TotalPrivateMemo
23db0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
23dc0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
23dd0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50  ..pInfo->ulFreeP
23de0 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43  rivateMemory = C
23df0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
23e00 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43  FORMATION;...CAC
23e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23e20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23e30 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
23e40 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
23e50 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
23e60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23e70 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  , C_WaitForSlotE
23e80 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66  vent)(CK_FLAGS f
23e90 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44  lags, CK_SLOT_ID
23ea0 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b  _PTR pSlotID, CK
23eb0 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72  _VOID_PTR pReser
23ec0 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ved) {..CACKEY_D
23ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23ee0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52  led.");...if (pR
23ef0 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29  eserved != NULL)
23f00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23f10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23f20 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f   pReserved is no
23f30 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
23f40 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
23f50 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
23f60 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23f70 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23f80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23f90 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23fa0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
23fb0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
23fc0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
23fd0 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58  ED);..}.../* XXX
23fe0 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e  : TODO: Implemen
23ff0 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41  t this... */..CA
24000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24010 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24020 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24030 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
24040 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24050 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
24060 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
24070 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24080 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
24090 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
240a0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
240b0 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  t)(CK_SLOT_ID sl
240c0 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  otID, CK_MECHANI
240d0 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63  SM_TYPE_PTR pMec
240e0 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55  hanismList, CK_U
240f0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e  LONG_PTR pulCoun
24100 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
24110 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24120 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24130 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24140 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24150 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24160 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24170 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24180 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24190 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
241a0 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74  }...if (pulCount
241b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
241c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
241d0 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f  F("Error.  pulCo
241e0 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
241f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
24200 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
24210 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
24220 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mList == NULL) {
24230 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31  ...*pulCount = 1
24240 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
24250 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24260 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
24270 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
24280 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
24290 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74  ...if (*pulCount
242a0 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 1) {...CACKEY
242b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
242c0 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f  rror.  Buffer to
242d0 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72  o small.");....r
242e0 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
242f0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a  _TOO_SMALL);..}.
24300 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  ..pMechanismList
24310 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  [0] = CKM_RSA_PK
24320 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  CS;..*pulCount =
24330 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   1;...CACKEY_DEB
24340 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24350 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
24360 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
24370 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
24380 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24390 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
243a0 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43  MechanismInfo)(C
243b0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
243c0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  , CK_MECHANISM_T
243d0 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43  YPE type, CK_MEC
243e0 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20  HANISM_INFO_PTR 
243f0 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75  pInfo) {..int mu
24400 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
24410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24420 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24430 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
24440 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
24450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24460 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
24470 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24480 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
24490 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
244a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
244b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
244c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
244d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
244e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
244f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24500 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24510 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
24520 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
24530 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
24540 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
24550 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
24560 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24570 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24580 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
24590 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
245a0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
245b0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
245c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
245d0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
245e0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
245f0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24600 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
24610 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
24620 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
24630 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24640 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24650 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
24660 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24670 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24680 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
24690 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
246a0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
246b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
246c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
246d0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
246e0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
246f0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
24700 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
24710 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
24720 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24730 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
24740 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
24750 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
24760 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24770 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24780 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24790 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
247a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
247b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
247c0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
247d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
247e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
247f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24800 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29  ...switch (type)
24810 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
24820 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f  A_PKCS:....pInfo
24830 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d  ->ulMinKeySize =
24840 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e   512;....pInfo->
24850 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38  ulMaxKeySize = 8
24860 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66  192;....pInfo->f
24870 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20  lags = CKF_HW | 
24880 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b  CKF_ENCRYPT | CK
24890 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_DECRYPT | CKF_
248a0 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46  SIGN | CKF_VERIF
248b0 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y;....break;..}.
248c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
248d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
248e0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
248f0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
24900 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20  (CKR_OK);.}../* 
24910 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
24920 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
24930 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24940 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
24950 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f  tToken)(CK_SLOT_
24960 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54  ID slotID, CK_UT
24970 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
24980 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
24990 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  en, CK_UTF8CHAR_
249a0 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43  PTR pLabel) {..C
249b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
249c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
249d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
249e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
249f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24a00 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24a10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24a20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24a30 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24a40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
24a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24a60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24a70 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
24a80 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ECTED (%i)", CKR
24a90 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
24aa0 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  TECTED);...retur
24ab0 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  n(CKR_TOKEN_WRIT
24ac0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a  E_PROTECTED);.}.
24ad0 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70  ./* We don't sup
24ae0 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64  port this method
24af0 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
24b00 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
24b10 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53  _InitPIN)(CK_SES
24b20 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24b30 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
24b40 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
24b50 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
24b60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24b70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24b80 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24b90 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24ba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24bb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
24bc0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
24bd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24be0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24bf0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24c10 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24c20 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
24c30 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
24c40 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
24c50 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
24c60 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
24c70 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
24c80 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24c90 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24ca0 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  SetPIN)(CK_SESSI
24cb0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
24cc0 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
24cd0 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f  PTR pOldPin, CK_
24ce0 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65  ULONG ulOldPinLe
24cf0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
24d00 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55  TR pNewPin, CK_U
24d10 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  LONG ulNewPinLen
24d20 29 20 7b 0a 09 63 68 61 72 20 6f 6c 64 70 69 6e  ) {..char oldpin
24d30 62 75 66 5b 36 34 5d 2c 20 6e 65 77 70 69 6e 62  buf[64], newpinb
24d40 75 66 5b 36 34 5d 3b 0a 09 63 61 63 6b 65 79 5f  uf[64];..cackey_
24d50 72 65 74 20 73 65 74 5f 70 69 6e 5f 72 65 74 2c  ret set_pin_ret,
24d60 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 43   get_pin_ret;..C
24d70 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
24d80 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
24d90 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
24da0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
24db0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
24dc0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
24dd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24de0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24df0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
24e00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24e10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
24e20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
24e30 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
24e40 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
24e50 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
24e60 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
24e70 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
24e80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24e90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24ea0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
24eb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24ec0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24ed0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
24ee0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24ef0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
24f00 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
24f10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
24f20 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
24f30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24f40 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
24f50 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
24f60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24f70 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
24f80 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  LID);..}...slotI
24f90 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
24fa0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
24fb0 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
24fc0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
24fd0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
24fe0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
24ff0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
25000 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
25010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25020 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
25030 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
25040 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
25050 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
25060 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
25070 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25080 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25090 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
250a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
250b0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
250c0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
250d0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
250e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
250f0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
25100 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
25110 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
25120 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
25130 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
25140 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25150 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25170 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
25180 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
25190 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
251a0 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 47 65 74 20  ULL) {.../* Get 
251b0 6f 6c 64 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74  old PIN */...get
251c0 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  _pin_ret = cacke
251d0 79 5f 67 65 74 5f 70 69 6e 28 6f 6c 64 70 69 6e  y_get_pin(oldpin
251e0 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74  buf);....if (get
251f0 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  _pin_ret != CACK
25200 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
25210 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25220 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68  PRINTF("Error wh
25230 69 6c 65 20 67 65 74 74 69 6e 67 20 4f 6c 64 20  ile getting Old 
25240 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43  PIN, returning C
25250 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
25260 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
25270 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25280 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
25290 09 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
252a0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
252b0 09 09 7d 0a 0a 09 09 70 4f 6c 64 50 69 6e 20 3d  ..}....pOldPin =
252c0 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54   (CK_UTF8CHAR_PT
252d0 52 29 20 6f 6c 64 70 69 6e 62 75 66 3b 0a 09 09  R) oldpinbuf;...
252e0 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 20 73 74  ulOldPinLen = st
252f0 72 6c 65 6e 28 6f 6c 64 70 69 6e 62 75 66 29 3b  rlen(oldpinbuf);
25300 0a 0a 09 09 2f 2a 20 47 65 74 20 6e 65 77 20 50  ..../* Get new P
25310 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70 69 6e 5f  IN */...get_pin_
25320 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  ret = cackey_get
25330 5f 70 69 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b  _pin(newpinbuf);
25340 0a 0a 09 09 69 66 20 28 67 65 74 5f 70 69 6e 5f  ....if (get_pin_
25350 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
25360 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
25370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25380 46 28 22 45 72 72 6f 72 20 77 68 69 6c 65 20 67  F("Error while g
25390 65 74 74 69 6e 67 20 4e 65 77 20 50 49 4e 2c 20  etting New PIN, 
253a0 72 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49  returning CKR_PI
253b0 4e 5f 49 4e 56 41 4c 49 44 2e 22 29 3b 0a 0a 09  N_INVALID.");...
253c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
253d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
253e0 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65  lock);........re
253f0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56  turn(CKR_PIN_INV
25400 41 4c 49 44 29 3b 0a 09 09 7d 0a 0a 09 09 70 4e  ALID);...}....pN
25410 65 77 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38  ewPin = (CK_UTF8
25420 43 48 41 52 5f 50 54 52 29 20 6e 65 77 70 69 6e  CHAR_PTR) newpin
25430 62 75 66 3b 0a 09 09 75 6c 4e 65 77 50 69 6e 4c  buf;...ulNewPinL
25440 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 65 77 70  en = strlen(newp
25450 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 69 66 20  inbuf);..}...if 
25460 28 70 4f 6c 64 50 69 6e 20 3d 3d 20 4e 55 4c 4c  (pOldPin == NULL
25470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25480 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64 20 50  UG_PRINTF("Old P
25490 49 4e 20 76 61 6c 75 65 20 69 73 20 77 72 6f 6e  IN value is wron
254a0 67 20 28 6e 75 6c 6c 29 2e 22 29 3b 0a 0a 09 09  g (null).");....
254b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
254c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
254d0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
254e0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
254f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4f 6c  );..}...if (ulOl
25500 64 50 69 6e 4c 65 6e 20 3d 3d 20 30 20 7c 7c 20  dPinLen == 0 || 
25510 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3e 20 38 29  ulOldPinLen > 8)
25520 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25530 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64 20 50 49  G_PRINTF("Old PI
25540 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72 6f 6e  N length is wron
25550 67 3a 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67  g: %lu.", (unsig
25560 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4f 6c 64 50  ned long) ulOldP
25570 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61 63 6b 65  inLen);....cacke
25580 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25590 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
255a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
255b0 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 7d  N_INCORRECT);..}
255c0 0a 0a 09 69 66 20 28 70 4e 65 77 50 69 6e 20 3d  ...if (pNewPin =
255d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
255e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
255f0 22 4e 65 77 20 50 49 4e 20 76 61 6c 75 65 20 69  "New PIN value i
25600 73 20 77 72 6f 6e 67 20 28 65 69 74 68 65 72 20  s wrong (either 
25610 4e 55 4c 4c 2c 20 6f 72 20 74 6f 6f 20 6c 6f 6e  NULL, or too lon
25620 67 2f 73 68 6f 72 74 29 2e 22 29 3b 0a 0a 09 09  g/short).");....
25630 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25640 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25650 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
25660 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b  KR_PIN_INVALID);
25670 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4e 65 77 50  ..}...if (ulNewP
25680 69 6e 4c 65 6e 20 3c 20 35 20 7c 7c 20 75 6c 4e  inLen < 5 || ulN
25690 65 77 50 69 6e 4c 65 6e 20 3e 20 38 29 20 7b 0a  ewPinLen > 8) {.
256a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
256b0 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e 20 6c  RINTF("New PIN l
256c0 65 6e 67 74 68 20 69 73 20 77 72 6f 6e 67 3a 20  ength is wrong: 
256d0 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c  %lu, must be atl
256e0 65 61 73 74 20 35 20 61 6e 64 20 6e 6f 20 6d 6f  east 5 and no mo
256f0 72 65 20 74 68 61 6e 20 38 2e 22 2c 20 28 75 6e  re than 8.", (un
25700 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4e  signed long) ulN
25710 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61  ewPinLen);....ca
25720 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25730 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25740 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25750 5f 50 49 4e 5f 4c 45 4e 5f 52 41 4e 47 45 29 3b  _PIN_LEN_RANGE);
25760 0a 09 7d 0a 0a 09 73 65 74 5f 70 69 6e 5f 72 65  ..}...set_pin_re
25770 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 74 5f 70  t = cackey_set_p
25780 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  in(&cackey_slots
25790 5b 73 6c 6f 74 49 44 5d 2c 20 70 4f 6c 64 50 69  [slotID], pOldPi
257a0 6e 2c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20  n, ulOldPinLen, 
257b0 70 4e 65 77 50 69 6e 2c 20 75 6c 4e 65 77 50 69  pNewPin, ulNewPi
257c0 6e 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 65 74  nLen);...if (set
257d0 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  _pin_ret != CACK
257e0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
257f0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
25800 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c  _command == NULL
25810 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  ) {....cackey_sl
25820 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
25830 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 4c  n_flags |= CKF_L
25840 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
25850 09 7d 0a 0a 09 09 69 66 20 28 73 65 74 5f 70 69  .}....if (set_pi
25860 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  n_ret == CACKEY_
25870 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b  PCSC_E_LOCKED) {
25880 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
25890 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
258a0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
258b0 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 09 09 7d  _PIN_LOCKED;...}
258c0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
258d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
258e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
258f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
25900 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
25910 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25920 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25930 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
25940 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25950 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25960 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
25970 68 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 29 20  h (set_pin_ret) 
25980 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  {...case CACKEY_
25990 50 43 53 43 5f 53 5f 4f 4b 3a 0a 09 09 09 43 41  PCSC_S_OK:....CA
259a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
259b0 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
259c0 73 65 74 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09  set PIN.");.....
259d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
259e0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 50 43  ..case CACKEY_PC
259f0 53 43 5f 45 5f 42 41 44 50 49 4e 3a 0a 09 09 09  SC_E_BADPIN:....
25a00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25a10 4e 54 46 28 22 50 49 4e 20 77 61 73 20 69 6e 76  NTF("PIN was inv
25a20 61 6c 69 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  alid.");.....ret
25a30 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41  urn(CKR_PIN_INVA
25a40 4c 49 44 29 3b 0a 09 09 63 61 73 65 20 43 41 43  LID);...case CAC
25a50 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
25a60 44 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  D:....CACKEY_DEB
25a70 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e  UG_PRINTF("Token
25a80 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72 20 74 68   is locked or th
25a90 69 73 20 63 68 61 6e 67 65 20 69 73 20 6e 6f 74  is change is not
25aa0 20 70 65 72 6d 69 74 74 65 64 2e 22 29 3b 0a 0a   permitted.");..
25ab0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
25ac0 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 64 65 66  N_LOCKED);...def
25ad0 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
25ae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6f  DEBUG_PRINTF("So
25af0 6d 65 74 68 69 6e 67 20 65 6c 73 65 20 77 65 6e  mething else wen
25b00 74 20 77 72 6f 6e 67 20 63 68 61 6e 67 69 6e 67  t wrong changing
25b10 20 74 68 65 20 50 49 4e 3a 20 25 69 22 2c 20 73   the PIN: %i", s
25b20 65 74 5f 70 69 6e 5f 72 65 74 29 3b 0a 0a 09 09  et_pin_ret);....
25b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25b40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25b50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25b60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 43  RAL_ERROR);.}..C
25b70 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25b80 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53  N(CK_RV, C_OpenS
25b90 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f  ession)(CK_SLOT_
25ba0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c  ID slotID, CK_FL
25bb0 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f  AGS flags, CK_VO
25bc0 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
25bd0 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e  ion, CK_NOTIFY n
25be0 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f  otify, CK_SESSIO
25bf0 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53  N_HANDLE_PTR phS
25c00 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67  ession) {..unsig
25c10 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69  ned long idx;..i
25c20 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
25c30 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73  ..int found_sess
25c40 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  ion = 0;...CACKE
25c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25c60 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
25c70 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45  ((flags & CKF_SE
25c80 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d  RIAL_SESSION) !=
25c90 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
25ca0 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ION) {...return(
25cb0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41  CKR_SESSION_PARA
25cc0 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  LLEL_NOT_SUPPORT
25cd0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ED);..}...if (!c
25ce0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25cf0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25d00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25d10 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
25d20 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
25d30 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
25d40 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25d50 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
25d60 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
25d70 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
25d80 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
25d90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
25da0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
25db0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25dc0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
25dd0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
25de0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
25df0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
25e00 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
25e10 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
25e20 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
25e30 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
25e40 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
25e50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
25e60 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
25e70 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25e80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25e90 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
25ea0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25eb0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
25ec0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
25ed0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
25ee0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
25ef0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25f00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25f10 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
25f20 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
25f30 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
25f40 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
25f50 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
25f60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25f70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
25f80 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
25f90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
25fa0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
25fb0 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61  he card is actua
25fc0 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e  lly in the slot.
25fd0 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65   */../* XXX: Che
25fe0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
25ff0 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20 50  this is in the P
26000 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63 61  KCS#11 specifica
26010 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63  tion */..if (cac
26020 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
26030 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
26040 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
26050 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
26060 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
26070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26080 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f  "Error.  Card no
26090 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75  t present.  Retu
260a0 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45  rning CKR_DEVICE
260b0 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63  _REMOVED");....c
260c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
260d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
260e0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
260f0 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
26100 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
26110 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 1; idx < (siz
26120 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
26130 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
26140 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
26150 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
26160 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
26170 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
26180 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73   {....found_sess
26190 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68  ion = 1;.....*ph
261a0 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a  Session = idx;..
261b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
261c0 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
261d0 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   1;....cackey_se
261e0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
261f0 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09  ID = slotID;....
26200 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26210 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  idx].state = CKS
26220 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
26230 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ON;....cackey_se
26240 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67  ssions[idx].flag
26250 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61  s = flags;....ca
26260 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26270 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  x].ulDeviceError
26280 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
26290 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41  sessions[idx].pA
262a0 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70  pplication = pAp
262b0 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61  plication;....ca
262c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
262d0 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69  x].Notify = noti
262e0 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  fy;.....cackey_s
262f0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
26300 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
26310 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26320 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
26330 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  es_count = 0;...
26340 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26350 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63  s[idx].search_ac
26360 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
26370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26380 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  x].sign_active =
26390 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
263a0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63  essions[idx].dec
263b0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
263c0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
263d0 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
263e0 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
263f0 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63  ad_identities(&c
26400 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26410 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ID], &cackey_ses
26420 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
26430 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a  ities_count);...
26440 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
26450 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
26460 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
26470 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26480 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
26490 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
264a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
264b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
264c0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
264d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
264e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
264f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75  );..}...if (!fou
26500 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09  nd_session) {...
26510 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26520 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26530 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
26540 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53   (%i)", CKR_SESS
26550 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72  ION_COUNT);....r
26560 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
26570 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43  N_COUNT);..}...C
26580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26590 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
265a0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
265b0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
265c0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
265d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
265e0 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  RV, C_CloseSessi
265f0 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
26600 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
26610 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
26620 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
26630 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26640 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
26650 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
26660 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26670 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26680 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
26690 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
266a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
266b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
266c0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
266d0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
266e0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
266f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
26700 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26710 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
26720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26730 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
26740 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
26750 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
26760 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
26770 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
26780 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26790 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
267a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
267b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
267c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
267d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
267e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
267f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
26800 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26810 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
26820 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
26830 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26840 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
26850 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26860 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26870 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
26880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26890 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
268a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
268b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
268c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
268d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
268e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
268f0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30  sion].active = 0
26900 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ;..cackey_free_i
26910 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
26920 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26930 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
26940 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26950 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
26960 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d  ties_count);...m
26970 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
26980 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26990 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
269a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
269b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
269c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
269d0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
269e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
269f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26a00 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26a10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
26a20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26a30 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
26a40 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
26a50 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
26a60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
26a70 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
26a80 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f  AllSessions)(CK_
26a90 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20  SLOT_ID slotID) 
26aa0 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
26ab0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
26ac0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
26ad0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
26ae0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
26af0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
26b00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26b10 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26b20 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
26b30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26b40 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
26b50 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26b60 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
26b70 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
26b80 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
26b90 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
26ba0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
26bb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26bc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26bd0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
26be0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
26bf0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
26c00 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
26c10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26c20 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
26c30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
26c40 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
26c50 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
26c60 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
26c70 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
26c80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26c90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26ca0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
26cb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26cc0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26cd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
26ce0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
26cf0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
26d00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26d10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
26d20 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
26d30 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
26d40 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
26d50 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
26d60 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
26d70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26d80 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
26d90 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
26da0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f  NVALID);..}...fo
26db0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
26dc0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
26dd0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
26de0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
26df0 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
26e00 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
26e10 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
26e20 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63  tive) {....if (c
26e30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
26e40 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c  dx].slotID != sl
26e50 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74  otID) {.....cont
26e60 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  inue;....}.....c
26e70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26e80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26e90 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  k);....C_CloseSe
26ea0 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63  ssion(idx);....c
26eb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
26ec0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26ed0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
26ee0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
26ef0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26f00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26f10 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
26f20 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
26f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26f40 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
26f50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
26f60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
26f70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
26f80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26f90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26fa0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
26fb0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
26fc0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
26fd0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
26fe0 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f  _RV, C_GetSessio
26ff0 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f  nInfo)(CK_SESSIO
27000 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
27010 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e  n, CK_SESSION_IN
27020 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
27030 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
27040 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
27050 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
27060 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
27070 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
27080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27090 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
270a0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
270b0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
270c0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
270d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
270e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
270f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27100 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27110 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27120 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27130 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27140 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
27150 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
27160 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
27170 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
27180 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
27190 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
271a0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
271b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
271c0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
271d0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
271e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
271f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
27200 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
27210 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27220 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
27230 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
27240 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
27250 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
27260 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27270 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
27280 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
27290 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
272a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
272b0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
272c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
272d0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
272e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
272f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
27300 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27310 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
27320 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
27330 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
27340 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
27350 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
27360 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20  ..pInfo->slotID 
27370 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
27380 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
27390 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74  ID;..pInfo->stat
273a0 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  e = cackey_sessi
273b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
273c0 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ate;..pInfo->fla
273d0 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  gs = cackey_sess
273e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66  ions[hSession].f
273f0 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  lags;..pInfo->ul
27400 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61  DeviceError = ca
27410 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27420 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65  ession].ulDevice
27430 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72  Error;...mutex_r
27440 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
27450 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
27460 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
27470 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
27480 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
27490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
274a0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
274b0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
274c0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
274d0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
274e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
274f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
27500 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
27510 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
27520 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
27530 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
27540 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  V, C_GetOperatio
27550 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
27560 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27570 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
27580 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
27590 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
275a0 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
275b0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
275c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
275d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
275e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
275f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27600 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27610 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
27620 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27630 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
27640 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
27650 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
27660 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
27670 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
27680 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
27690 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
276a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
276b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
276c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
276d0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
276e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
276f0 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61  K_RV, C_SetOpera
27700 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
27710 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27720 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
27730 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
27740 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  te, CK_ULONG ulO
27750 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
27760 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
27770 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65  LE hEncryptionKe
27780 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
27790 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61 74  DLE hAuthenticat
277a0 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ionKey) {..CACKE
277b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
277c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
277d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
277e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
277f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27800 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27810 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27820 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27830 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27840 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
27850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27860 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
27870 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27880 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
27890 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
278a0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
278b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
278c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
278d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
278e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69  ON(CK_RV, C_Logi
278f0 6e 4d 75 74 65 78 41 72 67 29 28 43 4b 5f 53 45  nMutexArg)(CK_SE
27900 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27910 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54  ssion, CK_USER_T
27920 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b  YPE userType, CK
27930 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
27940 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
27950 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f 63 6b 5f  inLen, int lock_
27960 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f 53 4c 4f  mutex) {..CK_SLO
27970 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 63 61  T_ID slotID;..ca
27980 63 6b 65 79 5f 72 65 74 20 67 65 74 5f 70 69 6e  ckey_ret get_pin
27990 5f 72 65 74 3b 0a 09 63 68 61 72 20 70 69 6e 62  _ret;..char pinb
279a0 75 66 5b 36 34 5d 3b 0a 09 69 6e 74 20 6d 75 74  uf[64];..int mut
279b0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
279c0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
279d0 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b  ..int login_ret;
279e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
279f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
27a00 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
27a10 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
27a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27a30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
27a40 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
27a50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27a60 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
27a70 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
27a80 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
27a90 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
27aa0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
27ab0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
27ac0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
27ad0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
27ae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27af0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
27b00 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
27b10 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
27b20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
27b30 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
27b40 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20 21  ..if (userType !
27b50 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09  = CKU_USER) {...
27b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20  NTF("Error.  We 
27b80 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53 45  only support USE
27b90 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f  R mode, asked fo
27ba0 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75  r %lu mode.", (u
27bb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73  nsigned long) us
27bc0 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75 72  erType)....retur
27bd0 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f  n(CKR_USER_TYPE_
27be0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
27bf0 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
27c00 0a 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27c10 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
27c20 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27c30 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 78  ck);...if (mutex
27c40 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27c50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27c60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27c70 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
27c80 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
27c90 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27ca0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21  ;...}..}...if (!
27cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27cc0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
27cd0 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d  ) {...if (lock_m
27ce0 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65  utex) {....cacke
27cf0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27d00 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27d10 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
27d20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27d30 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
27d40 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27d50 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27d60 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27d70 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
27d80 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
27d90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
27da0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
27db0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
27dc0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
27dd0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
27de0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
27df0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
27e00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27e10 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
27e20 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
27e30 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
27e40 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
27e50 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f  D);....if (lock_
27e60 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b  mutex) {....cack
27e70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27e80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27e90 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
27ea0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27eb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
27ec0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
27ed0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
27ee0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27ef0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
27f00 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
27f10 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
27f20 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
27f30 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
27f40 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
27f50 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  ex) {....cackey_
27f60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27f70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
27f80 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  }....return(CKR_
27f90 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
27fa0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
27fb0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
27fc0 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 70 50 69  ULL) {...if (pPi
27fd0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  n != NULL) {....
27fe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27ff0 4e 54 46 28 22 50 72 6f 74 65 63 74 65 64 20 61  NTF("Protected a
28000 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 70 61  uthentication pa
28010 74 68 20 69 6e 20 65 66 66 65 63 74 20 61 6e 64  th in effect and
28020 20 50 49 4e 20 70 72 6f 76 69 64 65 64 20 21 3f   PIN provided !?
28030 22 29 3b 0a 09 09 7d 0a 0a 09 09 67 65 74 5f 70  ");...}....get_p
28040 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  in_ret = cackey_
28050 67 65 74 5f 70 69 6e 28 70 69 6e 62 75 66 29 3b  get_pin(pinbuf);
28060 0a 0a 09 09 69 66 20 28 67 65 74 5f 70 69 6e 5f  ....if (get_pin_
28070 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
28080 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
28090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
280a0 46 28 22 63 61 63 6b 65 79 5f 67 65 74 5f 70 69  F("cackey_get_pi
280b0 6e 28 29 20 72 65 74 75 72 6e 65 64 20 69 6e 20  n() returned in 
280c0 66 61 69 6c 75 72 65 2c 20 61 73 73 75 6d 69 6e  failure, assumin
280d0 67 20 74 68 65 20 50 49 4e 20 77 61 73 20 69 6e  g the PIN was in
280e0 63 6f 72 72 65 63 74 2e 22 29 3b 0a 0a 09 09 09  correct.");.....
280f0 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20  if (lock_mutex) 
28100 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
28110 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
28120 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a  _biglock);....}.
28130 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
28140 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
28150 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20 28 43 4b  .}....pPin = (CK
28160 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20 70  _UTF8CHAR_PTR) p
28170 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69 6e 4c 65  inbuf;...ulPinLe
28180 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69 6e 62 75  n = strlen(pinbu
28190 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72  f);..}...login_r
281a0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  et = cackey_logi
281b0 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  n(&cackey_slots[
281c0 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75  slotID], pPin, u
281d0 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f  lPinLen, &tries_
281e0 72 65 6d 61 69 6e 69 6e 67 2c 20 33 29 3b 0a 09  remaining, 3);..
281f0 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d  if (login_ret !=
28200 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
28210 4b 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63 6b 5f  K) {...if (lock_
28220 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b  mutex) {....cack
28230 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28240 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28250 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6c 6f 67 69  ...}....if (logi
28260 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  n_ret == CACKEY_
28270 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b  PCSC_E_LOCKED) {
28280 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28290 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
282a0 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64   Token is locked
282b0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
282c0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
282d0 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
282e0 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  _USER_PIN_LOCKED
282f0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
28300 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28310 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43  ning CKR_PIN_LOC
28320 4b 45 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29  KED (%i)", (int)
28330 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29   CKR_PIN_LOCKED)
28340 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
28350 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
28360 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e  } else if (login
28370 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
28380 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a  CSC_E_BADPIN) {.
28390 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
283a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
283b0 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a  Invalid PIN.");.
283c0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
283d0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
283e0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
283f0 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a  _PIN_COUNT_LOW;.
28400 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
28410 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a  maining == 1) {.
28420 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
28430 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
28440 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
28450 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a  _PIN_FINAL_TRY;.
28460 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
28470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28480 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f  turning CKR_PIN_
28490 49 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c  INCORRECT (%i)",
284a0 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49   (int) CKR_PIN_I
284b0 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72  NCORRECT);.....r
284c0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
284d0 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
284e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
284f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
28500 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75  known error retu
28510 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79  rned from cackey
28520 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20  _login() (%i)", 
28530 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72  login_ret);....r
28540 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28550 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
28560 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
28570 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
28580 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49  &= ~(CKF_USER_PI
28590 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55  N_LOCKED | CKF_U
285a0 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
285b0 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  W | CKF_LOGIN_RE
285c0 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45  QUIRED | CKF_USE
285d0 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29  R_PIN_FINAL_TRY)
285e0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
285f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
28600 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45  ate = CKS_RO_USE
28610 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 69  R_FUNCTIONS;...i
28620 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
28630 0a 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
28640 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
28650 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28660 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75 74  lock);...if (mut
28670 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
28680 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
28690 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
286a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
286b0 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
286c0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
286d0 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ROR);...}..}...C
286e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
286f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
28700 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
28710 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
28720 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
28730 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
28740 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f  RV, C_Login)(CK_
28750 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
28760 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
28770 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
28780 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
28790 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
287a0 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 72 65 74 75  lPinLen) {..retu
287b0 72 6e 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41  rn(C_LoginMutexA
287c0 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 75 73 65  rg(hSession, use
287d0 72 54 79 70 65 2c 20 70 50 69 6e 2c 20 75 6c 50  rType, pPin, ulP
287e0 69 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d 0a 0a 43  inLen, 1));.}..C
287f0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
28800 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75  N(CK_RV, C_Logou
28810 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
28820 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
28830 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
28840 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
28850 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
28860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
28870 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
28880 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
28890 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
288a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
288b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
288c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
288d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
288e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
288f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
28900 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
28910 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
28920 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28930 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
28940 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
28950 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28960 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28970 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
28980 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
28990 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
289a0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
289b0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
289c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
289d0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
289e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
289f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
28a00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
28a10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28a20 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
28a30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28a40 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28a50 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
28a60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28a70 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
28a80 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28a90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28aa0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
28ab0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28ac0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
28ad0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
28ae0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28af0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28b00 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
28b10 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
28b20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28b30 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
28b40 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
28b50 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
28b60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
28b70 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
28b80 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
28b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28ba0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
28bb0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
28bc0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
28bd0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
28be0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
28bf0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28c00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
28c10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
28c20 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
28c30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
28c40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28c50 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
28c60 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
28c70 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
28c80 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
28c90 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
28ca0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28cb0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
28cc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28cd0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28ce0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
28cf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
28d00 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
28d10 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69 66 20 28  _SESSION;...if (
28d20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
28d30 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
28d40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
28d50 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
28d60 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
28d70 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b  UIRED;..} else {
28d80 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
28d90 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
28da0 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ags = 0;..}...mu
28db0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
28dc0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28dd0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28de0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28df0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
28e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28e10 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
28e20 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
28e30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28e40 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28e50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28e60 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
28e70 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
28e80 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
28e90 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
28ea0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28eb0 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65  (CK_RV, C_Create
28ec0 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
28ed0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28ee0 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
28ef0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
28f00 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
28f10 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
28f20 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29  LE_PTR phObject)
28f30 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
28f40 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
28f50 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
28f60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
28f70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28f80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28f90 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
28fa0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28fb0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
28fc0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
28fd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28fe0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28ff0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29000 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
29010 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
29020 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29030 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
29040 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29050 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
29060 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
29070 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29  V, C_CopyObject)
29080 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
29090 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
290a0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
290b0 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
290c0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
290d0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
290e0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
290f0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f  ANDLE_PTR phNewO
29100 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
29110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29120 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
29130 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
29140 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
29150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29160 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
29170 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29180 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29190 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
291a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
291b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
291c0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
291d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
291e0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
291f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29200 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29210 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29220 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
29230 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29240 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72  N(CK_RV, C_Destr
29250 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  oyObject)(CK_SES
29260 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29270 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
29280 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20  HANDLE hObject) 
29290 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
292a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
292b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
292c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
292d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
292e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
292f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29300 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29310 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29320 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29330 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29340 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29350 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29360 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29370 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29380 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29390 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
293a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
293b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
293c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
293d0 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  , C_GetObjectSiz
293e0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
293f0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
29400 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
29410 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e  hObject, CK_ULON
29420 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b  G_PTR pulSize) {
29430 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29440 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29450 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
29460 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
29470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29480 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29490 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
294a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
294b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
294c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
294d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
294e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
294f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29500 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29510 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29520 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29530 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29540 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29550 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
29560 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
29570 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
29580 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
29590 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
295a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
295b0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
295c0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
295d0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
295e0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f   ulCount) {..CK_
295f0 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
29600 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61  attr;..struct ca
29610 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
29620 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e  dentity;..unsign
29630 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79  ed long identity
29640 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20  _idx, attr_idx, 
29650 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e  sess_attr_idx, n
29660 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74  um_ids;..int mut
29670 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ex_retval;..CK_R
29680 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  V retval = CKR_O
29690 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  K;..CK_VOID_PTR 
296a0 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
296b0 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  G ulValueLen;...
296c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
296d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
296e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
296f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
29700 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29710 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
29720 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
29730 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
29740 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
29750 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
29760 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
29770 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
29780 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
29790 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
297a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
297b0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
297c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
297d0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
297e0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
297f0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
29800 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
29810 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
29820 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29  f (hObject == 0)
29830 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29840 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29850 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
29860 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
29870 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
29880 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
29890 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
298a0 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20   (ulCount == 0) 
298b0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
298c0 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
298d0 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
298e0 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
298f0 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
29900 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ly */...CACKEY_D
29910 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29920 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
29930 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
29940 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
29950 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
29960 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
29970 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
29980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29990 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54  INTF("Error.  pT
299a0 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e  emplate is NULL.
299b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
299c0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
299d0 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f  ;..}...identity_
299e0 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20  idx = hObject - 
299f0 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  1;...mutex_retva
29a00 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
29a10 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
29a20 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
29a30 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
29a40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29a50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29a60 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
29a70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29a80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29a90 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
29aa0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29ab0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
29ac0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
29ad0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29ae0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
29af0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29b00 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
29b10 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
29b20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
29b30 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
29b40 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69  LID);..}...num_i
29b50 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ds = cackey_sess
29b60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29b70 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
29b80 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f  ...if (identity_
29b90 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20  idx >= num_ids) 
29ba0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
29bb0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29bc0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
29bd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29be0 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
29bf0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
29c00 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69  nge.  identity_i
29c10 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64  dx = %lu, num_id
29c20 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69  s = %lu.", (unsi
29c30 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
29c40 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e  ity_idx, (unsign
29c50 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73  ed long) num_ids
29c60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29c70 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
29c80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64  NVALID);..}...id
29c90 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
29ca0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29cb0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69  on].identities[i
29cc0 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09  dentity_idx];...
29cd0 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
29ce0 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c  0; attr_idx < ul
29cf0 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  Count; attr_idx+
29d00 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72  +) {...curr_attr
29d10 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74   = &pTemplate[at
29d20 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c  tr_idx];....pVal
29d30 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
29d40 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
29d50 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45  NG) -1;....CACKE
29d60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29d70 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  Looking for attr
29d80 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69  ibute 0x%08lx (i
29d90 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e  dentity:%lu) ...
29da0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
29db0 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
29dc0 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  pe, (unsigned lo
29dd0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
29de0 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f  );....for (sess_
29df0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
29e00 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64  ss_attr_idx < id
29e10 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
29e20 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
29e30 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
29e40 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74  if (identity->at
29e50 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
29e60 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20  tr_idx].type == 
29e70 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
29e80 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
29e90 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
29ea0 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75   found it, pValu
29eb0 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c  e = %p, ulValueL
29ec0 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74  en = %lu", ident
29ed0 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
29ee0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
29ef0 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d  Value, identity-
29f00 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
29f10 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
29f20 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09  ueLen);.........
29f30 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
29f40 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
29f50 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
29f60 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alue;.....ulValu
29f70 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  eLen = identity-
29f80 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
29f90 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
29fa0 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a  ueLen;....}...}.
29fb0 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
29fc0 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c  ->pValue && pVal
29fd0 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72  ue) {....if (cur
29fe0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
29ff0 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  en >= ulValueLen
2a000 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  ) {.....memcpy(c
2a010 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
2a020 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75  , pValue, ulValu
2a030 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  eLen);....} else
2a040 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65   {.....ulValueLe
2a050 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
2a060 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
2a070 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2a080 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  MALL;....}...}..
2a090 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  ..curr_attr->ulV
2a0a0 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
2a0b0 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  eLen;..}...mutex
2a0c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2a0d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2a0e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2a0f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2a100 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2a110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a120 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2a130 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2a140 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2a150 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2a160 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
2a170 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  R_ATTRIBUTE_TYPE
2a180 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41  _INVALID) {...CA
2a190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a1a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2a1b0 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
2a1c0 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28  INVALID (%i)", (
2a1d0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
2a1e0 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
2a1f0 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
2a200 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41  OO_SMALL) {...CA
2a210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a220 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2a230 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2a240 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  L (%i)", (int) r
2a250 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
2a260 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
2a270 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
2a280 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2a290 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2a2a0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
2a2b0 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  val);..} else {.
2a2c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a2d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2a2e0 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
2a2f0 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  al);..}...return
2a300 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2a310 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a320 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72  CK_RV, C_SetAttr
2a330 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
2a340 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2a350 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
2a360 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
2a370 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
2a380 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
2a390 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
2a3a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2a3b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2a3c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2a3d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2a3e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a3f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a400 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a410 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a420 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a430 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a450 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a460 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a470 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2a480 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2a490 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2a4a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2a4b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a4c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2a4d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2a4e0 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  , C_FindObjectsI
2a4f0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2a500 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2a510 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2a520 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
2a530 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
2a540 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
2a550 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69  tID;..CK_ULONG i
2a560 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
2a570 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
2a580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2a590 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2a5a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2a5b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2a5c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a5d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2a5e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2a5f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2a600 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a610 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2a620 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2a630 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2a640 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2a650 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2a660 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2a670 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a680 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a690 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2a6a0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2a6b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2a6c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2a6d0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2a6e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2a6f0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2a700 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2a710 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2a720 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a740 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2a750 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2a760 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2a770 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2a780 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a790 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2a7a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2a7b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a7c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2a7d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a7e0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2a7f0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2a800 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a810 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2a820 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2a830 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2a840 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2a850 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
2a860 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a870 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a880 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2a890 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a8a0 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61  r.  Search alrea
2a8b0 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  dy active.");...
2a8c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2a8d0 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
2a8e0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
2a8f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a900 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
2a910 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
2a920 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
2a930 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
2a940 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
2a950 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
2a960 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a970 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a980 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
2a990 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
2a9a0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
2a9b0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
2a9c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a9d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a9e0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
2a9f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
2aa00 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
2aa10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2aa20 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
2aa30 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
2aa40 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
2aa50 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
2aa60 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
2aa70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2aa80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2aa90 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
2aaa0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2aab0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
2aac0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2aad0 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  .slot_reset) {..
2aae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aaf0 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68  INTF("The slot h
2ab00 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69  as been reset si
2ab10 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b  nce we last look
2ab20 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65  ed for identitie
2ab30 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22  s -- rescanning"
2ab40 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  );....if (cackey
2ab50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ab60 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21  on].identities !
2ab70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63  = NULL) {....cac
2ab80 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
2ab90 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ies(cackey_sessi
2aba0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2abb0 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79  entities, cackey
2abc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2abd0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2abe0 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ount);.....cacke
2abf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ac00 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
2ac10 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
2ac20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ac30 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2ac40 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a  count = 0;...}..
2ac50 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
2ac60 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
2ac70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66   != NULL) {....f
2ac80 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
2ac90 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b  [slotID].label);
2aca0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
2acb0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
2acc0 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61   NULL;...}....ca
2acd0 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
2ace0 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  eset(&cackey_slo
2acf0 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63  ts[slotID]);...c
2ad00 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2ad10 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ID].slot_reset =
2ad20 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63   0;..}...if (cac
2ad30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ad40 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2ad50 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
2ad60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ad70 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2ad80 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
2ad90 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61  d_identities(&ca
2ada0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2adb0 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73  D], &cackey_sess
2adc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2add0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
2ade0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70  ;..}...if (pTemp
2adf0 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  late != NULL) {.
2ae00 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d  ..if (ulCount !=
2ae10 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f   0) {....cackey_
2ae20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ae30 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
2ae40 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b  count = ulCount;
2ae50 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2ae60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ae70 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c  arch_query = mal
2ae80 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69  loc(ulCount * si
2ae90 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
2aea0 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61  );.....memcpy(ca
2aeb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2aec0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2aed0 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c  uery, pTemplate,
2aee0 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f   ulCount * sizeo
2aef0 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a  f(*pTemplate));.
2af00 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
2af10 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20   idx < ulCount; 
2af20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20  idx++) {.....if 
2af30 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e  (pTemplate[idx].
2af40 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29  ulValueLen == 0)
2af50 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73   {......cackey_s
2af60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2af70 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
2af80 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c  dx].pValue = NUL
2af90 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75  L;.......continu
2afa0 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61  e;.....}......ca
2afb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2afc0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2afd0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
2afe0 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c   = malloc(pTempl
2aff0 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ate[idx].ulValue
2b000 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63  Len);......if (c
2b010 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b020 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b030 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
2b040 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  e) {......memcpy
2b050 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b060 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2b070 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
2b080 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69  lue, pTemplate[i
2b090 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d  dx].pValue, pTem
2b0a0 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
2b0b0 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09  ueLen);.....}...
2b0c0 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
2b0d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2b0e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2b0f0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
2b100 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  0;....cackey_ses
2b110 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b120 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
2b130 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  ULL;...}..} else
2b140 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
2b150 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
2b160 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b170 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b180 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2b190 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b1a0 20 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73    Search query s
2b1b0 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
2b1c0 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20  , but number of 
2b1d0 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20  query terms not 
2b1e0 73 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22  specified as 0."
2b1f0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
2b200 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2b210 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
2b220 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b230 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
2b240 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63  count = 0;...cac
2b250 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b260 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2b270 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  ery = NULL;..}..
2b280 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2b290 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2b2a0 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63  h_active = 1;..c
2b2b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b2c0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b2d0 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d  curr_id = 0;...m
2b2e0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2b2f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b300 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b310 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2b320 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2b330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b340 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2b350 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2b360 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2b370 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2b380 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2b390 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2b3a0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2b3b0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2b3c0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73  rn(CKR_OK);.}..s
2b3d0 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
2b3e0 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f  _pkcs11_compare_
2b3f0 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41 54  attributes(CK_AT
2b400 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41  TRIBUTE *a, CK_A
2b410 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a 09  TTRIBUTE *b) {..
2b420 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
2b430 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62  mallbuf, *largeb
2b440 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c  uf;..size_t smal
2b450 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62  lbuf_len, largeb
2b460 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d  uf_len;...if (a-
2b470 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70 65  >type != b->type
2b480 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  ) {...return(0);
2b490 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2b4a0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e  UG_PRINTF("    .
2b4b0 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e  .. found matchin
2b4c0 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09  g type ...");...
2b4d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b4e0 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f  NTBUF("    ... o
2b4f0 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70  ur value:", a->p
2b500 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75  Value, a->ulValu
2b510 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e  eLen);...if (b->
2b520 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
2b530 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b540 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
2b550 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61  ... found wildca
2b560 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72  rd match");....r
2b570 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69  eturn(1);..}...i
2b580 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20  f (a->pValue == 
2b590 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
2b5a0 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62  (0);..}.. .if (b
2b5b0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ->ulValueLen == 
2b5c0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26  a->ulValueLen &&
2b5d0 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75   memcmp(a->pValu
2b5e0 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d  e, b->pValue, b-
2b5f0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20  >ulValueLen) == 
2b600 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2b610 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
2b620 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61     ... found exa
2b630 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72  ct match");....r
2b640 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73  eturn(1);..}...s
2b650 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29 20  witch (a->type) 
2b660 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  {...case CKA_MOD
2b670 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e  ULUS:....if (a->
2b680 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d  ulValueLen == b-
2b690 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09  >ulValueLen) {..
2b6a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
2b6b0 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75  ...if (a->ulValu
2b6c0 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75  eLen > b->ulValu
2b6d0 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c  eLen) {.....smal
2b6e0 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65  lbuf = b->pValue
2b6f0 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c  ;.....smallbuf_l
2b700 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  en = b->ulValueL
2b710 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75  en;......largebu
2b720 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = a->pValue;..
2b730 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  ...largebuf_len 
2b740 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = a->ulValueLen;
2b750 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
2b760 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70  .smallbuf = a->p
2b770 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c  Value;.....small
2b780 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56  buf_len = a->ulV
2b790 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61  alueLen;......la
2b7a0 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c  rgebuf = b->pVal
2b7b0 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66  ue;.....largebuf
2b7c0 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75  _len = b->ulValu
2b7d0 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66  eLen;....}.....f
2b7e0 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c  or (; largebuf_l
2b7f0 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c  en != smallbuf_l
2b800 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c  en; largebuf++,l
2b810 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b  argebuf_len--) {
2b820 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65 62 75  .....if (largebu
2b830 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09  f[0] != 0) {....
2b840 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09  ..break;.....}..
2b850 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72 67  ..}.....if (larg
2b860 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c  ebuf_len != smal
2b870 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09  lbuf_len) {.....
2b880 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
2b890 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65  if (memcmp(large
2b8a0 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73  buf, smallbuf, s
2b8b0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20  mallbuf_len) == 
2b8c0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
2b8d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
2b8e0 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61       ... found a
2b8f0 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63 68  pproximate match
2b900 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2b910 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  1);....}.....bre
2b920 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ak;..}...return(
2b930 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  0);.}..CK_DEFINE
2b940 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2b950 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28   C_FindObjects)(
2b960 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2b970 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
2b980 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
2b990 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c   phObject, CK_UL
2b9a0 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43  ONG ulMaxObjectC
2b9b0 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ount, CK_ULONG_P
2b9c0 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  TR pulObjectCoun
2b9d0 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
2b9e0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75  key_identity *cu
2b9f0 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49  rr_id;..CK_ATTRI
2ba00 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
2ba10 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f  ..CK_ULONG curr_
2ba20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74  id_idx, curr_out
2ba30 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74  _id_idx, curr_at
2ba40 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74  tr_idx, sess_att
2ba50 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  r_idx;..CK_ULONG
2ba60 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
2ba70 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
2ba80 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  nt;..int mutex_r
2ba90 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20 43 41  etval;.#ifdef CA
2baa0 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43  CKEY_DEBUG_SEARC
2bab0 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73 74 72  H_SPEEDTEST..str
2bac0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74 61 72  uct timeval star
2bad0 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36 34 5f  t, end;..uint64_
2bae0 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65 6e 64  t start_int, end
2baf0 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _int;.#endif...C
2bb00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bb10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2bb20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2bb30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2bb40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bb50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2bb60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2bb70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2bb80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2bb90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2bba0 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  (pulObjectCount 
2bbb0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2bbc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bbd0 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a  ("Error.  pulObj
2bbe0 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  ectCount is NULL
2bbf0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2bc00 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2bc10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
2bc20 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  ject == NULL && 
2bc30 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
2bc40 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
2bc50 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
2bc60 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
2bc70 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
2bc80 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
2bc90 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a  mediately */...*
2bca0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
2bcb0 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   0;....CACKEY_DE
2bcc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2bcd0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2bce0 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
2bcf0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
2bd00 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2bd10 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63  .}...if (phObjec
2bd20 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
2bd30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bd40 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62  TF("Error.  phOb
2bd50 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ject is NULL.");
2bd60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2bd70 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2bd80 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a  }...if (ulMaxObj
2bd90 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
2bda0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bdb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2bdc0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2bdd0 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66  f objects specif
2bde0 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a  ied as zero.");.
2bdf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2be00 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2be10 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2be20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2be30 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2be40 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2be50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2be60 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2be70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2be80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2be90 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2bea0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2beb0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2bec0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2bed0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2bee0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2bef0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2bf00 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2bf10 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2bf20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bf30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2bf40 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2bf50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2bf60 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2bf70 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2bf80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2bf90 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2bfa0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2bfb0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2bfc0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2bfd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bfe0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2bff0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2c000 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2c010 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2c020 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
2c030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c040 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2c050 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2c060 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c070 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c080 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c0a0 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69   Search not acti
2c0b0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2c0c0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2c0d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c0e0 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
2c0f0 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43  CKEY_DEBUG_SEARC
2c100 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74  H_SPEEDTEST..get
2c110 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61 72 74  timeofday(&start
2c120 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
2c130 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  ..curr_out_id_id
2c140 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72  x = 0;..for (cur
2c150 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65  r_id_idx = cacke
2c160 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c170 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
2c180 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78  _id; curr_id_idx
2c190 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
2c1a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2c1b0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26  ntities_count &&
2c1c0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
2c1d0 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b  t; curr_id_idx++
2c1e0 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20  ) {...curr_id = 
2c1f0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2c200 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2c210 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64  ities[curr_id_id
2c220 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  x];....CACKEY_DE
2c230 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63  BUG_PRINTF("Proc
2c240 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  essing identity:
2c250 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
2c260 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64  long) curr_id_id
2c270 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63  x);....matched_c
2c280 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72  ount = 0;....for
2c290 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20   (curr_attr_idx 
2c2a0 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  = 0; curr_attr_i
2c2b0 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
2c2c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c2d0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
2c2e0 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  t; curr_attr_idx
2c2f0 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61  ++) {....prev_ma
2c300 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61  tched_count = ma
2c310 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09  tched_count;....
2c320 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61  .curr_attr = &ca
2c330 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c340 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2c350 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69  uery[curr_attr_i
2c360 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  dx];.....CACKEY_
2c370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
2c380 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74  Checking for att
2c390 72 69 62 75 74 65 20 25 73 20 28 30 78 25 30 38  ribute %s (0x%08
2c3a0 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79 3a  lx) in identity:
2c3b0 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  %i...", CACKEY_D
2c3c0 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
2c3d0 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f  UTE_TO_STR(curr_
2c3e0 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e  attr->type), (un
2c3f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
2c400 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69  r_attr->type, (i
2c410 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
2c420 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2c430 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20  G_PRINTBUF("    
2c440 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  Value looking fo
2c450 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  r:", curr_attr->
2c460 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74  pValue, curr_att
2c470 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  r->ulValueLen);.
2c480 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74  ....for (sess_at
2c490 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73  tr_idx = 0; sess
2c4a0 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72  _attr_idx < curr
2c4b0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f  _id->attributes_
2c4c0 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72  count; sess_attr
2c4d0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66  _idx++) {.....if
2c4e0 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f   (cackey_pkcs11_
2c4f0 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74  compare_attribut
2c500 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74 74  es(&curr_id->att
2c510 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
2c520 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74 74  r_idx], curr_att
2c530 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63 68  r)) {......match
2c540 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09  ed_count++;.....
2c550 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09  ..break;.....}..
2c560 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68  ..}...../* If th
2c570 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c  e attribute coul
2c580 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64  d not be matched
2c590 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  , do not try to 
2c5a0 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c  match additional
2c5b0 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09   attributes */..
2c5c0 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68  ..if (prev_match
2c5d0 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63  ed_count == matc
2c5e0 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  hed_count) {....
2c5f0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
2c600 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f  ....if (matched_
2c610 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f  count == cackey_
2c620 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c630 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
2c640 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
2c650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c660 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74  "  ... All %i at
2c670 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
2c680 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69   for found, addi
2c690 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74  ng identity:%i t
2c6a0 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22  o returned list"
2c6b0 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
2c6c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c6d0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
2c6e0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
2c6f0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68  _id_idx);.....ph
2c700 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f  Object[curr_out_
2c710 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69  id_idx] = curr_i
2c720 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75  d_idx + 1;.....u
2c730 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d  lMaxObjectCount-
2c740 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f  -;.....curr_out_
2c750 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c  id_idx++;...} el
2c760 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
2c770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
2c780 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f  .. Not all %i (o
2c790 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74  nly found %i) at
2c7a0 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
2c7b0 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20   for found, not 
2c7c0 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  adding identity:
2c7d0 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  %i", (int) cacke
2c7e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c7f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2c800 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d  y_count, (int) m
2c810 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69  atched_count, (i
2c820 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
2c830 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79  ;...}..}..cackey
2c840 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c850 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
2c860 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78  id = curr_id_idx
2c870 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  ;..*pulObjectCou
2c880 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64  nt = curr_out_id
2c890 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20 43 41  _idx;..#ifdef CA
2c8a0 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43  CKEY_DEBUG_SEARC
2c8b0 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74  H_SPEEDTEST..get
2c8c0 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64 2c 20  timeofday(&end, 
2c8d0 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f 69 6e  NULL);..start_in
2c8e0 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f 73 65  t = (start.tv_se
2c8f0 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 73  c * 1000000) + s
2c900 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a 09 65  tart.tv_usec;..e
2c910 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e 74 76  nd_int = (end.tv
2c920 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20  _sec * 1000000) 
2c930 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b 0a 09  + end.tv_usec;..
2c940 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2c950 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25 6c 75  "Search took %lu
2c960 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c 6e 22   microseconds\n"
2c970 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2c980 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73 74 61  ) (end_int - sta
2c990 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64 69 66  rt_int));.#endif
2c9a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2c9b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2c9c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2c9d0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2c9e0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2c9f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ca00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ca10 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2ca20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ca30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2ca40 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2ca50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2ca60 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2ca70 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20  i), num objects 
2ca80 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20  = %lu", CKR_OK, 
2ca90 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29  *pulObjectCount)
2caa0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2cab0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2cac0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2cad0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69   C_FindObjectsFi
2cae0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
2caf0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
2cb00 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78   {..CK_ULONG idx
2cb10 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
2cb20 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
2cb30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2cb40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2cb50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2cb60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2cb70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cb80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2cb90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2cba0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2cbb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2cbc0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2cbd0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2cbe0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2cbf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2cc00 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2cc10 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2cc20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cc30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2cc40 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2cc50 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2cc60 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2cc70 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2cc80 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2cc90 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2cca0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2ccb0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2ccc0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2ccd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2cce0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ccf0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2cd00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2cd10 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2cd20 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2cd30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2cd40 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2cd50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2cd60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2cd70 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2cd80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2cd90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2cda0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2cdb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2cdc0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2cdd0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2cde0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2cdf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2ce00 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
2ce10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2ce20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2ce30 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2ce40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ce50 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63  .  Search not ac
2ce60 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2ce70 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2ce80 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2ce90 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ED);..}...cackey
2cea0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ceb0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
2cec0 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64  e = 0;...for (id
2ced0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61 63  x = 0; idx < cac
2cee0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cef0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2cf00 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  ery_count; idx++
2cf10 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
2cf20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cf30 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2cf40 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a  [idx].pValue) {.
2cf50 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
2cf60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cf70 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
2cf80 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d  dx].pValue);...}
2cf90 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2cfa0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cfb0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2cfc0 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
2cfd0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2cfe0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2cff0 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  y);..}...mutex_r
2d000 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2d010 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2d020 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2d030 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2d040 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2d050 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d060 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2d070 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2d080 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d090 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2d0a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d0b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d0c0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2d0d0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2d0e0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2d0f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2d100 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  V, C_EncryptInit
2d110 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d120 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d130 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2d140 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2d150 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2d160 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2d170 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d180 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d190 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d1a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d1b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d1c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d1d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d1e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d1f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d200 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d210 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d220 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2d230 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2d240 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2d250 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d260 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2d270 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d280 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2d290 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d2a0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43  RV, C_Encrypt)(C
2d2b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d2c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2d2d0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
2d2e0 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
2d2f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
2d300 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
2d310 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
2d320 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20  cryptedDataLen) 
2d330 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2d340 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2d350 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2d360 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2d370 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d380 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2d390 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2d3a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d3b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2d3c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2d3d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d3e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2d3f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d400 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2d410 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2d420 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2d430 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2d440 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d450 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2d460 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2d470 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  , C_EncryptUpdat
2d480 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2d490 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2d4a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2d4b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2d4c0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2d4d0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2d4e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2d4f0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2d500 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2d510 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2d520 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2d530 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2d540 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d550 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d560 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2d570 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2d580 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2d590 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2d5a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2d5b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2d5c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2d5d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2d5e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2d5f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d600 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2d610 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d620 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2d630 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2d640 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46  K_RV, C_EncryptF
2d650 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2d660 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d670 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
2d680 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74  astEncryptedPart
2d690 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2d6a0 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50  ulLastEncryptedP
2d6b0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2d6c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d6d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2d6e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2d6f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2d700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d710 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2d720 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2d730 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2d740 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2d750 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2d760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2d770 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2d780 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d790 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2d7a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d7b0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2d7c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d7d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2d7e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d7f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2d800 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
2d810 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d820 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2d830 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2d840 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2d850 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
2d860 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2d870 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
2d880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d890 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d8a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d8b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d8c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d8d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d8e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d8f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d900 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d910 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
2d920 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
2d930 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d940 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d950 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
2d960 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2d970 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2d980 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
2d990 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
2d9a0 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
2d9b0 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
2d9c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d9d0 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
2d9e0 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
2d9f0 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
2da00 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
2da10 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
2da20 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
2da30 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2da40 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2da50 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2da60 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2da70 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2da80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2da90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2daa0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2dab0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2dac0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2dad0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2dae0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2daf0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
2db00 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2db10 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2db20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2db30 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2db40 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2db50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2db60 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2db70 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2db80 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2db90 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2dba0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2dbb0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2dbc0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2dbd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2dbe0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2dbf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dc00 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2dc10 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2dc20 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2dc30 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2dc40 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2dc50 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2dc60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2dc70 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
2dc80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2dc90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2dca0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2dcb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dcc0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61  rror.  Decrypt a
2dcd0 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
2dce0 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
2dcf0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2dd00 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
2dd10 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
2dd20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2dd30 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2dd40 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
2dd50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2dd60 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2dd70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dd80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2dd90 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
2dda0 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
2ddb0 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
2ddc0 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
2ddd0 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
2dde0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
2ddf0 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
2de00 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
2de10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2de20 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
2de30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
2de40 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
2de50 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
2de60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2de70 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2de80 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
2de90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2dea0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61  n].decrypt_mecha
2deb0 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  nism = pMechanis
2dec0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63  m->mechanism;..c
2ded0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2dee0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2def0 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65  _mech_parm = pMe
2df00 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65  chanism->pParame
2df10 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ter;..cackey_ses
2df20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2df30 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
2df40 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73  mlen = pMechanis
2df50 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65  m->ulParameterLe
2df60 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  n;..cackey_sessi
2df70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2df80 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d  crypt_identity =
2df90 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
2dfa0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2dfb0 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09  tities[hKey];...
2dfc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2dfd0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2dfe0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2dff0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2e000 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2e010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e020 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2e030 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2e040 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e050 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2e060 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2e070 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2e080 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2e090 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2e0a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
2e0b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2e0c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2e0d0 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
2e0e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2e0f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2e100 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
2e110 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
2e120 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  dDataLen, CK_BYT
2e130 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2e140 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
2e150 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  aLen) {..CK_ULON
2e160 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  G datalen_update
2e170 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b  , datalen_final;
2e180 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f  ..CK_RV decrypt_
2e190 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
2e1a0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2e1b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2e1c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2e1d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2e1e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2e1f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e200 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2e210 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2e220 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2e230 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2e240 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44  );..}...if (pulD
2e250 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ataLen == NULL) 
2e260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e280 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55  pulDataLen is NU
2e290 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2e2a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2e2b0 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65  AD);..}...datale
2e2c0 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44  n_update = *pulD
2e2d0 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70  ataLen;...decryp
2e2e0 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70  t_ret = C_Decryp
2e2f0 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  tUpdate(hSession
2e300 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  , pEncryptedData
2e310 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74  , ulEncryptedDat
2e320 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61  aLen, pData, &da
2e330 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09  talen_update);..
2e340 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
2e350 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
2e360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e370 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2e380 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75  yptUpdate() retu
2e390 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
2e3a0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
2e3b0 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79  gned long) decry
2e3c0 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  pt_ret);....if (
2e3d0 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
2e3e0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2e3f0 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72  ALL) {..../* Ter
2e400 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74 69 6f  minate decryptio
2e410 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  n operation */..
2e420 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2e430 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2e440 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e450 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
2e460 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2e470 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2e480 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e490 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2e4a0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
2e4b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2e4c0 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  OR);....}.....if
2e4d0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2e4e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2e4f0 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
2e500 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2e510 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2e520 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2e530 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e540 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2e550 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
2e560 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2e570 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2e580 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  D);....}.....if 
2e590 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2e5a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2e5b0 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
2e5c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e5d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e5e0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2e5f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e600 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
2e610 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2e620 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2e630 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2e640 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
2e650 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
2e660 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e670 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
2e680 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72  = 0;.....mutex_r
2e690 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2e6a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2e6b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
2e6c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2e6d0 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
2e6e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e6f0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2e700 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2e710 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2e720 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2e730 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  ..}...}....retur
2e740 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  n(decrypt_ret);.
2e750 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20  .}...if (pData) 
2e760 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74  {...pData += dat
2e770 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a  alen_update;..}.
2e780 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d  .datalen_final =
2e790 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64   *pulDataLen - d
2e7a0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a  atalen_update;..
2e7b0 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
2e7c0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53  _DecryptFinal(hS
2e7d0 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26  ession, pData, &
2e7e0 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a  datalen_final);.
2e7f0 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
2e800 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
2e810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e820 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
2e830 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75  ryptFinal() retu
2e840 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
2e850 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
2e860 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79  gned long) decry
2e870 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  pt_ret);....retu
2e880 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b  rn(decrypt_ret);
2e890 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65  ..}...*pulDataLe
2e8a0 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n = datalen_upda
2e8b0 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e  te + datalen_fin
2e8c0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
2e8d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e8e0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2e8f0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2e900 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2e910 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e920 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
2e930 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
2e940 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2e950 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2e960 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2e970 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
2e980 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
2e990 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2e9a0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2e9b0 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
2e9c0 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62  static CK_BYTE b
2e9d0 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a  uf[16384];..ssiz
2e9e0 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f  e_t buflen;..CK_
2e9f0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
2ea00 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
2ea10 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2ea20 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  R;..int mutex_re
2ea30 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
2ea40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2ea50 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2ea60 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2ea70 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2ea80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ea90 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2eaa0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2eab0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2eac0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2ead0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2eae0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2eaf0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2eb00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2eb10 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2eb20 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2eb30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2eb40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2eb50 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2eb60 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2eb70 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2eb80 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2eb90 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72  ;..}...if (pEncr
2eba0 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c  yptedPart == NUL
2ebb0 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64  L && ulEncrypted
2ebc0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
2ebd0 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
2ebe0 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
2ebf0 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f  ed to decrypt no
2ec00 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
2ec10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ec20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2ec30 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
2ec40 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
2ec50 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
2ec60 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
2ec70 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d  pEncryptedPart =
2ec80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2ec90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2eca0 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74  "Error. pEncrypt
2ecb0 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20  edPart is NULL, 
2ecc0 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50  but ulEncryptedP
2ecd0 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
2ece0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ecf0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2ed00 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63  ;..}...if (ulEnc
2ed10 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
2ed20 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2ed30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ed40 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50  or. ulEncryptedP
2ed50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
2ed60 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
2ed70 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2ed80 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2ed90 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  AD);..}...if (pu
2eda0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lPartLen == NULL
2edb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2edc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2edd0 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  . pulPartLen is 
2ede0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2edf0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2ee00 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  _BAD);..}...mute
2ee10 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2ee20 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2ee30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2ee40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2ee50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2ee60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ee70 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2ee80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2ee90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2eea0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2eeb0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2eec0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2eed0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2eee0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2eef0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2ef00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ef10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2ef20 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2ef30 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2ef40 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2ef50 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2ef60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2ef70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ef80 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2ef90 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2efa0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2efb0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2efc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2efd0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
2efe0 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
2eff0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2f000 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2f010 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2f020 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
2f030 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2f040 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
2f050 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
2f060 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
2f070 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
2f080 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2f090 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
2f0a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f0b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2f0c0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2f0d0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
2f0e0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
2f0f0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
2f100 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2f110 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2f120 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
2f130 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
2f140 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2f150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f160 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
2f170 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
2f180 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
2f190 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
2f1a0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
2f1b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f1c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f1d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2f1e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2f1f0 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
2f200 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2f210 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
2f220 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
2f230 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
2f240 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
2f250 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09  o decrypt */....
2f260 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
2f270 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
2f280 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2f290 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
2f2a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2f2b0 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70  rypt_identity, p
2f2c0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75  EncryptedPart, u
2f2d0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2f2e0 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  n, buf, sizeof(b
2f2f0 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09  uf), 0, 1);.....
2f300 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41  if (buflen == CA
2f310 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44  CKEY_PCSC_E_NEED
2f320 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b 65 79 5f  LOGIN && cackey_
2f330 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
2f340 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66 20 28 43  ULL) {.....if (C
2f350 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68  _LoginMutexArg(h
2f360 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45  Session, CKU_USE
2f370 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d  R, NULL, 0, 0) =
2f380 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
2f390 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  .buflen = cackey
2f3a0 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
2f3b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2f3c0 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
2f3d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2f3e0 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20  crypt_identity, 
2f3f0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2f400 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2f410 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  en, buf, sizeof(
2f420 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 09 09 09  buf), 0, 1);....
2f430 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
2f440 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
2f450 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20  ../* Decryption 
2f460 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69  failed. */.....i
2f470 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
2f480 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
2f490 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74  OGIN) {......ret
2f4a0 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e  val = CKR_USER_N
2f4b0 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09  OT_LOGGED_IN;...
2f4c0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75 66  ..} else if (buf
2f4d0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2f4e0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
2f4f0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
2f500 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
2f510 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
2f520 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
2f530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
2f540 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55  led to send APDU
2f550 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69 22 2c 20  , error = %li", 
2f560 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75 66 6c 65  (long int) bufle
2f570 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74 76 61 6c  n);.......retval
2f580 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2f590 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
2f5a0 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
2f5b0 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65  gned long) bufle
2f5c0 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e  n) > *pulPartLen
2f5d0 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09 09   && pPart) {....
2f5e0 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64 61  ./* Decrypted da
2f5f0 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ta too large */.
2f600 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2f610 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2f620 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  L;....} else {..
2f630 09 09 09 69 66 20 28 70 50 61 72 74 29 20 7b 0a  ...if (pPart) {.
2f640 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61 72  .....memcpy(pPar
2f650 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  t, buf, buflen);
2f660 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
2f670 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e  PartLen = buflen
2f680 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
2f690 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09  CKR_OK;....}....
2f6a0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
2f6b0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2f6c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f6d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f6e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2f6f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2f700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f710 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2f720 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2f730 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2f740 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2f750 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f760 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2f770 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
2f780 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
2f790 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
2f7a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2f7b0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69 6e  RV, C_DecryptFin
2f7c0 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
2f7d0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2f7e0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73  CK_BYTE_PTR pLas
2f7f0 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tPart, CK_ULONG_
2f800 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74 4c  PTR pulLastPartL
2f810 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
2f820 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65  _retval;..int te
2f830 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
2f840 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 1;...CACKEY_DE
2f850 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2f860 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2f870 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2f880 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f890 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f8a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2f8b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f8c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2f8d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2f8e0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2f8f0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2f900 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2f910 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2f920 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2f930 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2f940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f950 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2f960 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2f970 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2f980 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2f990 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2f9a0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73  ..}...if (pulLas
2f9b0 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  tPartLen == NULL
2f9c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f9d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f9e0 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  . pulLastPartLen
2f9f0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2fa00 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2fa10 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2fa20 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2fa30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2fa40 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2fa50 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2fa60 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2fa70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fa80 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2fa90 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2faa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2fab0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2fac0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2fad0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2fae0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2faf0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2fb00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2fb10 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2fb20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2fb30 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2fb40 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2fb50 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2fb60 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2fb70 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2fb80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2fb90 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2fba0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2fbb0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2fbc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2fbd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fbe0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2fbf0 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
2fc00 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2fc10 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2fc20 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2fc30 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61  ..}...*pulLastPa
2fc40 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20  rtLen = 0;...if 
2fc50 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e 55  (pLastPart == NU
2fc60 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74  LL) {...terminat
2fc70 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a 09  e_decrypt = 0;..
2fc80 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74  }...if (terminat
2fc90 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09 63  e_decrypt) {...c
2fca0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2fcb0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2fcc0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
2fcd0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2fce0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2fcf0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2fd00 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2fd10 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2fd20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fd30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2fd40 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2fd50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2fd60 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2fd70 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2fd80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2fd90 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2fda0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2fdb0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2fdc0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2fdd0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2fde0 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  gestInit)(CK_SES
2fdf0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2fe00 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2fe10 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2fe20 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  m) {..CACKEY_DEB
2fe30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2fe40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2fe50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2fe60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2fe70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2fe80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2fe90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2fea0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2feb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2fec0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2fed0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2fee0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2fef0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2ff00 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2ff10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ff20 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2ff30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ff40 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2ff50 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2ff60 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28 43  _RV, C_Digest)(C
2ff70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ff80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2ff90 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
2ffa0 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
2ffb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2ffc0 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  igest, CK_ULONG_
2ffd0 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e  PTR pulDigestLen
2ffe0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2fff0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
30000 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
30010 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
30020 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30030 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30040 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
30050 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
30060 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
30070 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
30080 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30090 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
300a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
300b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
300c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
300d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
300e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
300f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30100 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
30110 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
30120 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64 61  RV, C_DigestUpda
30130 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
30140 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
30150 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
30160 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
30170 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
30180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
30190 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
301a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
301b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
301c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
301d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
301e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
301f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
30200 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
30210 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
30220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
30230 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
30240 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30250 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
30260 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30270 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
30280 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30290 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
302a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
302b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
302c0 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tKey)(CK_SESSION
302d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
302e0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
302f0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
30300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30310 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30320 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30330 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
30340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30350 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
30360 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
30370 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
30380 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
30390 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
303a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
303b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
303c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
303d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
303e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
303f0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
30400 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
30410 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
30420 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30430 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
30440 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  estFinal)(CK_SES
30450 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
30460 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
30470 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c  R pDigest, CK_UL
30480 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73  ONG_PTR pulDiges
30490 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
304a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
304b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
304c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
304d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
304e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
304f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
30500 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
30510 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
30520 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
30530 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
30540 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30550 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30560 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30570 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30580 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30590 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
305a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
305b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
305c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
305d0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e  (CK_RV, C_SignIn
305e0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
305f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
30600 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
30610 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
30620 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
30630 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  ey) {..int mutex
30640 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d  _retval;...hKey-
30650 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  -;...CACKEY_DEBU
30660 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
30670 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
30680 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
30690 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
306a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
306b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
306c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
306d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
306e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
306f0 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
30700 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  m == NULL) {...C
30710 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30720 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
30730 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29  anism is NULL.")
30740 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
30750 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
30760 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
30770 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21  ism->mechanism !
30780 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20  = CKM_RSA_PKCS) 
30790 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
307a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
307b0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
307c0 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66  anism not specif
307d0 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50  ied as CKM_RSA_P
307e0 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  KCS");....return
307f0 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  (CKR_MECHANISM_P
30800 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  ARAM_INVALID);..
30810 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
30820 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
30830 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
30840 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
30850 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
30860 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
30870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30880 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
30890 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
308a0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
308b0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
308c0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
308d0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
308e0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
308f0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
30900 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
30910 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
30920 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30930 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30940 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
30950 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30960 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
30970 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
30980 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30990 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
309a0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
309b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
309c0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
309d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
309e0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
309f0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
30a00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
30a10 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
30a20 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
30a30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30a40 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
30a50 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
30a60 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
30a70 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
30a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
30aa0 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ign already in p
30ab0 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
30ac0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
30ad0 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
30ae0 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
30af0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30b00 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
30b10 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
30b20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
30b30 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
30b40 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
30b50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30b60 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
30b70 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
30b80 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
30b90 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
30ba0 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
30bb0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
30bc0 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
30bd0 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
30be0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30bf0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
30c00 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
30c10 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
30c20 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
30c30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30c40 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
30c50 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
30c60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30c70 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
30c80 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
30c90 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63  ->mechanism;...c
30ca0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30cb0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30cc0 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63  flen = 128;..cac
30cd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30ce0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
30cf0 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  sed = 0;..cackey
30d00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30d10 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d  on].sign_buf = m
30d20 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
30d30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30d40 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
30d50 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
30d60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30d70 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41  gn_buflen);...CA
30d80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30d90 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 73  F("Session %lu s
30da0 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 20  ign_identity is 
30db0 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 25 6c  %p (identity #%l
30dc0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
30dd0 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 28  ong) hSession, (
30de0 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65 79 5f  void *) &cackey_
30df0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30e00 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
30e10 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ey], (unsigned l
30e20 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63  ong) hKey);..cac
30e30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30e40 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
30e50 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
30e60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30e70 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
30e80 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
30e90 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
30ea0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
30eb0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
30ec0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
30ed0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30ee0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30ef0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
30f00 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
30f10 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
30f20 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
30f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30f40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
30f50 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
30f60 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
30f70 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
30f80 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
30f90 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49  C_Sign)(CK_SESSI
30fa0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
30fb0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
30fc0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
30fd0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
30fe0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
30ff0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
31000 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
31010 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
31020 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  g start_sign_buf
31030 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69 67  used;..CK_RV sig
31040 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  n_ret;..int mute
31050 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
31060 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31070 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
31080 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
31090 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
310a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
310b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
310c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
310d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
310e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
310f0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
31100 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
31110 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
31120 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
31130 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
31140 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
31150 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
31160 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31170 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
31180 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
31190 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
311a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
311b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 74  LID);..}...start
311c0 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  _sign_bufused = 
311d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
311e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
311f0 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f 72  ufused;...sign_r
31200 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74  et = C_SignUpdat
31210 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74  e(hSession, pDat
31220 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09  a, ulDataLen);..
31230 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20  if (sign_ret != 
31240 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
31250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31260 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 64  "Error.  SignUpd
31270 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
31280 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
31290 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
312a0 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
312b0 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ...if (sign_ret 
312c0 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  != CKR_BUFFER_TO
312d0 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d 75  O_SMALL) {....mu
312e0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
312f0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
31300 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
31310 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
31320 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
31330 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31340 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
31350 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
31360 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
31370 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
31380 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
31390 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
313a0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
313b0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
313c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
313d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
313e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
313f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
31400 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
31410 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
31420 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
31430 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
31440 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
31450 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31460 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
31470 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
31480 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
31490 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
314a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
314b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
314c0 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
314d0 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
314e0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
314f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
31500 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
31510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31520 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
31530 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78  e = 0;.....mutex
31540 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
31550 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
31560 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
31570 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
31580 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
31590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
315a0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
315b0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
315c0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
315d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
315e0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
315f0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
31600 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  }...sign_ret = C
31610 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73  _SignFinal(hSess
31620 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c  ion, pSignature,
31630 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
31640 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
31650 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
31660 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20  if (sign_ret == 
31670 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
31680 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  MALL) {....CACKE
31690 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
316a0 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
316b0 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f  rned CKR_BUFFER_
316c0 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20  TOO_SMALL (rv = 
316d0 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f  %lu), undoing C_
316e0 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28  SignUpdate()", (
316f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
31700 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61  ign_ret);.....ca
31710 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31720 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
31730 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67  used = start_sig
31740 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72  n_bufused;.....r
31750 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
31760 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
31770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31780 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29  or.  SignFinal()
31790 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
317a0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
317b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
317c0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65  sign_ret);....re
317d0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
317e0 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61 74  .}...if (pSignat
317f0 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ure == NULL) {..
31800 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31810 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72 65  INTF("pSignature
31820 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
31830 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69  LL, undoing C_Si
31840 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a 09  gnUpdate()");...
31850 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
31860 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31870 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
31880 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
31890 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
318a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
318b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
318c0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
318d0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
318e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
318f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
31900 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
31910 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ignUpdate)(CK_SE
31920 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
31930 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
31940 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
31950 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
31960 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
31970 6c 3b 0a 09 69 6e 74 20 72 65 73 69 7a 65 52 65  l;..int resizeRe
31980 74 72 79 3b 0a 09 69 6e 74 20 6e 65 65 64 52 65  try;..int needRe
31990 73 69 7a 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  size;...CACKEY_D
319a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
319b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
319c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
319d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
319e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
319f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
31a00 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
31a10 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
31a20 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
31a30 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
31a40 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
31a50 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
31a60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
31a70 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
31a80 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
31a90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31aa0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
31ab0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
31ac0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
31ad0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
31ae0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
31af0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
31b00 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61   == NULL && ulPa
31b10 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
31b20 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
31b30 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64   if we are asked
31b40 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67   to sign nothing
31b50 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ... */...CACKEY_
31b60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
31b70 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
31b80 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
31b90 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
31ba0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
31bb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
31bc0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
31bd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31be0 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20  F("Error. pPart 
31bf0 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50  is NULL, but ulP
31c00 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
31c10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
31c20 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
31c30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72  ;..}...if (ulPar
31c40 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
31c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31c60 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72  TF("Error. ulPar
31c70 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70  tLen is 0, but p
31c80 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Part is not NULL
31c90 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
31ca0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
31cb0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
31cc0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
31cd0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
31ce0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
31cf0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
31d00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31d10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31d20 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
31d30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
31d40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
31d50 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
31d60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31d70 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
31d80 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
31d90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
31da0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
31db0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31dc0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
31dd0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
31de0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
31df0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
31e00 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
31e10 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
31e20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31e30 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
31e40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
31e50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
31e60 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
31e70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31e80 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
31e90 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
31ea0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
31eb0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
31ec0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
31ed0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31ee0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
31ef0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
31f00 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
31f10 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74  ..../* Accumulat
31f20 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09  e directly */...
31f30 09 66 6f 72 20 28 72 65 73 69 7a 65 52 65 74 72  .for (resizeRetr
31f40 79 20 3d 20 30 3b 20 72 65 73 69 7a 65 52 65 74  y = 0; resizeRet
31f50 72 79 20 3c 20 31 31 3b 20 72 65 73 69 7a 65 52  ry < 11; resizeR
31f60 65 74 72 79 2b 2b 29 20 7b 0a 09 09 09 09 6e 65  etry++) {.....ne
31f70 65 64 52 65 73 69 7a 65 20 3d 20 30 3b 0a 09 09  edResize = 0;...
31f80 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65  ..if ((cackey_se
31f90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31fa0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20  .sign_bufused + 
31fb0 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63  ulPartLen) > cac
31fc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31fd0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
31fe0 65 6e 29 20 7b 0a 09 09 09 09 09 6e 65 65 64 52  en) {......needR
31ff0 65 73 69 7a 65 20 3d 20 31 3b 0a 09 09 09 09 7d  esize = 1;.....}
32000 0a 0a 09 09 09 09 69 66 20 28 21 6e 65 65 64 52  ......if (!needR
32010 65 73 69 7a 65 29 20 7b 0a 09 09 09 09 09 62 72  esize) {......br
32020 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
32030 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32040 4e 54 46 28 22 52 65 73 69 7a 69 6e 67 20 73 69  NTF("Resizing si
32050 67 6e 69 6e 67 20 62 75 66 66 65 72 20 28 74 72  gning buffer (tr
32060 79 20 23 25 69 20 6f 66 20 31 30 20 2d 2d 20 31  y #%i of 10 -- 1
32070 31 74 68 20 69 73 20 66 61 74 61 6c 29 22 2c 20  1th is fatal)", 
32080 72 65 73 69 7a 65 52 65 74 72 79 29 3b 0a 0a 09  resizeRetry);...
32090 09 09 09 69 66 20 28 72 65 73 69 7a 65 52 65 74  ...if (resizeRet
320a0 72 79 20 3d 3d 20 31 30 29 20 7b 0a 09 09 09 09  ry == 10) {.....
320b0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
320c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
320d0 73 69 67 6e 5f 62 75 66 29 3b 0a 0a 09 09 09 09  sign_buf);......
320e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
320f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
32100 62 75 66 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 09  buflen = 0;.....
32110 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
32120 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
32130 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  buf = NULL;.....
32140 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
32150 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
32160 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32170 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a  gn_buflen *= 2;.
32180 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
32190 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
321a0 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f  ign_buf = reallo
321b0 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  c(cackey_session
321c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
321d0 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61  _buf, sizeof(*ca
321e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
321f0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
32200 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
32210 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32220 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d  gn_buflen);....}
32230 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
32240 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32250 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 3d 20 4e  n].sign_buf == N
32260 55 4c 4c 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ULL) {.....cacke
32270 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
32280 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
32290 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
322a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
322b0 20 20 53 69 67 6e 69 6e 67 20 62 75 66 66 65 72    Signing buffer
322c0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
322d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
322e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  ERAL_ERROR);....
322f0 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  }.....memcpy(cac
32300 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32310 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
32320 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  + cackey_session
32330 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
32340 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c  _bufused, pPart,
32350 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09   ulPartLen);....
32360 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
32370 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
32380 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72  bufused += ulPar
32390 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  tLen;.....break;
323a0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
323b0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
323c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
323d0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
323e0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
323f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32400 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32410 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
32420 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
32430 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
32440 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
32450 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32460 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
32470 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
32480 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
32490 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
324a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
324b0 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f  C_SignFinal)(CK_
324c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
324d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
324e0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
324f0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
32500 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
32510 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
32520 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09   sigbuf[1024];..
32530 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65  ssize_t sigbufle
32540 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  n;..CK_SLOT_ID s
32550 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65  lotID;..CK_RV re
32560 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
32570 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74  AL_ERROR;..int t
32580 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
32590 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
325a0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
325b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
325c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
325d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
325e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
325f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32600 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
32610 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
32620 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
32630 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
32640 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67  ..}...if (pulSig
32650 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c  natureLen == NUL
32660 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
32670 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32680 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  r. pulSignatureL
32690 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
326a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
326b0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
326c0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
326d0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
326e0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
326f0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
32700 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
32710 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
32720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
32730 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
32740 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
32750 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
32760 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
32770 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
32780 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
32790 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
327a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
327b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
327c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
327d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
327e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
327f0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
32800 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
32810 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
32820 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
32830 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32840 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
32850 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
32860 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
32870 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
32880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32890 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
328a0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
328b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
328c0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
328d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
328e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
328f0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
32900 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
32910 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
32920 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
32930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32940 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
32950 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
32960 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
32970 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
32980 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
32990 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
329a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
329b0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
329c0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
329d0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
329e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
329f0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
32a00 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
32a10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32a20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
32a30 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
32a40 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
32a50 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
32a60 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
32a70 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
32a80 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
32a90 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
32aa0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
32ab0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
32ac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32ad0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
32ae0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
32af0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
32b00 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
32b10 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
32b20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
32b30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
32b40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
32b50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
32b60 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
32b70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32b80 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
32b90 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20  anism) {...case 
32ba0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
32bb0 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20  ./* Ask card to 
32bc0 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45  sign */....CACKE
32bd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32be0 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20 66  Asking to sign f
32bf0 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20  rom identity %p 
32c00 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c  in session %lu",
32c10 20 28 76 6f 69 64 20 2a 29 20 63 61 63 6b 65 79   (void *) cackey
32c20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
32c30 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
32c40 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
32c50 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09  g) hSession);...
32c60 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63  .sigbuflen = cac
32c70 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
32c80 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
32c90 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
32ca0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32cb0 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20  .sign_identity, 
32cc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32cd0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
32ce0 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uf, cackey_sessi
32cf0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32d00 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62  gn_bufused, sigb
32d10 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75  uf, sizeof(sigbu
32d20 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09 09 69  f), 1, 0);.....i
32d30 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
32d40 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
32d50 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b 65  EDLOGIN && cacke
32d60 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
32d70 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66 20   NULL) {.....if 
32d80 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67  (C_LoginMutexArg
32d90 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55  (hSession, CKU_U
32da0 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29  SER, NULL, 0, 0)
32db0 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
32dc0 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63  ...sigbuflen = c
32dd0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
32de0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
32df0 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
32e00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32e10 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
32e20 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
32e30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
32e40 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73  _buf, cackey_ses
32e50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
32e60 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69  sign_bufused, si
32e70 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67  gbuf, sizeof(sig
32e80 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 09 09 09  buf), 1, 0);....
32e90 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
32ea0 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  sigbuflen < 0) {
32eb0 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20  ...../* Signing 
32ec0 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69  failed. */.....i
32ed0 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
32ee0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
32ef0 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
32f00 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
32f10 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
32f20 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
32f30 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  sigbuflen == CAC
32f40 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
32f50 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
32f60 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
32f70 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
32f80 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65  } else {......re
32f90 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
32fa0 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a  AL_ERROR;.....}.
32fb0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
32fc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
32fd0 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  igbuflen) > *pul
32fe0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20  SignatureLen && 
32ff0 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
33000 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61  ../* Signed data
33010 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09   too large */...
33020 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33030 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20 3d 20  RINTF("retval = 
33040 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
33050 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e  MALL;  sigbuflen
33060 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61   = %lu, pulSigna
33070 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20  tureLen = %lu", 
33080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
33090 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69  sigbuflen, (unsi
330a0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53  gned long) *pulS
330b0 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09  ignatureLen);...
330c0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
330d0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
330e0 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65  ;......terminate
330f0 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20  _sign = 0;....} 
33100 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69  else {.....termi
33110 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a  nate_sign = 0;..
33120 09 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75  ....if (pSignatu
33130 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  re) {......memcp
33140 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69  y(pSignature, si
33150 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29  gbuf, sigbuflen)
33160 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74  ;.......terminat
33170 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09  e_sign = 1;.....
33180 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61  }......*pulSigna
33190 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66  tureLen = sigbuf
331a0 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
331b0 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
331c0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
331d0 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69  if (terminate_si
331e0 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  gn) {...if (cack
331f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
33200 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
33210 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
33220 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
33230 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09  on].sign_buf);..
33240 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
33250 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
33260 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
33270 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
33280 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
33290 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
332a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
332b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
332c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
332d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
332e0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
332f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
33300 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
33310 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
33320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33330 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
33340 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
33350 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
33360 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
33370 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
33380 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ignRecoverInit)(
33390 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
333a0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
333b0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
333c0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
333d0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
333e0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
333f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33400 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
33410 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
33420 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33430 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33440 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33450 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33460 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33470 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33490 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
334a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
334b0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
334c0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
334d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
334e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
334f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33500 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
33510 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
33520 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29  , C_SignRecover)
33530 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33540 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33550 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
33560 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
33570 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
33580 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
33590 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
335a0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
335b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
335c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
335d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
335e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
335f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33600 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
33610 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
33620 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
33630 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
33640 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
33650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33660 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
33670 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33680 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
33690 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
336a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
336b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
336c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
336d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
336e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
336f0 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53  rifyInit)(CK_SES
33700 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33710 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
33720 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
33730 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
33740 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
33750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33760 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
33770 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
33780 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
33790 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
337a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
337b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
337c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
337d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
337e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
337f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33800 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
33810 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33820 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
33830 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33840 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
33850 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
33860 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
33870 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
33880 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
33890 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rify)(CK_SESSION
338a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
338b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
338c0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
338d0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
338e0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
338f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
33900 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
33910 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33920 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
33930 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
33940 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
33950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33960 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
33970 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
33980 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
33990 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
339a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
339b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
339c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
339d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
339e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
339f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33a00 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
33a10 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
33a20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
33a30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
33a40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
33a50 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
33a60 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33a70 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
33a80 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
33a90 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
33aa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33ab0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33ac0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33ad0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33af0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33b00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33b10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33b20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
33b30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
33b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33b50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
33b60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33b70 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
33b80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33b90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
33ba0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
33bb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33bc0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
33bd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
33be0 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28   C_VerifyFinal)(
33bf0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
33c00 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
33c10 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
33c20 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
33c30 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
33c40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33c50 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33c60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33c70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33c80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33c90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33ca0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33cb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33cc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33cd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33cf0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33d00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33d10 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33d20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33d30 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33d40 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33d50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33d60 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33d70 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33d80 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
33d90 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
33da0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
33db0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
33dc0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
33dd0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
33de0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
33df0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
33e00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
33e10 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
33e20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
33e30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
33e40 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
33e50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
33e60 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
33e70 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
33e80 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
33e90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
33ea0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
33eb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
33ec0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
33ed0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33ee0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
33ef0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33f00 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
33f10 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
33f20 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
33f30 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
33f40 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33f50 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
33f60 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
33f70 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
33f80 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
33f90 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
33fa0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
33fb0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
33fc0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33fd0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
33fe0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
33ff0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34000 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
34010 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
34020 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
34030 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
34040 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
34050 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34060 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
34070 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34080 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
34090 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
340a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
340b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
340c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
340d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
340e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
340f0 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  , C_DigestEncryp
34100 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
34110 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
34120 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
34130 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
34140 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
34150 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
34160 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
34170 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
34180 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
34190 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
341a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
341b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
341c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
341d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
341e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
341f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
34200 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
34210 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
34220 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
34230 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34240 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
34250 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34260 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
34270 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34280 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
34290 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
342a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
342b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
342c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
342d0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
342e0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
342f0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
34300 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
34310 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
34320 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
34330 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
34340 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
34350 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
34360 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
34370 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
34380 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
34390 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
343a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
343b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
343c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
343d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
343e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
343f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
34400 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
34410 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
34420 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
34430 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
34440 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
34450 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34460 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
34470 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34480 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
34490 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
344a0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72  K_RV, C_SignEncr
344b0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
344c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
344d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
344e0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
344f0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
34500 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
34510 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
34520 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
34530 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
34540 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34550 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
34560 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
34570 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
34580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34590 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
345a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
345b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
345c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
345d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
345e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
345f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
34600 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34610 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
34620 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34630 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
34640 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
34650 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
34660 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
34670 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
34680 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
34690 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
346a0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
346b0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
346c0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
346d0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
346e0 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
346f0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
34700 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
34710 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
34720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
34730 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
34740 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
34750 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
34760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
34770 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
34780 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
34790 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
347a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
347b0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
347c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
347d0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
347e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
347f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
34800 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34810 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
34820 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34830 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
34840 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
34850 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
34860 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  teKey)(CK_SESSIO
34870 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
34880 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
34890 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
348a0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
348b0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
348c0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
348d0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
348e0 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
348f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34900 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
34910 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
34920 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
34930 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34940 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
34950 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
34960 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
34970 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
34980 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
34990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
349a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
349b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
349c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
349d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
349e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
349f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
34a00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
34a10 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
34a20 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
34a30 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43  nerateKeyPair)(C
34a40 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
34a50 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
34a60 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
34a70 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
34a80 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63  BUTE_PTR pPublic
34a90 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
34aa0 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65  ULONG ulPublicKe
34ab0 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
34ac0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
34ad0 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d  R pPrivateKeyTem
34ae0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
34af0 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72  ulPrivateKeyAttr
34b00 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f  ibuteCount, CK_O
34b10 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
34b20 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b   phPublicKey, CK
34b30 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
34b40 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29  TR phPrivateKey)
34b50 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
34b60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34b70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
34b80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
34b90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34ba0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
34bb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
34bc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
34bd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
34be0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34bf0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34c00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34c10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34c20 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
34c30 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
34c40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34c50 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
34c60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34c70 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
34c80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
34c90 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b  V, C_WrapKey)(CK
34ca0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34cb0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
34cc0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
34cd0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
34ce0 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e  _HANDLE hWrappin
34cf0 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  gKey, CK_OBJECT_
34d00 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f  HANDLE hKey, CK_
34d10 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65  BYTE_PTR pWrappe
34d20 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  dKey, CK_ULONG_P
34d30 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79  TR pulWrappedKey
34d40 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
34d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
34d60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
34d70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
34d80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
34d90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
34da0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
34db0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
34dc0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
34dd0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
34de0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
34df0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
34e00 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
34e10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
34e20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
34e30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34e40 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
34e50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34e60 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
34e70 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
34e80 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b  CK_RV, C_UnwrapK
34e90 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
34ea0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
34eb0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
34ec0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
34ed0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55  OBJECT_HANDLE hU
34ee0 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  nwrappingKey, CK
34ef0 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70  _BYTE_PTR pWrapp
34f00 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20  edKey, CK_ULONG 
34f10 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c  ulWrappedKeyLen,
34f20 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
34f30 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
34f40 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
34f50 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
34f60 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
34f70 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
34f80 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
34f90 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
34fa0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
34fb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
34fc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
34fd0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
34fe0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
34ff0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
35000 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
35010 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
35020 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
35030 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
35040 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
35050 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
35060 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
35070 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
35080 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35090 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
350a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
350b0 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65  K_RV, C_DeriveKe
350c0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
350d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
350e0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
350f0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
35100 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61  BJECT_HANDLE hBa
35110 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42  seKey, CK_ATTRIB
35120 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
35130 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
35140 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
35150 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
35160 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
35170 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
35180 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
35190 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
351a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
351b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
351c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
351d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
351e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
351f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
35200 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
35210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
35220 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
35230 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
35240 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
35250 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35260 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
35270 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
35280 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
35290 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
352a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
352b0 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  edRandom)(CK_SES
352c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
352d0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
352e0 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e  R pSeed, CK_ULON
352f0 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09  G ulSeedLen) {..
35300 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35310 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
35320 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
35330 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
35340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35350 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
35360 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
35370 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
35380 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
35390 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
353a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
353b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
353c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
353d0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
353e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
353f0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
35400 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
35410 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
35420 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
35430 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
35440 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29  _GenerateRandom)
35450 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
35460 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
35470 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d  BYTE_PTR pRandom
35480 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
35490 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43  lRandomLen) {..C
354a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
354b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
354c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
354d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
354e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
354f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
35500 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
35510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
35520 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
35530 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
35540 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
35550 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
35560 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35570 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
35580 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
35590 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
355a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
355b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
355c0 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
355d0 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
355e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
355f0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e  (CK_RV, C_GetFun
35600 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f  ctionStatus)(CK_
35610 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
35620 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
35630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
35640 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
35650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
35660 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
35670 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
35680 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
35690 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
356a0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
356b0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
356c0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
356d0 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
356e0 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
356f0 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
35700 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f   warning */.}../
35710 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
35720 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
35730 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
35740 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74  V, C_CancelFunct
35750 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
35760 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
35770 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
35780 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
35790 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
357a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
357b0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
357c0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
357d0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
357e0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
357f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
35800 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
35810 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
35820 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
35830 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
35840 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
35850 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
35860 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
35870 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69   C_GetFunctionLi
35880 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  st)(CK_FUNCTION_
35890 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46  LIST_PTR_PTR ppF
358a0 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09  unctionList) {..
358b0 73 74 61 74 69 63 20 43 4b 5f 46 55 4e 43 54 49  static CK_FUNCTI
358c0 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 73 70 46 75  ON_LIST_PTR spFu
358d0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 4e 55 4c  nctionList = NUL
358e0 4c 3b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  L;..CK_FUNCTION_
358f0 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69  LIST_PTR pFuncti
35900 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59  onList;...CACKEY
35910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
35920 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
35930 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
35940 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
35950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
35960 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69  "Error. ppFuncti
35970 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22  onList is NULL."
35980 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
35990 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
359a0 0a 09 7d 0a 0a 09 69 66 20 28 73 70 46 75 6e 63  ..}...if (spFunc
359b0 74 69 6f 6e 4c 69 73 74 20 21 3d 20 4e 55 4c 4c  tionList != NULL
359c0 29 20 7b 0a 09 09 2a 70 70 46 75 6e 63 74 69 6f  ) {...*ppFunctio
359d0 6e 4c 69 73 74 20 3d 20 73 70 46 75 6e 63 74 69  nList = spFuncti
359e0 6f 6e 4c 69 73 74 3b 0a 0a 09 09 43 41 43 4b 45  onList;....CACKE
359f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
35a00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
35a10 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
35a20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
35a30 4b 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69  K);..}...pFuncti
35a40 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28  onList = malloc(
35a50 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f  sizeof(*pFunctio
35a60 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63  nList));...pFunc
35a70 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
35a80 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
35a90 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
35aa0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
35ab0 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74   & 0xff;..pFunct
35ac0 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e  ionList->version
35ad0 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
35ae0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
35af0 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
35b00 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69   0xff;...pFuncti
35b10 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61  onList->C_Initia
35b20 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c  lize = C_Initial
35b30 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
35b40 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20  ist->C_Finalize 
35b50 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70  = C_Finalize;..p
35b60 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35b70 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49  GetInfo = C_GetI
35b80 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
35b90 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69  ist->C_GetSlotLi
35ba0 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69  st = C_GetSlotLi
35bb0 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
35bc0 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66  st->C_GetSlotInf
35bd0 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66  o = C_GetSlotInf
35be0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
35bf0 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  t->C_GetTokenInf
35c00 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  o = C_GetTokenIn
35c10 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
35c20 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f  st->C_WaitForSlo
35c30 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46  tEvent = C_WaitF
35c40 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46  orSlotEvent;..pF
35c50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
35c60 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20  etMechanismList 
35c70 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  = C_GetMechanism
35c80 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  List;..pFunction
35c90 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61  List->C_GetMecha
35ca0 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74  nismInfo = C_Get
35cb0 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09  MechanismInfo;..
35cc0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35cd0 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49  _InitToken = C_I
35ce0 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63  nitToken;..pFunc
35cf0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
35d00 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b  PIN = C_InitPIN;
35d10 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35d20 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65  >C_SetPIN = C_Se
35d30 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
35d40 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73  List->C_OpenSess
35d50 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73  ion = C_OpenSess
35d60 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
35d70 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73  ist->C_CloseSess
35d80 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73  ion = C_CloseSes
35d90 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
35da0 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c  List->C_CloseAll
35db0 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f  Sessions = C_Clo
35dc0 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09  seAllSessions;..
35dd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35de0 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20  _GetSessionInfo 
35df0 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  = C_GetSessionIn
35e00 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
35e10 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69  st->C_GetOperati
35e20 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f  onState = C_GetO
35e30 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09  perationState;..
35e40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35e50 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _SetOperationSta
35e60 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74  te = C_SetOperat
35e70 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63  ionState;..pFunc
35e80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69  tionList->C_Logi
35e90 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46  n = C_Login;..pF
35ea0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
35eb0 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74  ogout = C_Logout
35ec0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35ed0 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  ->C_CreateObject
35ee0 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63   = C_CreateObjec
35ef0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
35f00 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20  t->C_CopyObject 
35f10 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a  = C_CopyObject;.
35f20 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35f30 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20  C_DestroyObject 
35f40 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  = C_DestroyObjec
35f50 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
35f60 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69  t->C_GetObjectSi
35f70 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74  ze = C_GetObject
35f80 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Size;..pFunction
35f90 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69  List->C_GetAttri
35fa0 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65  buteValue = C_Ge
35fb0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
35fc0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35fd0 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56  >C_SetAttributeV
35fe0 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72  alue = C_SetAttr
35ff0 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75  ibuteValue;..pFu
36000 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
36010 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20  ndObjectsInit = 
36020 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
36030 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
36040 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
36050 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
36060 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
36070 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  ->C_FindObjectsF
36080 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a  inal = C_FindObj
36090 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ectsFinal;..pFun
360a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
360b0 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63  ryptInit = C_Enc
360c0 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ryptInit;..pFunc
360d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
360e0 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b  ypt = C_Encrypt;
360f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
36100 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65  >C_EncryptUpdate
36110 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61   = C_EncryptUpda
36120 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
36130 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e  st->C_EncryptFin
36140 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69  al = C_EncryptFi
36150 6e 6