Hex Artifact Content

Artifact 50819dda699ef0316c369338516eaa39dde5528d:


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 47 53   0x00.#define GS
12d0: 43 49 53 5f 41 49 44 5f 49 44 30 20 20 20 20 20  CIS_AID_ID0     
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30              0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 30 2c 20 30 78 37 39 2c 20 30 78 30 31 2c 20  00, 0x79, 0x01, 
1310: 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x00.#define NIS
1320: 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f  TSP800_73_3_PIV_
1330: 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30 2c  AID        0xA0,
1340: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1350: 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20 30  3, 0x08, 0x00, 0
1360: 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30 2c  x00, 0x10, 0x00,
1370: 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a 20   0x01, 0x00../* 
1380: 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20 4b  PIV IDs */./** K
1390: 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20 28  ey Identifiers (
13a0: 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d 33  NIST SP 800-78-3
13b0: 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f 0a  , Table 6-1 **/.
13c0: 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30  #define NISTSP80
13d0: 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55  0_78_3_KEY_PIVAU
13e0: 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69 6e  TH   0x9A.#defin
13f0: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
1400: 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20 30  _KEY_SIGNATURE 0
1410: 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x9C.#define NIST
1420: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b  SP800_78_3_KEY_K
1430: 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23 64  EYMGT    0x9D.#d
1440: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1450: 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55 54  78_3_KEY_CARDAUT
1460: 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c 67  H  0x9E../** Alg
1470: 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69 65  orithm Identifie
1480: 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d  rs (NIST SP 800-
1490: 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32 20  78-3, Table 6-2 
14a0: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  **/.#define NIST
14b0: 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f  SP800_78_3_ALGO_
14c0: 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23 64  RSA1024  0x06.#d
14d0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
14e0: 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34  78_3_ALGO_RSA204
14f0: 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62 6a  8  0x07../** Obj
1500: 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73 20  ect Identifiers 
1510: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d  (NIST SP 800-73-
1520: 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65 20  3 Part 1, Table 
1530: 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  2) **/.#define N
1540: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49  ISTSP800_73_3_OI
1550: 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35 46  D_PIVAUTH   0x5F
1560: 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64 65  , 0xC1, 0x05.#de
1570: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
1580: 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52  3_3_OID_SIGNATUR
1590: 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78  E 0x5F, 0xC1, 0x
15a0: 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  0A.#define NISTS
15b0: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45  P800_73_3_OID_KE
15c0: 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30 78  YMGT    0x5F, 0x
15d0: 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e 65  C1, 0x0B.#define
15e0: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
15f0: 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30 78  OID_CARDAUTH  0x
1600: 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a 0a  5F, 0xC1, 0x01..
1610: 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  /* Maximum size 
1620: 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e 20  of data portion 
1630: 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20  of APDUs */./** 
1640: 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73 20  Do not set this 
1650: 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23 64  above 250 **/.#d
1660: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50 44  efine CACKEY_APD
1670: 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20 20  U_MTU           
1680: 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52 20      250../* ATR 
1690: 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  If not available
16a0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f   */.#ifndef MAX_
16b0: 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e 65  ATR_SIZE.#define
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31 30   MAX_ATR_SIZE 10
16d0: 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  24.#endif..#ifde
16e0: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a 23  f CACKEY_DEBUG.#
16f0: 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49 4d    ifdef HAVE_TIM
1700: 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  E_H.#    include
1710: 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69 63   <time.h>.static
1720: 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f 64   time_t cackey_d
1730: 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20  ebug_start_time 
1740: 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73 69  = 0;.static unsi
1750: 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59  gned long CACKEY
1760: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 76  _DEBUG_GETTIME(v
1770: 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63 6b  oid) {..if (cack
1780: 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74  ey_debug_start_t
1790: 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63 61  ime == 0) {...ca
17a0: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17b0: 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55 4c  _time = time(NUL
17c0: 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  L);..}...return(
17d0: 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61 63  time(NULL) - cac
17e0: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
17f0: 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73 65  time);.}.#  else
1800: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
1810: 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 42   long CACKEY_DEB
1820: 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 29  UG_GETTIME(void)
1830: 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d   {..return(0);.}
1840: 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64 65  .#  endif..#  de
1850: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
1860: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b  G_PRINTF(x...) {
1870: 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72 20   \..static char 
1880: 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20 3d  buf_user[4096] =
1890: 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e 74   {0}; \..snprint
18a0: 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a 65  f(buf_user, size
18b0: 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78 29  of(buf_user), x)
18c0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
18d0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
18e0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
18f0: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1900: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1910: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e 22  : %s():%i: %s\n"
1920: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47  , CACKEY_DEBUG_G
1930: 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e 63  ETTIME(), __func
1940: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62 75  __, __LINE__, bu
1950: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c 75  f_user); \..fflu
1960: 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  sh(cackey_debug_
1970: 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64 65  fd()); \.}.#  de
1980: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
1990: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
19a0: 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20   y) { \..static 
19b0: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 38 31  char buf_user[81
19c0: 39 32 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66 5f  92] = {0}, *buf_
19d0: 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73 65  user_p, *buf_use
19e0: 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73 69  r_print; \..unsi
19f0: 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75 73  gned long buf_us
1a00: 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73 69  er_size; \..unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55  gned char *TMPBU
1a20: 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c  F; \..unsigned l
1a30: 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74 20  ong idx; \..int 
1a40: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1a50: 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69 67  .TMPBUF = (unsig
1a60: 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29 3b  ned char *) (x);
1a70: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d 20   \..buf_user[0] 
1a80: 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  = 0; \..buf_user
1a90: 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f  [2] = 0; \..buf_
1aa0: 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73 65  user_p = buf_use
1ab0: 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 73  r; \..buf_user_s
1ac0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75 66  ize = sizeof(buf
1ad0: 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20 28  _user); \..for (
1ae0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 4d  idx = 0; idx < M
1af0: 49 4e 28 28 79 29 2c 20 73 69 7a 65 6f 66 28 62  IN((y), sizeof(b
1b00: 75 66 5f 75 73 65 72 29 29 3b 20 69 64 78 2b 2b  uf_user)); idx++
1b10: 29 20 7b 20 5c 0a 09 09 69 66 20 28 62 75 66 5f  ) { \...if (buf_
1b20: 75 73 65 72 5f 73 69 7a 65 20 3c 3d 20 30 29 20  user_size <= 0) 
1b30: 7b 20 5c 0a 09 09 09 62 72 65 61 6b 3b 20 5c 0a  { \....break; \.
1b40: 09 09 7d 3b 20 5c 0a 09 09 73 6e 70 72 69 6e 74  ..}; \...snprint
1b50: 66 5f 72 65 74 20 3d 20 73 6e 70 72 69 6e 74 66  f_ret = snprintf
1b60: 28 62 75 66 5f 75 73 65 72 5f 70 2c 20 62 75 66  (buf_user_p, buf
1b70: 5f 75 73 65 72 5f 73 69 7a 65 2c 20 22 2c 20 25  _user_size, ", %
1b80: 30 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78  02x", TMPBUF[idx
1b90: 5d 29 3b 20 5c 0a 09 09 69 66 20 28 73 6e 70 72  ]); \...if (snpr
1ba0: 69 6e 74 66 5f 72 65 74 20 3c 3d 20 30 29 20 7b  intf_ret <= 0) {
1bb0: 20 5c 0a 09 09 09 62 72 65 61 6b 3b 20 5c 0a 09   \....break; \..
1bc0: 09 7d 3b 20 5c 0a 09 09 62 75 66 5f 75 73 65 72  .}; \...buf_user
1bd0: 5f 70 20 2b 3d 20 73 6e 70 72 69 6e 74 66 5f 72  _p += snprintf_r
1be0: 65 74 3b 20 5c 0a 09 09 62 75 66 5f 75 73 65 72  et; \...buf_user
1bf0: 5f 73 69 7a 65 20 2d 3d 20 73 6e 70 72 69 6e 74  _size -= snprint
1c00: 66 5f 72 65 74 3b 20 5c 0a 09 7d 3b 20 5c 0a 09  f_ret; \..}; \..
1c10: 62 75 66 5f 75 73 65 72 5b 73 69 7a 65 6f 66 28  buf_user[sizeof(
1c20: 62 75 66 5f 75 73 65 72 29 20 2d 20 31 5d 20 3d  buf_user) - 1] =
1c30: 20 27 5c 30 27 3b 20 5c 0a 09 62 75 66 5f 75 73   '\0'; \..buf_us
1c40: 65 72 5f 70 72 69 6e 74 20 3d 20 62 75 66 5f 75  er_print = buf_u
1c50: 73 65 72 20 2b 20 32 3b 20 5c 0a 09 66 70 72 69  ser + 2; \..fpri
1c60: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1c70: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
1c80: 73 28 29 3a 25 69 3a 20 25 73 20 20 28 25 73 2f  s():%i: %s  (%s/
1c90: 25 6c 75 20 3d 20 7b 25 73 7d 29 5c 6e 22 2c 20  %lu = {%s})\n", 
1ca0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
1cb0: 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e 63 5f 5f  TIME(), __func__
1cc0: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23  , __LINE__, f, #
1cd0: 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1ce0: 67 29 20 28 79 29 2c 20 62 75 66 5f 75 73 65 72  g) (y), buf_user
1cf0: 5f 70 72 69 6e 74 29 3b 20 5c 0a 09 66 66 6c 75  _print); \..fflu
1d00: 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  sh(cackey_debug_
1d10: 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64 65  fd()); \.}.#  de
1d20: 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b 20 43  fine free(x) { C
1d30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d40: 54 46 28 22 46 52 45 45 28 25 70 29 20 28 25 73  TF("FREE(%p) (%s
1d50: 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78 2c 20  )", (void *) x, 
1d60: 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d 0a  #x); free(x); }.
1d70: 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 63 61  .static FILE *ca
1d80: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 76 6f  ckey_debug_fd(vo
1d90: 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 46 49  id) {..static FI
1da0: 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09  LE *fd = NULL;..
1db0: 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a  char *logfile;..
1dc0: 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c 4c 29  .if (fd != NULL)
1dd0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64 29 3b   {...return(fd);
1de0: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67  ..}.../*.. * Log
1df0: 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69 74 69   to stderr initi
1e00: 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e 20 75  ally so we can u
1e10: 73 65 20 64 65 62 75 67 67 69 6e 67 20 77 69 74  se debugging wit
1e20: 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66 75 6e  hin.. * this fun
1e30: 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 67 65  ction without ge
1e40: 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20 69 6e  tting into an in
1e50: 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f  finite loop.. */
1e60: 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 0a  ..fd = stderr;..
1e70: 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e  .logfile = geten
1e80: 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  v("CACKEY_DEBUG_
1e90: 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66 20 28  LOGFILE");..if (
1ea0: 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  logfile != NULL)
1eb0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ec0: 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1ed0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1ee0: 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66 69  able: %s", logfi
1ef0: 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c 65 20  le);....logfile 
1f00: 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69 6c 65  = strchr(logfile
1f10: 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28 6c 6f  , '=');...if (lo
1f20: 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  gfile == NULL) {
1f30: 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65  ....logfile = ge
1f40: 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42  tenv("CACKEY_DEB
1f50: 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 09  UG_LOGFILE");...
1f60: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f 67 66  } else {....logf
1f70: 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  ile++;...}..}..#
1f80: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42  ifdef CACKEY_DEB
1f90: 55 47 5f 4c 4f 47 46 49 4c 45 0a 09 69 66 20 28  UG_LOGFILE..if (
1fa0: 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  logfile == NULL)
1fb0: 20 7b 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 43   {...logfile = C
1fc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1fd0: 49 4c 45 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  ILE;..}.#endif..
1fe0: 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20  .if (logfile != 
1ff0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2000: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
2010: 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20 25  ound log file: %
2020: 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09  s", logfile);...
2030: 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67 66  .fd = fopen(logf
2040: 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a 09  ile, "a");..}...
2050: 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29 20  if (fd == NULL) 
2060: 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72 3b  {...fd = stderr;
2070: 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20  ..}...if (fd == 
2080: 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43 4b  stderr) {...CACK
2090: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20a0: 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65 72  "Returning stder
20b0: 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  r");..} else {..
20c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20d0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20e0: 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66 64  %p", (void *) fd
20f0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 66  );..}...return(f
2100: 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  d);.}..static vo
2110: 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  id *CACKEY_DEBUG
2120: 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a  _FUNC_MALLOC(siz
2130: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
2140: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
2150: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
2160: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
2170: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a  = malloc(size);.
2180: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
2190: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25  _debug_fd(), "[%
21a0: 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 4d 41  lu]: %s():%i: MA
21b0: 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e 22 2c 20  LLOC() = %p\n", 
21c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54  CACKEY_DEBUG_GET
21d0: 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69  TIME(), func, li
21e0: 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 66  ne, retval);..ff
21f0: 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75  lush(cackey_debu
2200: 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 75 72  g_fd());...retur
2210: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
2220: 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45  atic void *CACKE
2230: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
2240: 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20  LLOC(void *ptr, 
2250: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
2260: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
2270: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64  nt line) {..void
2280: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
2290: 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72  al = realloc(ptr
22a0: 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72  , size);...if (r
22b0: 65 74 76 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a  etval != ptr) {.
22c0: 09 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
22d0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25  _debug_fd(), "[%
22e0: 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 52 45  lu]: %s():%i: RE
22f0: 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25 70 5c 6e  ALLOC(%p) = %p\n
2300: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
2310: 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c  GETTIME(), func,
2320: 20 6c 69 6e 65 2c 20 70 74 72 2c 20 72 65 74 76   line, ptr, retv
2330: 61 6c 29 3b 0a 09 09 66 66 6c 75 73 68 28 63 61  al);...fflush(ca
2340: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29  ckey_debug_fd())
2350: 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61  ;..}...if (retva
2360: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  l == NULL) {...C
2370: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2380: 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f 52 20 2a  TF(" *** ERROR *
2390: 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65 74 75 72  ** realloc retur
23a0: 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a 65 20 3d  ned NULL (size =
23b0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
23c0: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 09  d long) size);..
23d0: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
23e0: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  l);.}..static ch
23f0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
2400: 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 63 6f 6e  _FUNC_STRDUP(con
2410: 73 74 20 63 68 61 72 20 2a 70 74 72 2c 20 63 6f  st char *ptr, co
2420: 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20  nst char *func, 
2430: 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 63 68 61  int line) {..cha
2440: 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74  r *retval;...ret
2450: 76 61 6c 20 3d 20 73 74 72 64 75 70 28 70 74 72  val = strdup(ptr
2460: 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 63 61 63  );...fprintf(cac
2470: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
2480: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
2490: 20 53 54 52 44 55 50 5f 4d 41 4c 4c 4f 43 28 29   STRDUP_MALLOC()
24a0: 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59   = %p\n", CACKEY
24b0: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
24c0: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65  , func, line, re
24d0: 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63  tval);..fflush(c
24e0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
24f0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
2500: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  al);.}..static c
2510: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
2520: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
2530: 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67 6e 65 64  _TO_STR(unsigned
2540: 20 63 68 61 72 20 74 61 67 29 20 7b 0a 09 73 77   char tag) {..sw
2550: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 63  itch (tag) {...c
2560: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
2570: 52 44 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  RDID:....return(
2580: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49  "GSCIS_TAG_CARDI
2590: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
25a0: 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 3a 0a 09  S_TAG_CCC_VER:..
25b0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25c0: 54 41 47 5f 43 43 43 5f 56 45 52 22 29 3b 0a 09  TAG_CCC_VER");..
25d0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
25e0: 43 43 47 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCG_VER:....retu
25f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
2600: 47 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  G_VER");...case 
2610: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
2620: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  L:....return("GS
2630: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 22  CIS_TAG_CARDURL"
2640: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2650: 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 72  TAG_PKCS15:....r
2660: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2670: 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09 63 61 73  _PKCS15");...cas
2680: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
2690: 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72  DATA_MODEL:....r
26a0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
26b0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 22  _REG_DATA_MODEL"
26c0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
26d0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
26e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
26f0: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 22 29 3b  TAG_ACR_TABLE");
2700: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2710: 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a 09 09 09  G_CARD_APDU:....
2720: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2730: 47 5f 43 41 52 44 5f 41 50 44 55 22 29 3b 0a 09  G_CARD_APDU");..
2740: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2750: 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a 09 09 09  REDIRECTION:....
2760: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2770: 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 22 29 3b  G_REDIRECTION");
2780: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2790: 47 5f 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_CT:....return(
27a0: 22 47 53 43 49 53 5f 54 41 47 5f 43 54 22 29 3b  "GSCIS_TAG_CT");
27b0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
27c0: 47 5f 53 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  G_ST:....return(
27d0: 22 47 53 43 49 53 5f 54 41 47 5f 53 54 22 29 3b  "GSCIS_TAG_ST");
27e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
27f0: 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09 09 72 65  G_NEXTCCC:....re
2800: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2810: 4e 45 58 54 43 43 43 22 29 3b 0a 09 09 63 61 73  NEXTCCC");...cas
2820: 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d  e GSCIS_TAG_FNAM
2830: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2840: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 22 29 3b  CIS_TAG_FNAME");
2850: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2860: 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_MNAME:....retu
2870: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4d 4e  rn("GSCIS_TAG_MN
2880: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
2890: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09  CIS_TAG_LNAME:..
28a0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28b0: 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_LNAME");...c
28c0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55  ase GSCIS_TAG_SU
28d0: 46 46 49 58 3a 0a 09 09 09 72 65 74 75 72 6e 28  FFIX:....return(
28e0: 22 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49  "GSCIS_TAG_SUFFI
28f0: 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  X");...case GSCI
2900: 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43  S_TAG_GOVT_AGENC
2910: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2920: 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45  CIS_TAG_GOVT_AGE
2930: 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  NCY");...case GS
2940: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 3a 0a  CIS_TAG_BUREAU:.
2950: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2960: 5f 54 41 47 5f 42 55 52 45 41 55 22 29 3b 0a 09  _TAG_BUREAU");..
2970: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2980: 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a 09 09 09  BUREAU_CODE:....
2990: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
29a0: 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 22 29 3b  G_BUREAU_CODE");
29b0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29c0: 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a 09 09 09  G_DEPT_CODE:....
29d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
29e0: 47 5f 44 45 50 54 5f 43 4f 44 45 22 29 3b 0a 09  G_DEPT_CODE");..
29f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2a00: 54 49 54 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TITLE:....return
2a10: 28 22 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  ("GSCIS_TAG_TITL
2a20: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2a30: 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 3a 0a  S_TAG_BUILDING:.
2a40: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a50: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 22 29 3b  _TAG_BUILDING");
2a60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2a70: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 3a 0a  G_OFFICE_ADDR1:.
2a80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2aa0: 31 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  1");...case GSCI
2ab0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
2ac0: 52 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  R2:....return("G
2ad0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2ae0: 41 44 44 52 32 22 29 3b 0a 09 09 63 61 73 65 20  ADDR2");...case 
2af0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b00: 5f 43 49 54 59 3a 0a 09 09 09 72 65 74 75 72 6e  _CITY:....return
2b10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2b20: 43 45 5f 43 49 54 59 22 29 3b 0a 09 09 63 61 73  CE_CITY");...cas
2b30: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b40: 43 45 5f 53 54 41 54 45 3a 0a 09 09 09 72 65 74  CE_STATE:....ret
2b50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2b60: 46 46 49 43 45 5f 53 54 41 54 45 22 29 3b 0a 09  FFICE_STATE");..
2b70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b80: 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09 09 09 72  OFFICE_ZIP:....r
2b90: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2ba0: 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29 3b 0a 09  _OFFICE_ZIP");..
2bb0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2bc0: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 3a 0a  OFFICE_COUNTRY:.
2bd0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2be0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e  _TAG_OFFICE_COUN
2bf0: 54 52 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TRY");...case GS
2c00: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2c10: 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  HONE:....return(
2c20: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2c30: 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09 63 61 73  E_PHONE");...cas
2c40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2c50: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a 0a 09 09  CE_PHONE_EXT:...
2c60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2c70: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f  AG_OFFICE_PHONE_
2c80: 45 58 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EXT");...case GS
2c90: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
2ca0: 41 58 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  AX:....return("G
2cb0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2cc0: 46 41 58 22 29 3b 0a 09 09 63 61 73 65 20 47 53  FAX");...case GS
2cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45  CIS_TAG_OFFICE_E
2ce0: 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  MAIL:....return(
2cf0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2d00: 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09 63 61 73  E_EMAIL");...cas
2d10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2d20: 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72 65 74 75  CE_ROOM:....retu
2d30: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2d40: 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63  FICE_ROOM");...c
2d50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f  ase GSCIS_TAG_NO
2d60: 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a 09 09 09  NGOV_AGENCY:....
2d70: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2d80: 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 22  G_NONGOV_AGENCY"
2d90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2da0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
2db0: 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OR:....return("G
2dc0: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53  SCIS_TAG_SSN_DES
2dd0: 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09 63 61 73  IGNATOR");...cas
2de0: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 3a  e GSCIS_TAG_SSN:
2df0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2e00: 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a 09 09 63  S_TAG_SSN");...c
2e10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f  ase GSCIS_TAG_DO
2e20: 42 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  B:....return("GS
2e30: 43 49 53 5f 54 41 47 5f 44 4f 42 22 29 3b 0a 09  CIS_TAG_DOB");..
2e40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2e50: 47 45 4e 44 45 52 3a 0a 09 09 09 72 65 74 75 72  GENDER:....retur
2e60: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  n("GSCIS_TAG_GEN
2e70: 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DER");...case GS
2e80: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 3a 0a  CIS_TAG_USERID:.
2e90: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2ea0: 5f 54 41 47 5f 55 53 45 52 49 44 22 29 3b 0a 09  _TAG_USERID");..
2eb0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ec0: 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65 74 75 72  DOMAIN:....retur
2ed0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d  n("GSCIS_TAG_DOM
2ee0: 41 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIN");...case GS
2ef0: 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44  CIS_TAG_PASSWORD
2f00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2f10: 49 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 22  IS_TAG_PASSWORD"
2f20: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f30: 54 41 47 5f 49 53 53 55 45 52 49 44 3a 0a 09 09  TAG_ISSUERID:...
2f40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f50: 41 47 5f 49 53 53 55 45 52 49 44 22 29 3b 0a 09  AG_ISSUERID");..
2f60: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f70: 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74 75 72 6e  SERNO:....return
2f80: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  ("GSCIS_TAG_SERN
2f90: 4f 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  O");...case GSCI
2fa0: 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45  S_TAG_ISSUE_DATE
2fb0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2fc0: 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41 54  IS_TAG_ISSUE_DAT
2fd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2fe0: 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54  S_TAG_EXPIRE_DAT
2ff0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
3000: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
3010: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
3020: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
3030: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
3040: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50  CIS_TAG_CARD_TYP
3050: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
3060: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
3070: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
3080: 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49  GSCIS_TAG_SECURI
3090: 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  TY_CODE");...cas
30a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
30b0: 49 44 5f 41 49 44 3a 0a 09 09 09 72 65 74 75 72  ID_AID:....retur
30c0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
30d0: 44 49 44 5f 41 49 44 22 29 3b 0a 09 09 63 61 73  DID_AID");...cas
30e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
30f0: 49 46 49 43 41 54 45 3a 0a 09 09 09 72 65 74 75  IFICATE:....retu
3100: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
3110: 52 54 49 46 49 43 41 54 45 22 29 3b 0a 09 09 63  RTIFICATE");...c
3120: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
3130: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09  RT_ISSUE_DATE:..
3140: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
3150: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
3160: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
3170: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50  CIS_TAG_CERT_EXP
3180: 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  IRE_DATE:....ret
3190: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
31a0: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 22  ERT_EXPIRE_DATE"
31b0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
31c0: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
31d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
31e0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
31f0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
3200: 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f 64 65 29  TR(LONG retcode)
3210: 20 7b 0a 09 73 77 69 74 63 68 20 28 72 65 74 63   {..switch (retc
3220: 6f 64 65 29 20 7b 0a 09 09 63 61 73 65 20 53 43  ode) {...case SC
3230: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 3a 0a 09  ARD_S_SUCCESS:..
3240: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3250: 53 5f 53 55 43 43 45 53 53 22 29 3b 0a 09 09 63  S_SUCCESS");...c
3260: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 43  ase SCARD_E_CANC
3270: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
3280: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c  ("SCARD_E_CANCEL
3290: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
32a0: 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f  ARD_E_CANT_DISPO
32b0: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  SE:....return("S
32c0: 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49 53 50  CARD_E_CANT_DISP
32d0: 4f 53 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OSE");...case SC
32e0: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
32f0: 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09 09 72 65  NT_BUFFER:....re
3300: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3310: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
3320: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
3330: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 3a  D_E_INVALID_ATR:
3340: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3350: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41 54 52 22  D_E_INVALID_ATR"
3360: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3370: 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  E_INVALID_HANDLE
3380: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3390: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
33a0: 44 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  DLE");...case SC
33b0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
33c0: 52 41 4d 45 54 45 52 3a 0a 09 09 09 72 65 74 75  RAMETER:....retu
33d0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
33e0: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 22 29 3b  LID_PARAMETER");
33f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3400: 49 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 3a 0a  INVALID_TARGET:.
3410: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3420: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
3430: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
3440: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55  D_E_INVALID_VALU
3450: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  E:....return("SC
3460: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56 41  ARD_E_INVALID_VA
3470: 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LUE");...case SC
3480: 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a  ARD_E_NO_MEMORY:
3490: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
34a0: 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b  D_E_NO_MEMORY");
34b0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34c0: 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 3a 0a  UNKNOWN_READER:.
34d0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
34e0: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
34f0: 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  R");...case SCAR
3500: 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a 09 09 09  D_E_TIMEOUT:....
3510: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3520: 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09 63 61 73  TIMEOUT");...cas
3530: 65 20 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  e SCARD_E_SHARIN
3540: 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09  G_VIOLATION:....
3550: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3560: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
3570: 4e 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  N");...case SCAR
3580: 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44  D_E_NO_SMARTCARD
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35a0: 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43 41 52  RD_E_NO_SMARTCAR
35b0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
35c0: 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44  D_E_UNKNOWN_CARD
35d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35e0: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52  RD_E_UNKNOWN_CAR
35f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3600: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
3610: 43 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  CH:....return("S
3620: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
3630: 4d 41 54 43 48 22 29 3b 0a 09 09 63 61 73 65 20  MATCH");...case 
3640: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44  SCARD_E_NOT_READ
3650: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  Y:....return("SC
3660: 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 22  ARD_E_NOT_READY"
3670: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3680: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c  E_SYSTEM_CANCELL
3690: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
36a0: 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41  CARD_E_SYSTEM_CA
36b0: 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73  NCELLED");...cas
36c0: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52  e SCARD_E_NOT_TR
36d0: 41 4e 53 41 43 54 45 44 3a 0a 09 09 09 72 65 74  ANSACTED:....ret
36e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54  urn("SCARD_E_NOT
36f0: 5f 54 52 41 4e 53 41 43 54 45 44 22 29 3b 0a 09  _TRANSACTED");..
3700: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
3710: 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45  ADER_UNAVAILABLE
3720: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3730: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56  RD_E_READER_UNAV
3740: 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  AILABLE");...cas
3750: 65 20 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50  e SCARD_W_UNSUPP
3760: 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  ORTED_CARD:....r
3770: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
3780: 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 22  NSUPPORTED_CARD"
3790: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37a0: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
37b0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
37c0: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
37d0: 53 49 56 45 5f 43 41 52 44 22 29 3b 0a 09 09 63  SIVE_CARD");...c
37e0: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f  ase SCARD_W_UNPO
37f0: 57 45 52 45 44 5f 43 41 52 44 3a 0a 09 09 09 72  WERED_CARD:....r
3800: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
3810: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 22 29 3b  NPOWERED_CARD");
3820: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
3830: 52 45 53 45 54 5f 43 41 52 44 3a 0a 09 09 09 72  RESET_CARD:....r
3840: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52  eturn("SCARD_W_R
3850: 45 53 45 54 5f 43 41 52 44 22 29 3b 0a 09 09 63  ESET_CARD");...c
3860: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 4d 4f  ase SCARD_W_REMO
3870: 56 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  VED_CARD:....ret
3880: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 4d  urn("SCARD_W_REM
3890: 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  OVED_CARD");...c
38a0: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 43 49 5f  ase SCARD_E_PCI_
38b0: 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09 09 72 65  TOO_SMALL:....re
38c0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 43  turn("SCARD_E_PC
38d0: 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09  I_TOO_SMALL");..
38e0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 52 45  .case SCARD_E_RE
38f0: 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44  ADER_UNSUPPORTED
3900: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3910: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55  RD_E_READER_UNSU
3920: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
3930: 65 20 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43  e SCARD_E_DUPLIC
3940: 41 54 45 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  ATE_READER:....r
3950: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 44  eturn("SCARD_E_D
3960: 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 22  UPLICATE_READER"
3970: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3980: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54  E_CARD_UNSUPPORT
3990: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
39a0: 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55  CARD_E_CARD_UNSU
39b0: 50 50 4f 52 54 45 44 22 29 3b 0a 09 09 63 61 73  PPORTED");...cas
39c0: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52  e SCARD_E_NO_SER
39d0: 56 49 43 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  VICE:....return(
39e0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56  "SCARD_E_NO_SERV
39f0: 49 43 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ICE");...case SC
3a00: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
3a10: 4f 50 50 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  OPPED:....return
3a20: 28 22 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43  ("SCARD_E_SERVIC
3a30: 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a 09 09 63  E_STOPPED");...c
3a40: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 53 55  ase SCARD_E_UNSU
3a50: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 3a  PPORTED_FEATURE:
3a60: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3a70: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
3a80: 46 45 41 54 55 52 45 22 29 3b 0a 23 69 66 64 65  FEATURE");.#ifde
3a90: 66 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  f SCARD_W_INSERT
3aa0: 45 44 5f 43 41 52 44 0a 09 09 63 61 73 65 20 53  ED_CARD...case S
3ab0: 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f  CARD_W_INSERTED_
3ac0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3ad0: 22 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54 45  "SCARD_W_INSERTE
3ae0: 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e 64 69 66  D_CARD");.#endif
3af0: 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f 45 5f  .#ifdef SCARD_E_
3b00: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3b10: 41 42 4c 45 0a 09 09 63 61 73 65 20 53 43 41 52  ABLE...case SCAR
3b20: 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41  D_E_NO_READERS_A
3b30: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74  VAILABLE:....ret
3b40: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
3b50: 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c  READERS_AVAILABL
3b60: 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a  E");.#endif..}..
3b70: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e  .return("UNKNOWN
3b80: 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f  ");.}..static co
3b90: 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59  nst char *CACKEY
3ba0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
3bb0: 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74 31 36 5f  D_TO_STR(uint16_
3bc0: 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73 77 69 74  t objid) {..swit
3bd0: 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a 09 09 63  ch (objid) {...c
3be0: 61 73 65 20 30 78 32 30 30 30 3a 0a 09 09 09 72  ase 0x2000:....r
3bf0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c00: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49  V_OBJID_GENERALI
3c10: 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78  NFO");...case 0x
3c20: 32 31 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  2100:....return(
3c30: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3c40: 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46  D_PROPERSONALINF
3c50: 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 33 30  O");...case 0x30
3c60: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3c70: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3c80: 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 22 29 3b  ACCESSCONTROL");
3c90: 0a 09 09 63 61 73 65 20 30 78 34 30 30 30 3a 0a  ...case 0x4000:.
3ca0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3cb0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49  Y_TLV_OBJID_LOGI
3cc0: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 35 30  N");...case 0x50
3cd0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3ce0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3cf0: 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09 09 63 61  CARDINFO");...ca
3d00: 73 65 20 30 78 36 30 30 30 3a 0a 09 09 09 72 65  se 0x6000:....re
3d10: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d20: 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43  _OBJID_BIOMETRIC
3d30: 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 37 30  S");...case 0x70
3d40: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3d50: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d60: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 22 29  DIGITALSIGCERT")
3d70: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 30 3a  ;...case 0x0200:
3d80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3d90: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3da0: 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09 63 61 73  _PERSON");...cas
3db0: 65 20 30 78 30 32 30 32 3a 0a 09 09 09 72 65 74  e 0x0202:....ret
3dc0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3dd0: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49  OBJID_CAC_BENEFI
3de0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  TS");...case 0x0
3df0: 32 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  203:....return("
3e00: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3e10: 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49  _CAC_OTHERBENEFI
3e20: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  TS");...case 0x0
3e30: 32 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  201:....return("
3e40: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3e50: 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 22 29  _CAC_PERSONNEL")
3e60: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 46 45 3a  ;...case 0x02FE:
3e70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3e80: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3e90: 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09 7d 0a 09  _PKICERT");..}..
3ea0: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3eb0: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3ec0: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3ed0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50  Y_DEBUG_FUNC_APP
3ee0: 54 59 50 45 5f 54 4f 5f 53 54 52 28 75 69 6e 74  TYPE_TO_STR(uint
3ef0: 38 5f 74 20 61 70 70 74 79 70 65 29 20 7b 0a 09  8_t apptype) {..
3f00: 73 77 69 74 63 68 20 28 61 70 70 74 79 70 65 29  switch (apptype)
3f10: 20 7b 0a 09 09 63 61 73 65 20 30 78 30 30 3a 0a   {...case 0x00:.
3f20: 09 09 09 72 65 74 75 72 6e 28 22 4e 4f 4e 45 22  ...return("NONE"
3f30: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 31 3a 0a  );...case 0x01:.
3f40: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3f50: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3f60: 43 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  C");...case 0x02
3f70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3f80: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22  KEY_TLV_APP_SKI"
3f90: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 33 3a 0a  );...case 0x03:.
3fa0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3fb0: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3fc0: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
3fd0: 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_SKI");...case
3fe0: 20 30 78 30 34 3a 0a 09 09 09 72 65 74 75 72 6e   0x04:....return
3ff0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
4000: 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _PKI");...case 0
4010: 78 30 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x05:....return("
4020: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
4030: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
4040: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
4050: 09 63 61 73 65 20 30 78 30 36 3a 0a 09 09 09 72  .case 0x06:....r
4060: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
4070: 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b  V_APP_SKI | CACK
4080: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
4090: 3b 0a 09 09 63 61 73 65 20 30 78 30 37 3a 0a 09  ;...case 0x07:..
40a0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
40b0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
40c0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
40d0: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
40e0: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 7d  LV_APP_PKI");..}
40f0: 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e 56 41 4c  ...return("INVAL
4100: 49 44 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ID");.}..static 
4110: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
4120: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54  EY_DEBUG_FUNC_AT
4130: 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 43  TRIBUTE_TO_STR(C
4140: 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
4150: 20 61 74 74 72 29 20 7b 0a 09 73 77 69 74 63 68   attr) {..switch
4160: 20 28 61 74 74 72 29 20 7b 0a 09 09 63 61 73 65   (attr) {...case
4170: 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 72   CKA_CLASS:....r
4180: 65 74 75 72 6e 28 22 43 4b 41 5f 43 4c 41 53 53  eturn("CKA_CLASS
4190: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54  ");...case CKA_T
41a0: 4f 4b 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  OKEN:....return(
41b0: 22 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09  "CKA_TOKEN");...
41c0: 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45  case CKA_PRIVATE
41d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
41e0: 5f 50 52 49 56 41 54 45 22 29 3b 0a 09 09 63 61  _PRIVATE");...ca
41f0: 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09  se CKA_LABEL:...
4200: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 41 42  .return("CKA_LAB
4210: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EL");...case CKA
4220: 5f 41 50 50 4c 49 43 41 54 49 4f 4e 3a 0a 09 09  _APPLICATION:...
4230: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 50 50  .return("CKA_APP
4240: 4c 49 43 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61  LICATION");...ca
4250: 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09  se CKA_VALUE:...
4260: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
4270: 55 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  UE");...case CKA
4280: 5f 4f 42 4a 45 43 54 5f 49 44 3a 0a 09 09 09 72  _OBJECT_ID:....r
4290: 65 74 75 72 6e 28 22 43 4b 41 5f 4f 42 4a 45 43  eturn("CKA_OBJEC
42a0: 54 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43  T_ID");...case C
42b0: 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
42c0: 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPE:....return("
42d0: 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
42e0: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
42f0: 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 65  KA_ISSUER:....re
4300: 74 75 72 6e 28 22 43 4b 41 5f 49 53 53 55 45 52  turn("CKA_ISSUER
4310: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4320: 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09  ERIAL_NUMBER:...
4330: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 52  .return("CKA_SER
4340: 49 41 4c 5f 4e 55 4d 42 45 52 22 29 3b 0a 09 09  IAL_NUMBER");...
4350: 63 61 73 65 20 43 4b 41 5f 41 43 5f 49 53 53 55  case CKA_AC_ISSU
4360: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
4370: 4b 41 5f 41 43 5f 49 53 53 55 45 52 22 29 3b 0a  KA_AC_ISSUER");.
4380: 09 09 63 61 73 65 20 43 4b 41 5f 4f 57 4e 45 52  ..case CKA_OWNER
4390: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
43a0: 5f 4f 57 4e 45 52 22 29 3b 0a 09 09 63 61 73 65  _OWNER");...case
43b0: 20 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 3a   CKA_ATTR_TYPES:
43c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
43d0: 41 54 54 52 5f 54 59 50 45 53 22 29 3b 0a 09 09  ATTR_TYPES");...
43e0: 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44  case CKA_TRUSTED
43f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4400: 5f 54 52 55 53 54 45 44 22 29 3b 0a 09 09 63 61  _TRUSTED");...ca
4410: 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a  se CKA_KEY_TYPE:
4420: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4430: 4b 45 59 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  KEY_TYPE");...ca
4440: 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a  se CKA_SUBJECT:.
4450: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4460: 55 42 4a 45 43 54 22 29 3b 0a 09 09 63 61 73 65  UBJECT");...case
4470: 20 43 4b 41 5f 49 44 3a 0a 09 09 09 72 65 74 75   CKA_ID:....retu
4480: 72 6e 28 22 43 4b 41 5f 49 44 22 29 3b 0a 09 09  rn("CKA_ID");...
4490: 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49  case CKA_SENSITI
44a0: 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  VE:....return("C
44b0: 4b 41 5f 53 45 4e 53 49 54 49 56 45 22 29 3b 0a  KA_SENSITIVE");.
44c0: 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 43 52 59  ..case CKA_ENCRY
44d0: 50 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  PT:....return("C
44e0: 4b 41 5f 45 4e 43 52 59 50 54 22 29 3b 0a 09 09  KA_ENCRYPT");...
44f0: 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54  case CKA_DECRYPT
4500: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4510: 5f 44 45 43 52 59 50 54 22 29 3b 0a 09 09 63 61  _DECRYPT");...ca
4520: 73 65 20 43 4b 41 5f 57 52 41 50 3a 0a 09 09 09  se CKA_WRAP:....
4530: 72 65 74 75 72 6e 28 22 43 4b 41 5f 57 52 41 50  return("CKA_WRAP
4540: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 55  ");...case CKA_U
4550: 4e 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e  NWRAP:....return
4560: 28 22 43 4b 41 5f 55 4e 57 52 41 50 22 29 3b 0a  ("CKA_UNWRAP");.
4570: 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a  ..case CKA_SIGN:
4580: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4590: 53 49 47 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  SIGN");...case C
45a0: 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a  KA_SIGN_RECOVER:
45b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
45c0: 53 49 47 4e 5f 52 45 43 4f 56 45 52 22 29 3b 0a  SIGN_RECOVER");.
45d0: 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49 46  ..case CKA_VERIF
45e0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  Y:....return("CK
45f0: 41 5f 56 45 52 49 46 59 22 29 3b 0a 09 09 63 61  A_VERIFY");...ca
4600: 73 65 20 43 4b 41 5f 56 45 52 49 46 59 5f 52 45  se CKA_VERIFY_RE
4610: 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  COVER:....return
4620: 28 22 43 4b 41 5f 56 45 52 49 46 59 5f 52 45 43  ("CKA_VERIFY_REC
4630: 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  OVER");...case C
4640: 4b 41 5f 44 45 52 49 56 45 3a 0a 09 09 09 72 65  KA_DERIVE:....re
4650: 74 75 72 6e 28 22 43 4b 41 5f 44 45 52 49 56 45  turn("CKA_DERIVE
4660: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4670: 54 41 52 54 5f 44 41 54 45 3a 0a 09 09 09 72 65  TART_DATE:....re
4680: 74 75 72 6e 28 22 43 4b 41 5f 53 54 41 52 54 5f  turn("CKA_START_
4690: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  DATE");...case C
46a0: 4b 41 5f 45 4e 44 5f 44 41 54 45 3a 0a 09 09 09  KA_END_DATE:....
46b0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 44 5f  return("CKA_END_
46c0: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  DATE");...case C
46d0: 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 72  KA_MODULUS:....r
46e0: 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c  eturn("CKA_MODUL
46f0: 55 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  US");...case CKA
4700: 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 3a 0a 09  _MODULUS_BITS:..
4710: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f  ..return("CKA_MO
4720: 44 55 4c 55 53 5f 42 49 54 53 22 29 3b 0a 09 09  DULUS_BITS");...
4730: 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  case CKA_PUBLIC_
4740: 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74  EXPONENT:....ret
4750: 75 72 6e 28 22 43 4b 41 5f 50 55 42 4c 49 43 5f  urn("CKA_PUBLIC_
4760: 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61  EXPONENT");...ca
4770: 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 5f 45  se CKA_PRIVATE_E
4780: 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75  XPONENT:....retu
4790: 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45 5f  rn("CKA_PRIVATE_
47a0: 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09 09 63 61  EXPONENT");...ca
47b0: 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a  se CKA_PRIME_1:.
47c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
47d0: 52 49 4d 45 5f 31 22 29 3b 0a 09 09 63 61 73 65  RIME_1");...case
47e0: 20 43 4b 41 5f 50 52 49 4d 45 5f 32 3a 0a 09 09   CKA_PRIME_2:...
47f0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4800: 4d 45 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43  ME_2");...case C
4810: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09  KA_EXPONENT_1:..
4820: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
4830: 50 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09 09 63 61  PONENT_1");...ca
4840: 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f  se CKA_EXPONENT_
4850: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  2:....return("CK
4860: 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a  A_EXPONENT_2");.
4870: 09 09 63 61 73 65 20 43 4b 41 5f 43 4f 45 46 46  ..case CKA_COEFF
4880: 49 43 49 45 4e 54 3a 0a 09 09 09 72 65 74 75 72  ICIENT:....retur
4890: 6e 28 22 43 4b 41 5f 43 4f 45 46 46 49 43 49 45  n("CKA_COEFFICIE
48a0: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
48b0: 5f 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72  _PRIME:....retur
48c0: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 22 29 3b 0a  n("CKA_PRIME");.
48d0: 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 50 52  ..case CKA_SUBPR
48e0: 49 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IME:....return("
48f0: 43 4b 41 5f 53 55 42 50 52 49 4d 45 22 29 3b 0a  CKA_SUBPRIME");.
4900: 09 09 63 61 73 65 20 43 4b 41 5f 42 41 53 45 3a  ..case CKA_BASE:
4910: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4920: 42 41 53 45 22 29 3b 0a 09 09 63 61 73 65 20 43  BASE");...case C
4930: 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09  KA_PRIME_BITS:..
4940: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52  ..return("CKA_PR
4950: 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61  IME_BITS");...ca
4960: 73 65 20 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45  se CKA_SUB_PRIME
4970: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4980: 28 22 43 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f  ("CKA_SUB_PRIME_
4990: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
49a0: 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 3a 0a 09  KA_VALUE_BITS:..
49b0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41  ..return("CKA_VA
49c0: 4c 55 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61  LUE_BITS");...ca
49d0: 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e  se CKA_VALUE_LEN
49e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49f0: 5f 56 41 4c 55 45 5f 4c 45 4e 22 29 3b 0a 09 09  _VALUE_LEN");...
4a00: 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54  case CKA_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 45 58 54 52 41 43 54 41 42 4c 45  "CKA_EXTRACTABLE
4a30: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c  ");...case CKA_L
4a40: 4f 43 41 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  OCAL:....return(
4a50: 22 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09  "CKA_LOCAL");...
4a60: 63 61 73 65 20 43 4b 41 5f 4e 45 56 45 52 5f 45  case CKA_NEVER_E
4a70: 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72  XTRACTABLE:....r
4a80: 65 74 75 72 6e 28 22 43 4b 41 5f 4e 45 56 45 52  eturn("CKA_NEVER
4a90: 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a  _EXTRACTABLE");.
4aa0: 09 09 63 61 73 65 20 43 4b 41 5f 41 4c 57 41 59  ..case CKA_ALWAY
4ab0: 53 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09  S_SENSITIVE:....
4ac0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 4c 57 41  return("CKA_ALWA
4ad0: 59 53 5f 53 45 4e 53 49 54 49 56 45 22 29 3b 0a  YS_SENSITIVE");.
4ae0: 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 47  ..case CKA_KEY_G
4af0: 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a 0a 09 09  EN_MECHANISM:...
4b00: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59  .return("CKA_KEY
4b10: 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 22 29  _GEN_MECHANISM")
4b20: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4b30: 49 46 49 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  IFIABLE:....retu
4b40: 72 6e 28 22 43 4b 41 5f 4d 4f 44 49 46 49 41 42  rn("CKA_MODIFIAB
4b50: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  LE");...case CKA
4b60: 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 3a 0a 09  _ECDSA_PARAMS:..
4b70: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43  ..return("CKA_EC
4b80: 44 53 41 5f 50 41 52 41 4d 53 22 29 3b 0a 09 09  DSA_PARAMS");...
4b90: 63 61 73 65 20 43 4b 41 5f 45 43 5f 50 4f 49 4e  case CKA_EC_POIN
4ba0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4bb0: 41 5f 45 43 5f 50 4f 49 4e 54 22 29 3b 0a 09 09  A_EC_POINT");...
4bc0: 63 61 73 65 20 43 4b 41 5f 53 45 43 4f 4e 44 41  case CKA_SECONDA
4bd0: 52 59 5f 41 55 54 48 3a 0a 09 09 09 72 65 74 75  RY_AUTH:....retu
4be0: 72 6e 28 22 43 4b 41 5f 53 45 43 4f 4e 44 41 52  rn("CKA_SECONDAR
4bf0: 59 5f 41 55 54 48 22 29 3b 0a 09 09 63 61 73 65  Y_AUTH");...case
4c00: 20 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c   CKA_AUTH_PIN_FL
4c10: 41 47 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AGS:....return("
4c20: 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41  CKA_AUTH_PIN_FLA
4c30: 47 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  GS");...case CKA
4c40: 5f 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50 45  _HW_FEATURE_TYPE
4c50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4c60: 5f 48 57 5f 46 45 41 54 55 52 45 5f 54 59 50 45  _HW_FEATURE_TYPE
4c70: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 52  ");...case CKA_R
4c80: 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09  ESET_ON_INIT:...
4c90: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 52 45 53  .return("CKA_RES
4ca0: 45 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b 0a 09 09  ET_ON_INIT");...
4cb0: 63 61 73 65 20 43 4b 41 5f 48 41 53 5f 52 45 53  case CKA_HAS_RES
4cc0: 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ET:....return("C
4cd0: 4b 41 5f 48 41 53 5f 52 45 53 45 54 22 29 3b 0a  KA_HAS_RESET");.
4ce0: 09 09 63 61 73 65 20 43 4b 41 5f 56 45 4e 44 4f  ..case CKA_VENDO
4cf0: 52 5f 44 45 46 49 4e 45 44 3a 0a 09 09 09 72 65  R_DEFINED:....re
4d00: 74 75 72 6e 28 22 43 4b 41 5f 56 45 4e 44 4f 52  turn("CKA_VENDOR
4d10: 5f 44 45 46 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a  _DEFINED");..}..
4d20: 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e  .return("UNKNOWN
4d30: 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66 69 6e 65  ");.}..#  define
4d40: 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41 43 4b 45   malloc(x) CACKE
4d50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c  Y_DEBUG_FUNC_MAL
4d60: 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c  LOC(x, __func__,
4d70: 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 64 65   __LINE__).#  de
4d80: 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20  fine realloc(x, 
4d90: 79 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  y) CACKEY_DEBUG_
4da0: 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20  FUNC_REALLOC(x, 
4db0: 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  y, __func__, __L
4dc0: 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64 65 66 20  INE__).#  ifdef 
4dd0: 73 74 72 64 75 70 0a 23 20 20 20 20 75 6e 64 65  strdup.#    unde
4de0: 66 20 73 74 72 64 75 70 0a 23 20 20 65 6e 64 69  f strdup.#  endi
4df0: 66 0a 23 20 20 64 65 66 69 6e 65 20 73 74 72 64  f.#  define strd
4e00: 75 70 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42  up(x) CACKEY_DEB
4e10: 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28 78  UG_FUNC_STRDUP(x
4e20: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
4e30: 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20 20 64  NE__).#else.#  d
4e40: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e50: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
4e60: 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43  /**/.#  define C
4e70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4e80: 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 2f 2a  TBUF(f, x, y) /*
4e90: 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  */.#  define CAC
4ea0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
4eb0: 41 47 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  AG_TO_STR(x) "DE
4ec0: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20  BUG_DISABLED".# 
4ed0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4ee0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
4ef0: 52 52 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  RR_TO_STR(x) "DE
4f00: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20  BUG_DISABLED".# 
4f10: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4f20: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
4f30: 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47  TO_STR(x) "DEBUG
4f40: 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65  _DISABLED".#  de
4f50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4f60: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54  G_FUNC_APPTYPE_T
4f70: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4f80: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4f90: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4fa0: 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f  _FUNC_ATTRIBUTE_
4fb0: 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47  TO_STR(x) "DEBUG
4fc0: 5f 44 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69  _DISABLED".#endi
4fd0: 66 0a 0a 2f 2a 0a 20 2a 20 49 6e 63 6c 75 64 65  f../*. * Include
4fe0: 20 74 68 65 73 65 20 73 6f 75 72 63 65 20 66 69   these source fi
4ff0: 6c 65 73 20 69 6e 20 74 68 69 73 20 74 72 61 6e  les in this tran
5000: 73 6c 61 74 69 6f 6e 20 75 6e 69 74 20 73 6f 20  slation unit so 
5010: 74 68 61 74 20 77 65 20 63 61 6e 20 62 69 6e 64  that we can bind
5020: 20 74 6f 0a 20 2a 20 66 75 6e 63 74 69 6f 6e 73   to. * functions
5030: 20 61 6e 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65   and not include
5040: 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20 69 6e 20   any symbols in 
5050: 74 68 65 20 6f 75 74 70 75 74 20 73 68 61 72 65  the output share
5060: 64 20 6f 62 6a 65 63 74 2e 0a 20 2a 2f 0a 23 69  d object.. */.#i
5070: 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35 30  nclude "asn1-x50
5080: 39 2e 63 22 0a 23 69 6e 63 6c 75 64 65 20 22 73  9.c".#include "s
5090: 68 61 31 2e 63 22 0a 23 69 6e 63 6c 75 64 65 20  ha1.c".#include 
50a0: 22 6d 64 35 2e 63 22 0a 0a 74 79 70 65 64 65 66  "md5.c"..typedef
50b0: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
50c0: 49 44 5f 54 59 50 45 5f 45 52 52 4f 52 2c 0a 09  ID_TYPE_ERROR,..
50d0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55  CACKEY_ID_TYPE_U
50e0: 4e 4b 4e 4f 57 4e 2c 0a 09 43 41 43 4b 45 59 5f  NKNOWN,..CACKEY_
50f0: 49 44 5f 54 59 50 45 5f 43 41 43 2c 0a 09 43 41  ID_TYPE_CAC,..CA
5100: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
5110: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
5120: 45 5f 43 45 52 54 5f 4f 4e 4c 59 0a 7d 20 63 61  E_CERT_ONLY.} ca
5130: 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
5140: 65 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  e;..struct cacke
5150: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
5160: 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  {..cackey_pcsc_i
5170: 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b 0a  d_type id_type;.
5180: 0a 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  ..size_t certifi
5190: 63 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67  cate_len;..unsig
51a0: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
51b0: 69 63 61 74 65 3b 0a 0a 09 73 73 69 7a 65 5f 74  icate;...ssize_t
51c0: 20 6b 65 79 73 69 7a 65 3b 0a 0a 09 75 6e 69 6f   keysize;...unio
51d0: 6e 20 7b 0a 09 09 73 74 72 75 63 74 20 7b 0a 09  n {...struct {..
51e0: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
51f0: 61 70 70 6c 65 74 5b 37 5d 3b 0a 09 09 09 75 69  applet[7];....ui
5200: 6e 74 31 36 5f 74 20 66 69 6c 65 3b 0a 09 09 7d  nt16_t file;...}
5210: 20 63 61 63 3b 0a 0a 09 09 73 74 72 75 63 74 20   cac;....struct 
5220: 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20 63 68  {....unsigned ch
5230: 61 72 20 6b 65 79 5f 69 64 3b 0a 09 09 09 63 68  ar key_id;....ch
5240: 61 72 20 6c 61 62 65 6c 5b 33 32 5d 3b 0a 09 09  ar label[32];...
5250: 7d 20 70 69 76 3b 0a 09 7d 20 63 61 72 64 3b 0a  } piv;..} card;.
5260: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
5270: 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 73 74  y_identity {..st
5280: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
5290: 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
52a0: 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41  identity;...CK_A
52b0: 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69 62  TTRIBUTE *attrib
52c0: 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  utes;..CK_ULONG 
52d0: 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
52e0: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
52f0: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69  key_session {..i
5300: 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f  nt active;...CK_
5310: 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
5320: 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65  ..CK_STATE state
5330: 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  ;..CK_FLAGS flag
5340: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  s;..CK_ULONG ulD
5350: 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f  eviceError;..CK_
5360: 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63  VOID_PTR pApplic
5370: 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46  ation;..CK_NOTIF
5380: 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75  Y Notify;...stru
5390: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
53a0: 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a  ty *identities;.
53b0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
53c0: 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
53d0: 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63  ...int search_ac
53e0: 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42  tive;..CK_ATTRIB
53f0: 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71  UTE_PTR search_q
5400: 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  uery;..CK_ULONG 
5410: 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
5420: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  nt;..unsigned lo
5430: 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69  ng search_curr_i
5440: 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63  d;...int sign_ac
5450: 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e  tive;..CK_MECHAN
5460: 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65  ISM_TYPE sign_me
5470: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54  chanism;..CK_BYT
5480: 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a  E_PTR sign_buf;.
5490: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
54a0: 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73  ign_buflen;..uns
54b0: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
54c0: 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74  bufused;..struct
54d0: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
54e0: 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b   *sign_identity;
54f0: 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61  ...int decrypt_a
5500: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
5510: 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70  NISM_TYPE decryp
5520: 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b  t_mechanism;..CK
5530: 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70  _VOID_PTR decryp
5540: 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b  t_mech_parm;..CK
5550: 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d  _ULONG decrypt_m
5560: 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74  ech_parmlen;..st
5570: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
5580: 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64  tity *decrypt_id
5590: 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75  entity;.};..stru
55a0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b  ct cackey_slot {
55b0: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 09 69  ..int active;..i
55c0: 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a 0a 09 63  nt internal;...c
55d0: 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72  har *pcsc_reader
55e0: 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72  ;...int pcsc_car
55f0: 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43  d_connected;..SC
5600: 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63  ARDHANDLE pcsc_c
5610: 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73  ard;...int trans
5620: 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 09 69  action_depth;..i
5630: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  nt transaction_n
5640: 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69  eed_hw_lock;...i
5650: 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a  nt slot_reset;..
5660: 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f  .CK_FLAGS token_
5670: 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65  flags;...unsigne
5680: 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a  d char *label;..
5690: 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b  .DWORD protocol;
56a0: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ...unsigned int 
56b0: 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
56c0: 6e 74 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  nt;..struct cack
56d0: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
56e0: 20 2a 63 61 63 68 65 64 5f 63 65 72 74 73 3b 0a   *cached_certs;.
56f0: 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  ..cackey_pcsc_id
5700: 5f 74 79 70 65 20 69 64 5f 74 79 70 65 5f 68 69  _type id_type_hi
5710: 6e 74 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20  nt;.};..typedef 
5720: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54  enum {..CACKEY_T
5730: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d  LV_APP_GENERIC =
5740: 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54   0x01,..CACKEY_T
5750: 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d  LV_APP_SKI     =
5760: 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54   0x02,..CACKEY_T
5770: 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d  LV_APP_PKI     =
5780: 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74   0x04.} cackey_t
5790: 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70  lv_apptype;..typ
57a0: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
57b0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45  KEY_TLV_OBJID_GE
57c0: 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20  NERALINFO       
57d0: 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x2000,..CACKE
57e0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50  Y_TLV_OBJID_PROP
57f0: 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20  ERSONALINFO   = 
5800: 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2100,..CACKEY_
5810: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53  TLV_OBJID_ACCESS
5820: 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78  CONTROL     = 0x
5830: 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  3000,..CACKEY_TL
5840: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20  V_OBJID_LOGIN   
5850: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30            = 0x40
5860: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5870: 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20  OBJID_CARDINFO  
5880: 20 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30          = 0x5000
5890: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
58a0: 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20  JID_BIOMETRICS  
58b0: 20 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a        = 0x6000,.
58c0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
58d0: 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54  D_DIGITALSIGCERT
58e0: 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43      = 0x7000,..C
58f0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5900: 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20  CAC_PERSON      
5910: 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43    = 0x0200,..CAC
5920: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5930: 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20  C_BENEFITS      
5940: 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45  = 0x0202,..CACKE
5950: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
5960: 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20  OTHERBENEFITS = 
5970: 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f  0x0203,..CACKEY_
5980: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
5990: 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78  RSONNEL     = 0x
59a0: 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0201,..CACKEY_TL
59b0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43  V_OBJID_CAC_PKIC
59c0: 45 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32  ERT       = 0x02
59d0: 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  FE.} cackey_tlv_
59e0: 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64  objectid;..typed
59f0: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
5a00: 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
5a10: 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43  ESENT    = 1,..C
5a20: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30               = 0
5a40: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
5a50: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20  _GENERIC        
5a60: 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50   = -1,..CACKEY_P
5a70: 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20  CSC_E_BADPIN    
5a80: 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43        = -2,..CAC
5a90: 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
5aa0: 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c  D          = -3,
5ab0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5ac0: 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20  NEEDLOGIN       
5ad0: 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -4,..CACKEY_PC
5ae0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
5af0: 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b       = -6,..CACK
5b00: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20  EY_PCSC_E_RETRY 
5b10: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37 2c 0a            = -7,.
5b20: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  .CACKEY_PCSC_E_N
5b30: 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 3d  ODATA          =
5b40: 20 2d 38 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74   -8.} cackey_ret
5b50: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
5b60: 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09  _tlv_cardurl {..
5b70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20  unsigned char   
5b80: 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61       rid[5];..ca
5b90: 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65  ckey_tlv_apptype
5ba0: 20 20 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63     apptype;..cac
5bb0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
5bc0: 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63    objectid;..cac
5bd0: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
5be0: 20 20 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e    appid;..unsign
5bf0: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 70  ed char        p
5c00: 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  inid;.};..struct
5c10: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
5c20: 74 79 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65  ty;.struct cacke
5c30: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09  y_tlv_entity {..
5c40: 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69  uint8_t tag;..si
5c50: 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75  ze_t length;...u
5c60: 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76  nion {...void *v
5c70: 61 6c 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63  alue;...struct c
5c80: 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72  ackey_tlv_cardur
5c90: 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  l *value_cardurl
5ca0: 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75  ;...uint8_t valu
5cb0: 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74  e_byte;..};...st
5cc0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
5cd0: 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d  entity *_next;.}
5ce0: 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f  ;../* CACKEY Glo
5cf0: 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73  bal Handles */.s
5d00: 74 61 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b  tatic void *cack
5d10: 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c  ey_biglock = NUL
5d20: 4c 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  L;.static struct
5d30: 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20   cackey_session 
5d40: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
5d50: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72  128];.static str
5d60: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
5d70: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38  cackey_slots[128
5d80: 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  ];.static int ca
5d90: 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
5da0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
5db0: 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f   cackey_biglock_
5dc0: 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49  init = 0;.CK_C_I
5dd0: 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63  NITIALIZE_ARGS c
5de0: 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 2a  ackey_args;../**
5df0: 20 45 78 74 72 61 20 63 65 72 74 69 66 69 63 61   Extra certifica
5e00: 74 65 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69  tes to include i
5e10: 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73 74 72 75  n token **/.stru
5e20: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
5e30: 64 65 6e 74 69 74 79 20 65 78 74 72 61 5f 63 65  dentity extra_ce
5e40: 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75  rts[] = {.#inclu
5e50: 64 65 20 22 63 61 63 6b 65 79 5f 62 75 69 6c 74  de "cackey_built
5e60: 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d 3b 0a 0a  in_certs.h".};..
5e70: 23 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 4d  #define CACKEY_M
5e80: 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54  ACRO_DEFAULT_XST
5e90: 52 28 73 74 72 29 20 43 41 43 4b 45 59 5f 4d 41  R(str) CACKEY_MA
5ea0: 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53 54 52 28  CRO_DEFAULT_STR(
5eb0: 73 74 72 29 0a 23 64 65 66 69 6e 65 20 43 41 43  str).#define CAC
5ec0: 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c  KEY_MACRO_DEFAUL
5ed0: 54 5f 53 54 52 28 73 74 72 29 20 23 73 74 72 0a  T_STR(str) #str.
5ee0: 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64 20 41 75  ./* Protected Au
5ef0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 50 61 74  thentication Pat
5f00: 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 73 74 61  h command */.sta
5f10: 74 69 63 20 63 68 61 72 20 2a 63 61 63 6b 65 79  tic char *cackey
5f20: 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e  _pin_command = N
5f30: 55 4c 4c 3b 0a 0a 2f 2a 20 52 65 61 64 65 72 20  ULL;../* Reader 
5f40: 45 78 63 6c 75 73 69 6f 6e 20 6f 72 20 49 6e 63  Exclusion or Inc
5f50: 6c 75 64 65 2d 6f 6e 6c 79 20 2a 2f 0a 73 74 61  lude-only */.sta
5f60: 74 69 63 20 63 68 61 72 20 2a 63 61 63 6b 65 79  tic char *cackey
5f70: 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
5f80: 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 73 74  _only = NULL;.st
5f90: 61 74 69 63 20 63 68 61 72 20 2a 63 61 63 6b 65  atic char *cacke
5fa0: 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64  y_readers_exclud
5fb0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 50 43  e = NULL;../* PC
5fc0: 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65  SC Global Handle
5fd0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43  s */.static LPSC
5fe0: 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65  ARDCONTEXT cacke
5ff0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6000: 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e  NULL;..static un
6010: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b  signed long cack
6020: 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f  ey_getversion(vo
6030: 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e  id) {..static un
6040: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76  signed long retv
6050: 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67  al = 255;..unsig
6060: 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d  ned long major =
6070: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f   0;..unsigned lo
6080: 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63  ng minor = 0;..c
6090: 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d  har *major_str =
60a0: 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69   NULL;..char *mi
60b0: 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a  nor_str = NULL;.
60c0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
60d0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
60e0: 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21  ;...if (retval !
60f0: 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45  = 255) {...CACKE
6100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6110: 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20  Returning 0x%lx 
6120: 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76  (cached).", retv
6130: 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72  al);....return(r
6140: 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
6150: 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  val = 0;..#ifdef
6160: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
6170: 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73  .        major_s
6180: 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52  tr = PACKAGE_VER
6190: 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72  SION;..if (major
61a0: 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20  _str) {..       
61b0: 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c   major = strtoul
61c0: 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e  (major_str, &min
61d0: 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09  or_str, 10);....
61e0: 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b  if (minor_str) {
61f0: 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74  ....minor = strt
6200: 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20  oul(minor_str + 
6210: 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09  1, NULL, 10);...
6220: 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  }..}...retval = 
6230: 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20  (major << 16) | 
6240: 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65  (minor << 8);.#e
6250: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
6260: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
6270: 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65  rning 0x%lx", re
6280: 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
6290: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50  retval);.}../* P
62a0: 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e  C/SC Related Fun
62b0: 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20  ctions */./*. * 
62c0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
62d0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
62e0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
62f0: 28 69 6e 74 20 75 6e 69 74 69 61 6c 69 7a 65 5f  (int unitialize_
6300: 61 6c 6c 5f 72 65 61 64 65 72 73 29 3b 0a 20 2a  all_readers);. *
6310: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
6320: 20 20 20 20 20 69 6e 74 20 75 6e 69 74 69 61 6c       int unitial
6330: 69 7a 65 5f 61 6c 6c 5f 72 65 61 64 65 72 73 20  ize_all_readers 
6340: 20 20 20 20 20 46 72 65 65 20 74 68 65 20 22 70       Free the "p
6350: 63 73 63 5f 72 65 61 64 65 72 22 20 6f 62 6a 65  csc_reader" obje
6360: 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
6370: 74 68 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  th. *           
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 65 61 63 68 20 73 6c 6f 74 20 28 62 6f 6f 6c 65  each slot (boole
63a0: 61 6e 29 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  an). *. * RETURN
63b0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f   VALUE. *     No
63c0: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ne. *. * NOTES. 
63d0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
63e0: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20  ion disconnects 
63f0: 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a  from all cards..
6400: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
6410: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
6420: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 69  disconnect_all(i
6430: 6e 74 20 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c  nt unitialize_al
6440: 6c 5f 72 65 61 64 65 72 73 29 20 7b 0a 09 75 69  l_readers) {..ui
6450: 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
6460: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6470: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
6480: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
6490: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
64a0: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
64b0: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
64c0: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
64d0: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
64e0: 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29  s[idx].internal)
64f0: 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e   {..../* Skip in
6500: 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a  ternal slots */.
6510: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
6520: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6530: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
6540: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
6550: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6560: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69  _PRINTF("SCardDi
6570: 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61  sconnect(%lu) ca
6580: 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64  lled", (unsigned
6590: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09   long) idx);....
65a0: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
65b0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
65c0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  x].pcsc_card, SC
65d0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
65e0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
65f0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
6600: 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  bel) {....free(c
6610: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6620: 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63  .label);.....cac
6630: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
6640: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
6650: 0a 0a 09 09 69 66 20 28 75 6e 69 74 69 61 6c 69  ....if (unitiali
6660: 7a 65 5f 61 6c 6c 5f 72 65 61 64 65 72 73 20 7c  ze_all_readers |
6670: 7c 20 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  | !cackey_slots[
6680: 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
6690: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
66a0: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
66b0: 64 65 72 29 20 7b 0a 09 09 09 09 66 72 65 65 28  der) {.....free(
66c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
66d0: 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
66e0: 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
66f0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
6700: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a  er = NULL;....}.
6710: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
6720: 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
6730: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
6740: 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c   0;....cackey_sl
6750: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
6760: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
6770: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
6780: 69 64 78 5d 2e 69 64 5f 74 79 70 65 5f 68 69 6e  idx].id_type_hin
6790: 74 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  t = CACKEY_ID_TY
67a0: 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 09 7d 20  PE_UNKNOWN;...} 
67b0: 65 6c 73 65 20 7b 0a 09 09 09 69 66 20 28 63 61  else {....if (ca
67c0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
67d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
67e0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 63 61 63  h > 0) {.....cac
67f0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
6800: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
6810: 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09  hw_lock = 1;....
6820: 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  }...}....cackey_
6830: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
6840: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
6850: 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65   0;....if (cacke
6860: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74  y_slots[idx].act
6870: 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ive) {....CACKEY
6880: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
6890: 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c  arking active sl
68a0: 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20  ot %lu as being 
68b0: 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65  reset", (unsigne
68c0: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
68d0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
68e0: 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  dx].slot_reset =
68f0: 20 31 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43   1;...}..}...CAC
6900: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6910: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a  ("Returning");..
6920: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
6930: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6940: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6950: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6960: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
6970: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
6980: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
6990: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
69a0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
69b0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
69c0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
69d0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
69e0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
69f0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6a00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e  is function conn
6a10: 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53  ects to the PC/S
6a20: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6a30: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ager and updates
6a40: 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62   the. *     glob
6a50: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a  al handle.. *. *
6a60: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
6a70: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
6a80: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
6a90: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f  .LONG scard_est_
6aa0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66  context_ret;.#if
6ab0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
6ac0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f  VALIDCONTEXT..LO
6ad0: 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  NG scard_isvalid
6ae0: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
6af0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6b00: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
6b10: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6b20: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
6b30: 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63   {...cackey_pcsc
6b40: 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63  _handle = malloc
6b50: 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
6b60: 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09  pcsc_handle));..
6b70: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6b80: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
6b90: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
6ba0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
6bb0: 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  to malloc() fail
6bc0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
6bd0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
6be0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
6bf0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a  connect_all(0);.
6c00: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
6c10: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6c20: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
6c30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
6c40: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6c50: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
6c60: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  ...scard_est_con
6c70: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
6c80: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
6c90: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53  (SCARD_SCOPE_SYS
6ca0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  TEM, NULL, NULL,
6cb0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
6cc0: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72  dle);...if (scar
6cd0: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6ce0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
6cf0: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
6d00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6d10: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74  Call to SCardEst
6d20: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61  ablishContext fa
6d30: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25  iled (returned %
6d40: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e  s/%li), returnin
6d50: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43  g in failure", C
6d60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
6d70: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
6d80: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
6d90: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  xt_ret), (long) 
6da0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6db0: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65  t_ret);.....free
6dc0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
6dd0: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  dle);....cackey_
6de0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
6df0: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  LL;.....cackey_s
6e00: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
6e10: 61 6c 6c 28 30 29 3b 0a 0a 09 09 09 72 65 74 75  all(0);.....retu
6e20: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6e30: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09  _GENERIC);...}..
6e40: 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  }..#ifdef HAVE_S
6e50: 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45  CARDISVALIDCONTE
6e60: 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  XT..CACKEY_DEBUG
6e70: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 49 73  _PRINTF("SCardIs
6e80: 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63  ValidContext() c
6e90: 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f  alled");..scard_
6ea0: 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43  isvalid_ret = SC
6eb0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
6ec0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
6ed0: 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61  andle);..if (sca
6ee0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21  rd_isvalid_ret !
6ef0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
6f00: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
6f10: 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64  BUG_PRINTF("Hand
6f20: 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e  le has become in
6f30: 76 61 6c 69 64 20 28 53 43 61 72 64 49 73 56 61  valid (SCardIsVa
6f40: 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f  lidContext = %s/
6f50: 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20  %li), trying to 
6f60: 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22  re-establish..."
6f70: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
6f80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
6f90: 53 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69  STR(scard_isvali
6fa0: 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  d_ret), (long) s
6fb0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6fc0: 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
6fd0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
6fe0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
6ff0: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73  () called");...s
7000: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
7010: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61  _ret = SCardEsta
7020: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41  blishContext(SCA
7030: 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c  RD_SCOPE_SYSTEM,
7040: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63   NULL, NULL, cac
7050: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
7060: 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73  ;...if (scard_es
7070: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d  t_context_ret !=
7080: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
7090: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
70a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
70b0: 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69   to SCardEstabli
70c0: 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64  shContext failed
70d0: 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c   (returned %s/%l
70e0: 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  i), returning in
70f0: 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45   failure", CACKE
7100: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
7110: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
7120: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
7130: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
7140: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
7150: 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63  t);.....free(cac
7160: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
7170: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
7180: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
7190: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
71a0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
71b0: 30 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  0);.....return(C
71c0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
71d0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  ERIC);...}....CA
71e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
71f0: 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65  F("Handle has be
7200: 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65  en re-establishe
7210: 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  d");..}.#endif..
7220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7230: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
7240: 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50  y connected to P
7250: 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20  C/SC, returning 
7260: 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09  in success");...
7270: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7280: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
7290: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
72a0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
72b0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
72c0: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
72d0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
72e0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
72f0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7300: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7310: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7320: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7330: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7340: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7350: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7360: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
7370: 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d  disconnects from
7380: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
7390: 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e  ction manager an
73a0: 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20  d updates. *    
73b0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64   the global hand
73c0: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  le.. *. */.stati
73d0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
73e0: 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
73f0: 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e  ect(void) {..LON
7400: 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74  G scard_rel_cont
7410: 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ext_ret;...CACKE
7420: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7430: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7440: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
7450: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  dle == NULL) {..
7460: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7470: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
7480: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
7490: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c  t_ret = SCardRel
74a0: 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63  easeContext(*cac
74b0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
74c0: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
74d0: 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09  csc_handle) {...
74e0: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
74f0: 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61  _handle);.....ca
7500: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7510: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66   = NULL;..}...if
7520: 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74   (scard_rel_cont
7530: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
7540: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7550: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7560: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7570: 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  }...cackey_slots
7580: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
7590: 30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  0);...return(CAC
75a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
75b0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
75c0: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
75d0: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
75e0: 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  eset(struct cack
75f0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
7600: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
7610: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
7620: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7630: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
7640: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
7650: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b  is function mark
7660: 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76  s a slot has hav
7670: 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20  ing been reset, 
7680: 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61  to later be clea
7690: 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43  ned up.. *     C
76a0: 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70  leanup only happ
76b0: 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23  ens when a PKCS#
76c0: 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20  11 client calls 
76d0: 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
76e0: 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  t.. *. */.static
76f0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72   void cackey_mar
7700: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72  k_slot_reset(str
7710: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7720: 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *slot) {..struct
7730: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
7740: 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
7750: 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
7760: 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
7770: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20  ;...if (slot == 
7780: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
7790: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
77a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
77b0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
77c0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
77d0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61 72  nected) {...SCar
77e0: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
77f0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7800: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
7810: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f  .}...slot->slot_
7820: 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f 74  reset = 1;..slot
7830: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
7840: 65 63 74 65 64 20 3d 20 30 3b 0a 09 69 66 20 28  ected = 0;..if (
7850: 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
7860: 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
7870: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67  slot->token_flag
7880: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
7890: 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73 65 20  QUIRED;..} else 
78a0: 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  {...slot->token_
78b0: 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
78c0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
78d0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
78e0: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
78f0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7900: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7910: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
7920: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20  ult_protocol);. 
7930: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
7940: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
7950: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
7960: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
7970: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
7980: 2a 20 20 20 20 20 44 57 4f 52 44 20 64 65 66 61  *     DWORD defa
7990: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20  ult_protocol. * 
79a0: 20 20 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c          Protocol
79b0: 20 74 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73   to attempt firs
79c0: 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  t. *. * RETURN V
79d0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20  ALUE. *     The 
79e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
79f0: 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  m SCardReconnect
7a00: 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  (). *. * NOTES. 
7a10: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
7a20: 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
7a30: 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63   around SCardRec
7a40: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20  onnect(). *. *  
7a50: 20 20 20 54 68 65 20 53 43 61 72 64 52 65 63 6f     The SCardReco
7a60: 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e  nnect() function
7a70: 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61   call will be ca
7a80: 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74 68 20  lled first with 
7a90: 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65  the. *     dwPre
7aa0: 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20  ferredProtocols 
7ab0: 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74  of "default_prot
7ac0: 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20  ocol".  If that 
7ad0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20  call returns. * 
7ae0: 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54      SCARD_E_PROT
7af0: 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61  O_MISMATCH try a
7b00: 67 61 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74  gain with a prot
7b10: 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64  ocol of T=0, and
7b20: 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20   failing. *     
7b30: 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f  that T=1.. *. */
7b40: 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63  .static LONG cac
7b50: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
7b60: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
7b70: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f  _slot *slot, DWO
7b80: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7b90: 63 6f 6c 29 20 7b 0a 09 44 57 4f 52 44 20 73 65  col) {..DWORD se
7ba0: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b  lected_protocol;
7bb0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e  ..LONG scard_con
7bc0: 6e 5f 72 65 74 3b 0a 0a 09 73 65 6c 65 63 74 65  n_ret;...selecte
7bd0: 64 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a  d_protocol = 0;.
7be0: 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
7bf0: 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63   = SCardReconnec
7c00: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
7c10: 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  d, SCARD_SHARE_S
7c20: 48 41 52 45 44 2c 20 64 65 66 61 75 6c 74 5f 70  HARED, default_p
7c30: 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52  rotocol, SCARD_R
7c40: 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65  ESET_CARD, &sele
7c50: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
7c60: 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7c70: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7c80: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7c90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7ca0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
7cb0: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
7cc0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7cd0: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7ce0: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
7cf0: 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  )...scard_conn_r
7d00: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7d10: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7d20: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7d30: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7d40: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52  ROTOCOL_T0, SCAR
7d50: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
7d60: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7d70: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
7d80: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
7d90: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
7da0: 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  CH) {....CACKEY_
7db0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7dc0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
7dd0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7de0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7df0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7e00: 20 54 3d 31 22 29 0a 09 09 09 73 63 61 72 64 5f   T=1")....scard_
7e10: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
7e20: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
7e30: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
7e40: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
7e50: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
7e60: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7e70: 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72  RD, &selected_pr
7e80: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a  otocol);...}..}.
7e90: 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7ea0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
7eb0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f  SUCCESS) {...slo
7ec0: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 73 65  t->protocol = se
7ed0: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b  lected_protocol;
7ee0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61  ..}...return(sca
7ef0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a  rd_conn_ret);.}.
7f00: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
7f10: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
7f20: 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  t cackey_connect
7f30: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
7f40: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b  key_slot *slot);
7f50: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
7f60: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
7f70: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
7f80: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
7f90: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
7fa0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
7fb0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
7fc0: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
7fd0: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
7fe0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
7ff0: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
8000: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
8010: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
8020: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
8030: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e  y_ret cackey_con
8040: 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74  nect_card(struct
8050: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8060: 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65  ot) {..cackey_re
8070: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
8080: 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f  et;..DWORD proto
8090: 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  col;..LONG scard
80a0: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43  _conn_ret;...CAC
80b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
80c0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
80d0: 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41  f (!slot) {...CA
80e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
80f0: 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  F("Invalid slot 
8100: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72  specified, retur
8110: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
8120: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8130: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8140: 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  IC);..}...pcsc_c
8150: 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
8160: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
8170: 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  ();..if (pcsc_co
8180: 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
8190: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
81a0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
81b0: 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
81c0: 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c  on to PC/SC fail
81d0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
81e0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
81f0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8200: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8210: 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f  .../* Connect to
8220: 20 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64   reader, if need
8230: 65 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74  ed */..if (!slot
8240: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8250: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
8260: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8270: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29  SCardConnect(%s)
8280: 20 63 61 6c 6c 65 64 20 66 6f 72 20 73 6c 6f 74   called for slot
8290: 20 25 70 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63   %p", slot->pcsc
82a0: 5f 72 65 61 64 65 72 2c 20 73 6c 6f 74 29 3b 0a  _reader, slot);.
82b0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
82c0: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
82d0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
82e0: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
82f0: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8300: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
8310: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
8320: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8330: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
8340: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
8350: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8360: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8370: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8380: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8390: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
83a0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
83b0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
83c0: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
83d0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30  ng with just T=0
83e0: 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ")....scard_conn
83f0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
8400: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
8410: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
8420: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
8430: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
8440: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8450: 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  0, &slot->pcsc_c
8460: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
8470: 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63  .....if (scard_c
8480: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
8490: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
84a0: 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  H) {.....CACKEY_
84b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
84c0: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74  ardConnect() ret
84d0: 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52  urned SCARD_E_PR
84e0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72  OTO_MISMATCH, tr
84f0: 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54  ying with just T
8500: 3d 31 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63  =1").....scard_c
8510: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
8520: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
8530: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
8540: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
8550: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
8560: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
8570: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
8580: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
8590: 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  l);....}...}....
85a0: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
85b0: 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e  et == SCARD_W_UN
85c0: 50 4f 57 45 52 45 44 5f 43 41 52 44 29 20 7b 0a  POWERED_CARD) {.
85d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
85e0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
85f0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8600: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
8610: 44 5f 43 41 52 44 2c 20 74 72 79 69 6e 67 20 74  D_CARD, trying t
8620: 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22  o re-connect..."
8630: 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  );.....scard_con
8640: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8650: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
8660: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
8670: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
8680: 52 44 5f 53 48 41 52 45 5f 44 49 52 45 43 54 2c  RD_SHARE_DIRECT,
8690: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
86a0: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
86b0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
86c0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
86d0: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
86e0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
86f0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8700: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
8710: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8720: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8730: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8740: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
8750: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
8760: 75 73 74 20 54 3d 30 22 29 0a 09 09 09 09 73 63  ust T=0").....sc
8770: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8780: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8790: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
87a0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
87b0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
87c0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
87d0: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
87e0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
87f0: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66  otocol);......if
8800: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8810: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8820: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8830: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8840: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8850: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8860: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8870: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
8880: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
8890: 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
88a0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
88b0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
88c0: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
88d0: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
88e0: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
88f0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
8900: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
8910: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  d, &protocol);..
8920: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63  ...}....}.....sc
8930: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  ard_conn_ret = c
8940: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
8950: 63 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f  card(slot, proto
8960: 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  col);...}....if 
8970: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8980: 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45  == SCARD_E_NO_SE
8990: 52 56 49 43 45 29 20 7b 0a 09 09 09 43 41 43 4b  RVICE) {....CACK
89a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
89b0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
89c0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
89d0: 5f 4e 4f 5f 53 45 52 56 49 43 45 20 2d 2d 20 77  _NO_SERVICE -- w
89e0: 68 69 63 68 20 63 6f 75 6c 64 20 6d 65 61 6e 20  hich could mean 
89f0: 6f 75 72 20 68 61 6e 64 6c 65 20 69 73 20 69 6e  our handle is in
8a00: 76 61 6c 69 64 2c 20 77 69 6c 6c 20 74 72 79 20  valid, will try 
8a10: 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  to reconnect to 
8a20: 50 43 2f 53 43 20 73 65 72 76 69 63 65 22 29 3b  PC/SC service");
8a30: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  .....cackey_pcsc
8a40: 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
8a50: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  ...cackey_pcsc_c
8a60: 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61  onnect();.....ca
8a70: 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
8a80: 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  eset(slot);.....
8a90: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 63 6f  return(cackey_co
8aa0: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
8ab0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  );...}....if (sc
8ac0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20  ard_conn_ret != 
8ad0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
8ae0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8af0: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
8b00: 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61  ction to card fa
8b10: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
8b20: 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72  in failure (SCar
8b30: 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f  dConnect() = %s/
8b40: 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %li)", CACKEY_DE
8b50: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
8b60: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63  R_TO_STR(scard_c
8b70: 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  onn_ret), (long)
8b80: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29   scard_conn_ret)
8b90: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
8ba0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8bb0: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74  IC);...}....slot
8bc0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8bd0: 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f  ected = 1;...slo
8be0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8bf0: 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74  epth = 0;...slot
8c00: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
8c10: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
8c20: 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  ..slot->protocol
8c30: 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a   = protocol;..}.
8c40: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8c50: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
8c60: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a   in success");..
8c70: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8c80: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
8c90: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
8ca0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
8cb0: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
8cc0: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8cd0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8ce0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
8cf0: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
8d00: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
8d10: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
8d20: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
8d30: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
8d40: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
8d50: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
8d60: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
8d70: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8d80: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
8d90: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
8da0: 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72  ES. *     The tr
8db0: 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  ansaction should
8dc0: 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75   be terminated u
8dd0: 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64  sing "cackey_end
8de0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a  _transaction". *
8df0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
8e00: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
8e10: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
8e20: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8e30: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
8e40: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
8e50: 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73  onn_ret;..LONG s
8e60: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a  card_trans_ret;.
8e70: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8e80: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
8e90: 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ;...cackey_conn_
8ea0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
8eb0: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
8ec0: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e  ..if (cackey_con
8ed0: 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
8ee0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
8ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8f00: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
8f10: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
8f20: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8f30: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8f40: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8f50: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
8f60: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8f70: 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth++;...if (slo
8f80: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8f90: 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f  epth > 1 && !slo
8fa0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
8fb0: 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09  eed_hw_lock) {..
8fc0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8fd0: 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e  INTF("Already in
8fe0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
8ff0: 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63  performing no ac
9000: 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20  tion (new depth 
9010: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
9020: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
9030: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9040: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
9050: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
9060: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
9070: 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f  ck = 0;...scard_
9080: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
9090: 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  dBeginTransactio
90a0: 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  n(slot->pcsc_car
90b0: 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  d);..if (scard_t
90c0: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
90d0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
90e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
90f0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
9100: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
9110: 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  n, returning in 
9120: 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75  error");....retu
9130: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
9140: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
9150: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9160: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
9170: 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69   began transacti
9180: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22  on on slot (%s)"
9190: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
91a0: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  der);...return(C
91b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
91c0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
91d0: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
91e0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64  y_ret cackey_end
91f0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
9200: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9210: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
9220: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
9230: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
9240: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
9250: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
9260: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
9270: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
9280: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
9290: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
92a0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
92b0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
92c0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
92d0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
92e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71  his function req
92f0: 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65  uires "cackey_be
9300: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  gin_transaction"
9310: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69   to be called fi
9320: 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  rst. *. */.stati
9330: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
9340: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
9350: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
9360: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
9370: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e  .LONG scard_tran
9380: 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  s_ret;...CACKEY_
9390: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
93a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
93b0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
93c0: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43  connected) {...C
93d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
93e0: 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20  TF("Card is not 
93f0: 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c  connected, unabl
9400: 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63  e to end transac
9410: 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a  tion on card");.
9420: 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
9430: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
9440: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
9450: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65  DEBUG_PRINTF("De
9460: 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63  creasing transac
9470: 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61  tion depth and a
9480: 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64  sking for a hard
9490: 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ware lock on the
94a0: 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e   next begin tran
94b0: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74  saction (current
94c0: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
94d0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
94e0: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f  _depth);.....slo
94f0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9500: 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28  epth--;.....if (
9510: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9520: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
9530: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
9540: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
9550: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a  k = 1;....}...}.
9560: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9570: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9580: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
9590: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
95a0: 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  th == 0) {...CAC
95b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
95c0: 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20  ("Terminating a 
95d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
95e0: 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22   has not begun!"
95f0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9600: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9610: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
9620: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9630: 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h--;...if (slot-
9640: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
9650: 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b  th > 0) {...CACK
9660: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9670: 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74  "Transactions st
9680: 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ill in progress,
9690: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67   not terminating
96a0: 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63   on-card Transac
96b0: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
96c0: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
96d0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
96e0: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
96f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
9700: 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72  );..}...scard_tr
9710: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ans_ret = SCardE
9720: 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  ndTransaction(sl
9730: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
9740: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
9750: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
9760: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
9770: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
9780: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9790: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e  TF("Unable to en
97a0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  d transaction, r
97b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
97c0: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
97d0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
97e0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
97f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9800: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72  "Sucessfully ter
9810: 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74  minated transact
9820: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
9830: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
9840: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
9850: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
9860: 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65  );.}../* APDU Re
9870: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
9880: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
9890: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
98a0: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
98b0: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
98c0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
98d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
98e0: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
98f0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
9900: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
9910: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
9920: 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  2, unsigned char
9930: 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   lc, unsigned ch
9940: 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e  ar *data, unsign
9950: 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74  ed char le, uint
9960: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
9970: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
9980: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
9990: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  *respdata_len);.
99a0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
99b0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
99c0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
99d0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
99e0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
99f0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9a00: 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20  char class. *   
9a10: 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73        APDU Class
9a20: 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53   (GSCIS_CLASS_IS
9a30: 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43  O7816 or GSCIS_C
9a40: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
9a50: 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20  FORM. *         
9a60: 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a  usually), (CLA).
9a70: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9a80: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
9a90: 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41  ion. *         A
9aa0: 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20  PDU Instruction 
9ab0: 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20  (INS). *. *     
9ac0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
9ad0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
9ae0: 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31   Parameter 1 (P1
9af0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
9b00: 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20  gned char p2. * 
9b10: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
9b20: 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a  ameter 2 (P2). *
9b30: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9b40: 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20   char lc. *     
9b50: 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20      APDU Length 
9b60: 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20  of Content (Lc) 
9b70: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
9b80: 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a  ength of "data".
9b90: 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d   *         param
9ba0: 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22  eter.  If "data"
9bb0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
9bc0: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61   NULL, this para
9bd0: 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20  meter will. *   
9be0: 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64        be ignored
9bf0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
9c00: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a  gned char *data.
9c10: 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74   *         Point
9c20: 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20  er to buffer to 
9c30: 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64  send.  It should
9c40: 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c   be "Lc" bytes l
9c50: 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ong.  If. *     
9c60: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
9c70: 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c   NULL, "Lc" will
9c80: 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e   not be sent, an
9c90: 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69  d this buffer wi
9ca0: 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20  ll be. *        
9cb0: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20   ignored.. *. * 
9cc0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9cd0: 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20  r le. *         
9ce0: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45  APDU Length of E
9cf0: 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20  xpectation (Le) 
9d00: 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  -- this is the l
9d10: 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20  ength of the. * 
9d20: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64          expected
9d30: 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73   reply.  If this
9d40: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
9d50: 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20   0 then it will 
9d60: 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62  not. *         b
9d70: 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20  e sent.. *. *   
9d80: 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70    uint16_t *resp
9d90: 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20  code. *         
9da0: 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f  [OUT] Pointer to
9db0: 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55   storage of APDU
9dc0: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20   response code. 
9dd0: 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20   If this is. *  
9de0: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
9df0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   as NULL, the re
9e00: 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c  sponse code will
9e10: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
9e20: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9e30: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
9e40: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
9e50: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
9e60: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
9e70: 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20  ponse data.  If 
9e80: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
9e90: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9ea0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9eb0: 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20  se data will be 
9ec0: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20  discarded.  If. 
9ed0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72  *         the "r
9ee0: 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72  espdata_len" par
9ef0: 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66  ameter is specif
9f00: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69  ied as NULL, thi
9f10: 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20  s buffer. *     
9f20: 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20      will not be 
9f30: 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20  updated.. *. *  
9f40: 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64     size_t *respd
9f50: 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  ata_len. *      
9f60: 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69     [IN, OUT] Poi
9f70: 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20  nter initialing 
9f80: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
9f90: 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70  ize of the "resp
9fa0: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20  data". *        
9fb0: 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65   buffer.  Before
9fc0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20   returning, the 
9fd0: 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65  pointed to value
9fe0: 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74   is updated to t
9ff0: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75  he. *         nu
a000: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
a010: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66  itten to the buf
a020: 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73  fer.  If this is
a030: 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a   specified as. *
a040: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69           NULL, i
a050: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  t will not be up
a060: 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70  dated, and "resp
a070: 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67  data" will be ig
a080: 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a  nored causing. *
a090: 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
a0a0: 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65  ponse data to be
a0b0: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
a0c0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
a0d0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
a0e0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  C_S_OK          
a0f0: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
a100: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
a110: 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e  _GENERIC      On
a120: 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41   error. *     CA
a130: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
a140: 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65 20  NABSENT  If the 
a150: 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62  sending failed b
a160: 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e  ecause the token
a170: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20   is. *          
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 20        absent. * 
a1a0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
a1b0: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 49  E_RETRY        I
a1c0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  f something that
a1d0: 20 6c 6f 6f 6b 73 20 72 65 74 72 79 27 61 62 6c   looks retry'abl
a1e0: 65 20 77 65 6e 74 0a 20 2a 20 20 20 20 20 20 20  e went. *       
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 20 2d           wrong -
a210: 2d 20 74 72 79 20 74 68 65 20 77 68 6f 6c 65 20  - try the whole 
a220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 76 65 72  transaction over
a230: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 20 20 20 61 67 61 69 6e 0a 20 2a 0a 20 2a 20 4e     again. *. * N
a260: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
a270: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63   function will c
a280: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43  onnect to the PC
a290: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
a2a0: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20  anager via. *   
a2b0: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f    cackey_pcsc_co
a2c0: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65  nnect() if neede
a2d0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20  d.. *. *     It 
a2e0: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
a2f0: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20  the card in the 
a300: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20  reader attached 
a310: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20  to the slot. *  
a320: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49     specified.  I
a330: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74  t will reconnect
a340: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20   to the card if 
a350: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
a360: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e  *     goes away.
a370: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
a380: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
a390: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
a3a0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
a3b0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
a3c0: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
a3d0: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
a3e0: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
a3f0: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
a400: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
a410: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e  d int lc, unsign
a420: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
a430: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20  nsigned int le, 
a440: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
a450: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
a460: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
a470: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
a480: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
a490: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
a4a0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
a4b0: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
a4c0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53  pdata_len;..LPCS
a4d0: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20  CARD_IO_REQUEST 
a4e0: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 53 43 41  pioSendPci;..SCA
a4f0: 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69  RD_IO_REQUEST pi
a500: 6f 52 65 63 76 50 63 69 3b 0a 09 44 57 4f 52 44  oRecvPci;..DWORD
a510: 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f   xmit_len, recv_
a520: 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
a530: 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64  _xmit_ret, scard
a540: 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59  _reconn_ret;..BY
a550: 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34  TE xmit_buf[1024
a560: 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34  ], recv_buf[1024
a570: 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  ];..int pcsc_con
a580: 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67  nect_ret, pcsc_g
a590: 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74  etresp_ret;..int
a5a0: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
a5b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
a5c0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
a5d0: 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  lot) {...CACKEY_
a5e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
a5f0: 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69  valid slot speci
a600: 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  fied.");....retu
a610: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a620: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
a630: 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a  if (respcode) {.
a640: 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 30 78  ..*respcode = 0x
a650: 66 66 66 66 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  ffff;..}...pcsc_
a660: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
a670: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
a680: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63  d(slot);..if (pc
a690: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
a6a0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
a6b0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
a6c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
a6d0: 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74  ble to connect t
a6e0: 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
a6f0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
a700: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
a710: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
a720: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
a730: 69 6e 65 20 77 68 69 63 68 20 70 72 6f 74 6f 63  ine which protoc
a740: 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73 69 6e 67  ol to send using
a750: 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 73 6c 6f   */..switch (slo
a760: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  t->protocol) {..
a770: 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54  .case SCARD_PROT
a780: 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 43 41 43 4b  OCOL_T0:....CACK
a790: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a7a0: 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e  "Protocol to sen
a7b0: 64 20 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d  d datagram is T=
a7c0: 30 22 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64  0");.....pioSend
a7d0: 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f  Pci = SCARD_PCI_
a7e0: 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  T0;.....break;..
a7f0: 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54  .case SCARD_PROT
a800: 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 43 41 43 4b  OCOL_T1:....CACK
a810: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a820: 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e  "Protocol to sen
a830: 64 20 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d  d datagram is T=
a840: 31 22 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64  1");.....pioSend
a850: 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f  Pci = SCARD_PCI_
a860: 54 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  T1;.....break;..
a870: 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43  .default:....CAC
a880: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a890: 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63  ("Invalid protoc
a8a0: 6f 6c 20 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69  ol found, aborti
a8b0: 6e 67 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ng.");.....retur
a8c0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
a8d0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
a8e0: 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78  * Transmit */..x
a8f0: 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d  mit_len = 0;..xm
a900: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a910: 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69  +] = class;..xmi
a920: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a930: 5d 20 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b  ] = instruction;
a940: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a950: 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d  len++] = p1;..xm
a960: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a970: 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61  +] = p2;..if (da
a980: 74 61 29 20 7b 0a 09 09 69 66 20 28 6c 63 20 3e  ta) {...if (lc >
a990: 20 32 35 35 29 20 7b 0a 09 09 09 43 41 43 4b 45   255) {....CACKE
a9a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a9b0: 43 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20  CAUTION!  Using 
a9c0: 61 6e 20 4c 63 20 67 72 65 61 74 65 72 20 74 68  an Lc greater th
a9d0: 61 6e 20 32 35 35 20 69 73 20 75 6e 74 65 73 74  an 255 is untest
a9e0: 65 64 2e 20 20 4c 63 20 3d 20 25 75 22 2c 20 6c  ed.  Lc = %u", l
a9f0: 63 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66  c);.....xmit_buf
aa00: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30  [xmit_len++] = 0
aa10: 78 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45  x82; /* XXX UNTE
aa20: 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f  STED */....xmit_
aa30: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
aa40: 3d 20 28 6c 63 20 26 20 30 78 66 66 30 30 29 20  = (lc & 0xff00) 
aa50: 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75  >> 8;....xmit_bu
aa60: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
aa70: 6c 63 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65  lc & 0xff;...} e
aa80: 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75  lse {....xmit_bu
aa90: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
aaa0: 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  lc;...}...for (i
aab0: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63  dx = 0; idx < lc
aac0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d  ; idx++) {....xm
aad0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
aae0: 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a  +] = data[idx];.
aaf0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20  ..}..}...if (le 
ab00: 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 69 66 20  != 0x00) {...if 
ab10: 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a 09 09 09  (le > 256) {....
ab20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ab30: 4e 54 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55  NTF("CAUTION!  U
ab40: 73 69 6e 67 20 61 6e 20 4c 65 20 67 72 65 61 74  sing an Le great
ab50: 65 72 20 74 68 61 6e 20 32 35 36 20 69 73 20 75  er than 256 is u
ab60: 6e 74 65 73 74 65 64 2e 20 20 4c 65 20 3d 20 25  ntested.  Le = %
ab70: 75 22 2c 20 6c 65 29 3b 0a 0a 09 09 09 78 6d 69  u", le);.....xmi
ab80: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
ab90: 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58  ] = 0x82; /* XXX
aba0: 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09   UNTESTED */....
abb0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
abc0: 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26 20 30 78 66  n++] = (le & 0xf
abd0: 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d  f00) >> 8;....xm
abe0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
abf0: 2b 5d 20 3d 20 6c 65 20 26 20 30 78 66 66 3b 0a  +] = le & 0xff;.
ac00: 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 65 20  ..} else if (le 
ac10: 3d 3d 20 32 35 36 29 20 7b 0a 09 09 09 78 6d 69  == 256) {....xmi
ac20: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
ac30: 5d 20 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c  ] = 0x00;...} el
ac40: 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  se {....xmit_buf
ac50: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
ac60: 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42  e;...}..}.../* B
ac70: 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54  egin Smartcard T
ac80: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
ac90: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
aca0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
acb0: 09 69 66 20 28 63 6c 61 73 73 20 3d 3d 20 47 53  .if (class == GS
acc0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
acd0: 36 20 26 26 20 28 69 6e 73 74 72 75 63 74 69 6f  6 && (instructio
ace0: 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52  n == GSCIS_INSTR
acf0: 5f 56 45 52 49 46 59 20 7c 7c 20 69 6e 73 74 72  _VERIFY || instr
ad00: 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f  uction == GSCIS_
ad10: 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46  INSTR_CHANGE_REF
ad20: 45 52 45 4e 43 45 29 20 26 26 20 70 31 20 3d 3d  ERENCE) && p1 ==
ad30: 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43 4b 45   0x00) {...CACKE
ad40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ad50: 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c  Sending APDU: <<
ad60: 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d  censored>>");..}
ad70: 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59   else {...CACKEY
ad80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
ad90: 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c  "Sending APDU:",
ada0: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
adb0: 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f  len);..}...recv_
adc0: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63  len = sizeof(rec
add0: 76 5f 62 75 66 29 3b 0a 09 6d 65 6d 63 70 79 28  v_buf);..memcpy(
ade0: 26 70 69 6f 52 65 63 76 50 63 69 2c 20 70 69 6f  &pioRecvPci, pio
adf0: 53 65 6e 64 50 63 69 2c 20 73 69 7a 65 6f 66 28  SendPci, sizeof(
ae00: 70 69 6f 52 65 63 76 50 63 69 29 29 3b 0a 09 73  pioRecvPci));..s
ae10: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
ae20: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
ae30: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70  ot->pcsc_card, p
ae40: 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f  ioSendPci, xmit_
ae50: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 26  buf, xmit_len, &
ae60: 70 69 6f 52 65 63 76 50 63 69 2c 20 72 65 63 76  pioRecvPci, recv
ae70: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
ae80: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
ae90: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 54 72  _PRINTF("SCardTr
aea0: 61 6e 73 6d 69 74 28 29 20 63 6f 6d 70 6c 65 74  ansmit() complet
aeb0: 65 64 20 77 69 74 68 20 76 61 6c 75 65 3a 20 25  ed with value: %
aec0: 73 2f 25 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  s/%lx", CACKEY_D
aed0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
aee0: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
aef0: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69  xmit_ret), (unsi
af00: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64  gned long) scard
af10: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 69 66  _xmit_ret);...if
af20: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
af30: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f   == SCARD_E_NOT_
af40: 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09  TRANSACTED) {...
af50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
af60: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
af70: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
af80: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
af90: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c  ) = %s/%lx), wil
afa0: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75  l ask calling fu
afb0: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20  nction to retry 
afc0: 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63  (not resetting c
afd0: 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  ard)...", CACKEY
afe0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
aff0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
b000: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
b010: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
b020: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
b030: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
b040: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
b050: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b060: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b070: 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 63 6f 6e  ....cackey_recon
b080: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
b090: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b  slot->protocol);
b0a0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b0b0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b  Y_PCSC_E_RETRY);
b0c0: 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f  ..}...if (scard_
b0d0: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52  xmit_ret == SCAR
b0e0: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 29 20  D_E_NO_SERVICE) 
b0f0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
b100: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
b110: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
b120: 63 61 72 64 2c 20 70 6f 73 73 69 62 6c 79 20 64  card, possibly d
b130: 75 65 20 74 6f 20 50 43 2f 53 43 20 68 61 6e 64  ue to PC/SC hand
b140: 6c 65 20 62 65 69 6e 67 20 69 6e 76 61 6c 69 64  le being invalid
b150: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
b160: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c  ) = %s/%lx), wil
b170: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75  l ask calling fu
b180: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 2e  nction to retry.
b190: 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
b1a0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
b1b0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
b1c0: 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65  t_ret), (unsigne
b1d0: 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d  d long) scard_xm
b1e0: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 63 61 63 6b  it_ret);....cack
b1f0: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
b200: 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74  et(slot);....ret
b210: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b220: 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69  E_RETRY);..}...i
b230: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
b240: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
b250: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
b260: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
b270: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
b280: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
b290: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
b2a0: 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%lx)", CACKEY_D
b2b0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
b2c0: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
b2d0: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69  xmit_ret), (unsi
b2e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64  gned long) scard
b2f0: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43  _xmit_ret);....C
b300: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b310: 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74  TF("Marking slot
b320: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
b330: 72 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b 65  reset");...cacke
b340: 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
b350: 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28  t(slot);....if (
b360: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
b370: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
b380: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
b390: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b3a0: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
b3b0: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
b3c0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
b3d0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
b3e0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
b3f0: 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  lot, SCARD_PROTO
b400: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
b410: 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a 0a 09 09  ROTOCOL_T1);....
b420: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
b430: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
b440: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
b450: 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72  switch (slot->pr
b460: 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63  otocol) {......c
b470: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
b480: 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70 69 6f  OL_T0:.......pio
b490: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
b4a0: 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62  PCI_T0;........b
b4b0: 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
b4c0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
b4d0: 31 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64  1:.......pioSend
b4e0: 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f  Pci = SCARD_PCI_
b4f0: 54 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  T1;........break
b500: 3b 0a 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a  ;......default:.
b510: 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
b520: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
b530: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
b540: 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74 65 20  d, but too late 
b550: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61  to do anything a
b560: 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74  bout it now -- t
b570: 72 79 69 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b  rying anyway.");
b580: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
b590: 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d  ...}....../* Re-
b5a0: 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61  establish transa
b5b0: 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73  ction, if it was
b5c0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09   present */.....
b5d0: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
b5e0: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
b5f0: 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72   {......slot->tr
b600: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
b610: 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  -;......slot->tr
b620: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
b630: 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09  w_lock = 1;.....
b640: 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
b650: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b660: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
b670: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b680: 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75  "Reset successfu
b690: 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74 74 69 6e  l, retransmittin
b6a0: 67 22 29 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c  g");......recv_l
b6b0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76  en = sizeof(recv
b6c0: 5f 62 75 66 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _buf);.....memcp
b6d0: 79 28 26 70 69 6f 52 65 63 76 50 63 69 2c 20 70  y(&pioRecvPci, p
b6e0: 69 6f 53 65 6e 64 50 63 69 2c 20 73 69 7a 65 6f  ioSendPci, sizeo
b6f0: 66 28 70 69 6f 52 65 63 76 50 63 69 29 29 3b 0a  f(pioRecvPci));.
b700: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  ....scard_xmit_r
b710: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
b720: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
b730: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  rd, pioSendPci, 
b740: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
b750: 65 6e 2c 20 26 70 69 6f 52 65 63 76 50 63 69 2c  en, &pioRecvPci,
b760: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
b770: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
b780: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21  scard_xmit_ret !
b790: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
b7a0: 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
b7b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b7c0: 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64  etransmit failed
b7d0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b7e0: 61 69 6c 75 72 65 20 61 66 74 65 72 20 64 69 73  ailure after dis
b7f0: 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63  connecting the c
b800: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
b810: 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43  it = %s/%li)", C
b820: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b830: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
b840: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
b850: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  , (long) scard_x
b860: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09  mit_ret);.......
b870: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
b880: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
b890: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
b8a0: 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70  D);......slot->p
b8b0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
b8c0: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a  ed = 0;......./*
b8d0: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
b8e0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
b8f0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
b900: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
b910: 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  .....cackey_end_
b920: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b930: 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
b940: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
b950: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
b960: 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
b970: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b980: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
b990: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
b9a0: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
b9b0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
b9c0: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
b9d0: 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e  ARD);.....slot->
b9e0: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
b9f0: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a  ted = 0;....../*
ba00: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
ba10: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
ba20: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ba30: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
ba40: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
ba50: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
ba60: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ba70: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
ba80: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
ba90: 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
baa0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
bab0: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09  NABSENT);....}..
bac0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
bad0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bae0: 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  ("Disconnecting 
baf0: 63 61 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72  card");.....SCar
bb00: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
bb10: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
bb20: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
bb30: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
bb40: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
bb50: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
bb60: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
bb70: 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74  on */....slot->t
bb80: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
bb90: 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 1;....cackey_
bba0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
bbb0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45  slot);.....CACKE
bbc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bbd0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
bbe0: 6c 75 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72  lure");....retur
bbf0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
bc00: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
bc10: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
bc20: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65  BUG_PRINTBUF("Re
bc30: 74 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20  turned Value:", 
bc40: 72 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c  recv_buf, recv_l
bc50: 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f  en);...if (recv_
bc60: 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20  len < 2) {.../* 
bc70: 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65  Minimal response
bc80: 20 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79 74   length is 2 byt
bc90: 65 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  es, returning in
bca0: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41   failure */...CA
bcb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bcc0: 46 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20  F("Response too 
bcd0: 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67  small, returning
bce0: 20 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63   in failure (rec
bcf0: 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28  v_len = %lu)", (
bd00: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
bd10: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20  ecv_len);..../* 
bd20: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
bd30: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
bd40: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
bd50: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
bd60: 2f 2a 20 53 75 70 70 6c 79 20 61 6e 20 69 6e 76  /* Supply an inv
bd70: 61 6c 69 64 20 72 65 73 70 6f 6e 73 65 20 63 6f  alid response co
bd80: 64 65 20 2a 2f 0a 09 09 69 66 20 28 72 65 73 70  de */...if (resp
bd90: 63 6f 64 65 29 20 7b 0a 09 09 09 2a 72 65 73 70  code) {....*resp
bda0: 63 6f 64 65 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09  code = 0;...}...
bdb0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
bdc0: 43 53 43 5f 45 5f 4e 4f 44 41 54 41 29 3b 0a 09  CSC_E_NODATA);..
bdd0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
bde0: 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   result code */.
bdf0: 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76  .major_rc = recv
be00: 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20  _buf[recv_len - 
be10: 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20  2];..minor_rc = 
be20: 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65  recv_buf[recv_le
be30: 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73  n - 1];..if (res
be40: 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70  pcode) {...*resp
be50: 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63  code = (major_rc
be60: 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72   << 8) | minor_r
be70: 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73  c;..}.../* Adjus
be80: 74 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72  t message buffer
be90: 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d   */..recv_len -=
bea0: 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74   2;.../* Add byt
beb0: 65 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c  es to return val
bec0: 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64  ue */..tmp_respd
bed0: 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66  ata_len = 0;..if
bee0: 20 28 72 65 73 70 64 61 74 61 20 26 26 20 72 65   (respdata && re
bef0: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
bf00: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
bf10: 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e   = *respdata_len
bf20: 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f  ;....bytes_to_co
bf30: 70 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c  py = *respdata_l
bf40: 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f  en;....if (recv_
bf50: 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63  len < bytes_to_c
bf60: 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  opy) {....bytes_
bf70: 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c  to_copy = recv_l
bf80: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  en;...}....CACKE
bf90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bfa0: 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65  Copying %lu byte
bfb0: 73 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  s to the buffer 
bfc0: 28 72 65 63 76 27 64 20 25 6c 75 20 62 79 74 65  (recv'd %lu byte
bfd0: 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20  s, but only %lu 
bfe0: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75  bytes left in ou
bff0: 72 20 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73  r buffer)", (uns
c000: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65  igned long) byte
c010: 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69  s_to_copy, (unsi
c020: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f  gned long) recv_
c030: 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
c040: 6f 6e 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c  ong) *respdata_l
c050: 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72  en);....memcpy(r
c060: 65 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75  espdata, recv_bu
c070: 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  f, bytes_to_copy
c080: 29 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d  );...respdata +=
c090: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
c0a0: 0a 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  ...*respdata_len
c0b0: 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   = bytes_to_copy
c0c0: 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61  ;...tmp_respdata
c0d0: 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  _len -= bytes_to
c0e0: 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b  _copy;..} else {
c0f0: 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20  ...if (recv_len 
c100: 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
c110: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c120: 54 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c  Throwing away %l
c130: 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65  u bytes, nowhere
c140: 20 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20   to put them!", 
c150: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c160: 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09  recv_len);...}..
c170: 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  }...if (major_rc
c180: 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a   == 0x61) {.../*
c190: 20 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44   We need to READ
c1a0: 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
c1b0: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
c1c0: 72 20 72 65 61 64 20 72 65 71 75 69 72 65 64 22  r read required"
c1d0: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f  );....if (minor_
c1e0: 72 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  rc == 0x00) {...
c1f0: 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b  .minor_rc = CACK
c200: 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d  EY_APDU_MTU;...}
c210: 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73 70  ....pcsc_getresp
c220: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
c230: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
c240: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
c250: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47  6, GSCIS_INSTR_G
c260: 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30  ET_RESPONSE, 0x0
c270: 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c  0, 0x00, 0, NULL
c280: 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70  , minor_rc, resp
c290: 63 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20  code, respdata, 
c2a0: 26 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  &tmp_respdata_le
c2b0: 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63 73 63 5f  n);....if (pcsc_
c2c0: 67 65 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43  getresp_ret != C
c2d0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c2e0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
c2f0: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
c300: 72 20 72 65 61 64 20 66 61 69 6c 65 64 21 20 20  r read failed!  
c310: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
c320: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45  lure");...../* E
c330: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
c340: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
c350: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
c360: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
c370: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
c380: 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  p_ret == CACKEY_
c390: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
c3a0: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
c3b0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b  Y_PCSC_E_RETRY);
c3c0: 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
c3d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
c3e0: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
c3f0: 69 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e  if (respdata_len
c400: 29 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61  ) {....*respdata
c410: 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70  _len += tmp_resp
c420: 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  data_len;...}...
c430: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
c440: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
c450: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
c460: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
c470: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c480: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
c490: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 62  ng in success (b
c4a0: 75 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c  uffer read compl
c4b0: 65 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e  ete)");...return
c4c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
c4d0: 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20  K);..}.../* End 
c4e0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
c4f0: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
c500: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
c510: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61  (slot);...if (ma
c520: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20  jor_rc == 0x90) 
c530: 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a  {.../* Success *
c540: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
c550: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
c560: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d  ng in success (m
c570: 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22  ajor_rc = 0x90)"
c580: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
c590: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
c5a0: 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
c5b0: 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20  UG_PRINTF("APDU 
c5c0: 52 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  Returned an erro
c5d0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
c5e0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74  failure");...ret
c5f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c600: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 73  E_GENERIC);.}..s
c610: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
c620: 68 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  har *cackey_read
c630: 5f 62 65 72 74 6c 76 5f 74 61 67 28 75 6e 73 69  _bertlv_tag(unsi
c640: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c650: 72 2c 20 73 69 7a 65 5f 74 20 2a 62 75 66 66 65  r, size_t *buffe
c660: 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69 67 6e 65  r_len_p, unsigne
c670: 64 20 63 68 61 72 20 74 61 67 2c 20 75 6e 73 69  d char tag, unsi
c680: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
c690: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 6f 75  ffer, size_t *ou
c6a0: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 29 20 7b  tbuffer_len_p) {
c6b0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
c6c0: 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65  *buffer_p;..size
c6d0: 5f 74 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  _t outbuffer_len
c6e0: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 73  , buffer_len;..s
c6f0: 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 09 69 6e 74  ize_t size;..int
c700: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
c710: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
c720: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 62 75  led.");...if (bu
c730: 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55  ffer_len_p == NU
c740: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
c750: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66  EBUG_PRINTF("buf
c760: 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c  fer_len_p is NUL
c770: 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  L.  Returning in
c780: 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09   failure.");....
c790: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
c7a0: 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 66 65 72  ...if (outbuffer
c7b0: 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  _len_p == NULL) 
c7c0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c7d0: 5f 50 52 49 4e 54 46 28 22 6f 75 74 62 75 66 66  _PRINTF("outbuff
c7e0: 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c  er_len_p is NULL
c7f0: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
c800: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
c810: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c820: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a  ..buffer_len = *
c830: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b  outbuffer_len_p;
c840: 0a 09 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 20  ..outbuffer_len 
c850: 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  = *outbuffer_len
c860: 5f 70 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72  _p;...if (buffer
c870: 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41  _len < 2) {...CA
c880: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c890: 46 28 22 62 75 66 66 65 72 5f 6c 65 6e 20 69 73  F("buffer_len is
c8a0: 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20 73 6f   less than 2, so
c8b0: 20 77 65 20 63 61 6e 27 74 20 72 65 61 64 20 61   we can't read a
c8c0: 6e 79 20 74 61 67 2e 20 20 52 65 74 75 72 6e 69  ny tag.  Returni
c8d0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c8e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c8f0: 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70  );..}...buffer_p
c900: 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66 20 28   = buffer;..if (
c910: 62 75 66 66 65 72 5f 70 5b 30 5d 20 21 3d 20 74  buffer_p[0] != t
c920: 61 67 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ag) {...CACKEY_D
c930: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
c940: 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f 74 20 74   found was not t
c950: 61 67 20 65 78 70 65 63 74 65 64 2e 20 20 54 61  ag expected.  Ta
c960: 67 20 3d 20 25 30 32 78 2c 20 45 78 70 65 63 74  g = %02x, Expect
c970: 65 64 20 3d 20 25 30 32 78 2e 20 20 52 65 74 75  ed = %02x.  Retu
c980: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c990: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  .", (unsigned in
c9a0: 74 29 20 62 75 66 66 65 72 5f 70 5b 30 5d 2c 20  t) buffer_p[0], 
c9b0: 74 61 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tag);....return(
c9c0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66  NULL);..}...buff
c9d0: 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f  er_p++;..buffer_
c9e0: 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28 62 75  len--;...if ((bu
c9f0: 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78 38 30  ffer_p[0] & 0x80
ca00: 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09 09 73  ) == 0x80) {...s
ca10: 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78 20 3d  ize = 0;...idx =
ca20: 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26 20   (buffer_p[0] & 
ca30: 30 78 37 66 29 3b 0a 0a 09 09 69 66 20 28 69 64  0x7f);....if (id
ca40: 78 20 3e 20 62 75 66 66 65 72 5f 6c 65 6e 29 20  x > buffer_len) 
ca50: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
ca60: 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72  G_PRINTF("Malfor
ca70: 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20 2d 2d  med BER value --
ca80: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
ca90: 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 72  s available to r
caa0: 65 61 64 20 6c 65 6e 67 74 68 20 28 69 64 78 20  ead length (idx 
cab0: 3d 20 25 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e  = %i, buffer_len
cac0: 20 3d 20 25 6c 75 29 22 2c 20 69 64 78 2c 20 28   = %lu)", idx, (
cad0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
cae0: 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 09  uffer_len);.....
caf0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09  return(NULL);...
cb00: 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64 78 20  }....for (; idx 
cb10: 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09  > 0; idx--) {...
cb20: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09  .buffer_p++;....
cb30: 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09  buffer_len--;...
cb40: 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09  ..size <<= 8;...
cb50: 09 73 69 7a 65 20 7c 3d 20 62 75 66 66 65 72 5f  .size |= buffer_
cb60: 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  p[0];...}..} els
cb70: 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20 62 75 66  e {...size = buf
cb80: 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a 09 62  fer_p[0];..}...b
cb90: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66  uffer_p++;..buff
cba0: 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28  er_len--;...if (
cbb0: 73 69 7a 65 20 3e 20 6f 75 74 62 75 66 66 65 72  size > outbuffer
cbc0: 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  _len) {...CACKEY
cbd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
cbe0: 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79 20 76 61  nable to copy va
cbf0: 6c 75 65 20 62 75 66 66 65 72 20 74 6f 20 6f 75  lue buffer to ou
cc00: 74 62 75 66 66 65 72 2c 20 6e 6f 74 20 65 6e 6f  tbuffer, not eno
cc10: 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61 6c 75 65  ugh room.  Value
cc20: 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d   buffer length =
cc30: 20 25 6c 75 2c 20 6f 75 74 20 62 75 66 66 65 72   %lu, out buffer
cc40: 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20   length = %lu", 
cc50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
cc60: 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  size, (unsigned 
cc70: 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66 65 72 5f  long) outbuffer_
cc80: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
cc90: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f 75 74  NULL);..}...*out
cca0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 73  buffer_len_p = s
ccb0: 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74 62 75 66  ize;..if (outbuf
ccc0: 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  fer) {...memcpy(
ccd0: 6f 75 74 62 75 66 66 65 72 2c 20 62 75 66 66 65  outbuffer, buffe
cce0: 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75  r_p, size);...bu
ccf0: 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a 65 3b 0a  ffer_p += size;.
cd00: 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 2d 3d 20  ..buffer_len -= 
cd10: 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66 66 65 72  size;....*buffer
cd20: 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66 65 72 5f  _len_p = buffer_
cd30: 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  len;....CACKEY_D
cd40: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 42  EBUG_PRINTBUF("B
cd50: 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a 22  ER-TLV results:"
cd60: 2c 20 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a  , outbuffer, siz
cd70: 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  e);..} else {...
cd80: 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c 20  memmove(buffer, 
cd90: 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b  buffer_p, size);
cda0: 0a 09 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75  ...buffer_p = bu
cdb0: 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ffer;....CACKEY_
cdc0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
cdd0: 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a  BER-TLV results:
cde0: 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 29  ", buffer, size)
cdf0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
ce00: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
ce10: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
ce20: 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f 6e 74 65  .  Size of conte
ce30: 6e 74 73 20 66 6f 72 20 74 61 67 20 25 30 32 78  nts for tag %02x
ce40: 20 69 73 20 25 6c 75 22 2c 20 28 75 6e 73 69 67   is %lu", (unsig
ce50: 6e 65 64 20 69 6e 74 29 20 74 61 67 2c 20 28 75  ned int) tag, (u
ce60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
ce70: 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75  ze);...return(bu
ce80: 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20  ffer_p);.}../*. 
ce90: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
cea0: 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79    ssize_t cackey
ceb0: 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75 63 74  _get_data(struct
cec0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
ced0: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
cee0: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
cef0: 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e  t buffer_len, un
cf00: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b  signed char oid[
cf10: 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  3]);. *. * ARGUM
cf20: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
cf30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cf40: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
cf50: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
cf60: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
cf70: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cf80: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
cf90: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
cfa0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
cfb0: 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a 20 2a 20  t buffer_len. * 
cfc0: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
cfd0: 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d  f bytes to attem
cfe0: 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a  pt to read. *. *
cff0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
d000: 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20 20 20 20  ar oid[3]. *    
d010: 20 20 20 20 20 33 2d 62 79 74 65 20 4f 49 44 20       3-byte OID 
d020: 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 0a 20 2a  to read. *. *. *
d030: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
d040: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
d050: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
d060: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
d070: 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72  ctually read, or
d080: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a   -1 on error.. *
d090: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
d0a0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
d0b0: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
d0c0: 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75  ey_get_data(stru
d0d0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d0e0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
d0f0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
d100: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
d110: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69  unsigned char oi
d120: 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67 6e 65  d[3]) {..unsigne
d130: 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d 20 7b  d char cmd[] = {
d140: 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78 30 30  0x5C, 0x03, 0x00
d150: 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 09  , 0x00, 0x00};..
d160: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d170: 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74  uffer_p;..size_t
d180: 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e   init_buffer_len
d190: 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74 31 36 5f  , size;..uint16_
d1a0: 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74  t respcode;..int
d1b0: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
d1c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d1d0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
d1e0: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 20 3d  nit_buffer_len =
d1f0: 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 63   buffer_len;...c
d200: 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a  md[2] = oid[0];.
d210: 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d  .cmd[3] = oid[1]
d220: 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b  ;..cmd[4] = oid[
d230: 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74 6f 20  2];.../* 256 to 
d240: 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c 61 72  indicate the lar
d250: 67 65 73 74 20 6d 65 73 73 61 67 65 20 73 69 7a  gest message siz
d260: 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72 20 69  e -- not clear i
d270: 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f 72 6b  f this will work
d280: 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73 61 67   with all messag
d290: 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20  es */..send_ret 
d2a0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
d2b0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
d2c0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49  LASS_ISO7816, NI
d2d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
d2e0: 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30 78 33  TR_GET_DATA, 0x3
d2f0: 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f 66 28  F, 0xFF, sizeof(
d300: 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36 2c 20  cmd), cmd, 256, 
d310: 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65  &respcode, buffe
d320: 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 29 3b  r, &buffer_len);
d330: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d340: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
d350: 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b  _RETRY) {...CACK
d360: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d370: 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61  "ADPU Sending fa
d380: 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72  iled, retrying r
d390: 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09  ead buffer");...
d3a0: 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 67  .return(cackey_g
d3b0: 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62 75  et_data(slot, bu
d3c0: 66 66 65 72 2c 20 69 6e 69 74 5f 62 75 66 66 65  ffer, init_buffe
d3d0: 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a 09 7d  r_len, oid));..}
d3e0: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d3f0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
d400: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
d410: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
d420: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29  ckey_send_apdu()
d430: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
d440: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
d450: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
d460: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
d470: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
d480: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
d490: 5f 4d 41 58 0a 09 69 66 20 28 62 75 66 66 65 72  _MAX..if (buffer
d4a0: 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53  _len > _POSIX_SS
d4b0: 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
d4c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d4d0: 28 22 52 65 61 64 20 62 79 74 65 73 20 28 62 75  ("Read bytes (bu
d4e0: 66 66 65 72 5f 6c 65 6e 29 20 65 78 63 65 65 64  ffer_len) exceed
d4f0: 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
d500: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d510: 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
d520: 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20  i, buffer_len = 
d530: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
d540: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
d550: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d560: 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09  buffer_len);....
d570: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
d580: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
d590: 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20  .if (buffer_len 
d5a0: 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 2) {...CACKEY_
d5b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
d5c0: 44 55 20 47 45 54 20 44 41 54 41 20 72 65 74 75  DU GET DATA retu
d5d0: 72 6e 65 64 20 25 6c 75 20 62 79 74 65 73 2c 20  rned %lu bytes, 
d5e0: 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f  which is too sho
d5f0: 72 74 20 66 6f 72 20 61 20 42 45 52 2d 54 4c 56  rt for a BER-TLV
d600: 20 72 65 73 70 6f 6e 73 65 22 2c 20 28 75 6e 73   response", (uns
d610: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66  igned long) buff
d620: 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  er_len);....retu
d630: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 69 7a  rn(-1);..}...siz
d640: 65 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a  e = buffer_len;.
d650: 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b  .buffer_p = cack
d660: 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74  ey_read_bertlv_t
d670: 61 67 28 62 75 66 66 65 72 2c 20 26 62 75 66 66  ag(buffer, &buff
d680: 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20 4e 55  er_len, 0x53, NU
d690: 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09 69 66  LL, &size);...if
d6a0: 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55   (buffer_p == NU
d6b0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
d6c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
d6d0: 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c 65 64   decoding failed
d6e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
d6f0: 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65 74 75  rror.");....retu
d700: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43 41 43  rn(-1);..}...CAC
d710: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
d720: 55 46 28 22 47 45 54 20 44 41 54 41 20 72 65 73  UF("GET DATA res
d730: 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20 73 69  ult", buffer, si
d740: 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ze);...CACKEY_DE
d750: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
d760: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
d770: 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73  , read %lu bytes
d780: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
d790: 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75  g) size);...retu
d7a0: 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(size);.}../*.
d7b0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d7c0: 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65     ssize_t cacke
d7d0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
d7e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
d7f0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
d800: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
d810: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
d820: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
d830: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
d840: 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a  l_offset);. *. *
d850: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
d860: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
d870: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
d880: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
d890: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
d8a0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
d8b0: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20  d char *buffer. 
d8c0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
d8d0: 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20  Buffer. *. *    
d8e0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a   size_t count. *
d8f0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
d900: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65  of bytes to atte
d910: 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20  mpt to read. *. 
d920: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
d930: 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20  har t_or_v. *   
d940: 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68 65        Select the
d950: 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20 6f   T-buffer (01) o
d960: 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29 20  r V-buffer (02) 
d970: 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a  to read from.  .
d980: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
d990: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a   initial_offset.
d9a0: 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63 69   *         Speci
d9b0: 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  fy the offset to
d9c0: 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64 20   begin the read 
d9d0: 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45  from. *. *. * RE
d9e0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
d9f0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
da00: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
da10: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
da20: 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31  ally read, or -1
da30: 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a   on error.. *. *
da40: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
da50: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
da60: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
da70: 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75  read_buffer(stru
da80: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
da90: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
daa0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
dab0: 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67  e_t count, unsig
dac0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c  ned char t_or_v,
dad0: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f   size_t initial_
dae0: 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73 69 67  offset) {..unsig
daf0: 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74 5f 62  ned char *init_b
db00: 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20 69  uffer;..size_t i
db10: 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a 65  nit_count;..size
db20: 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f  _t init_initial_
db30: 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f 74  offset;...size_t
db40: 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78   offset = 0, max
db50: 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75  _offset, max_cou
db60: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  nt;..unsigned ch
db70: 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74  ar cmd[2];..uint
db80: 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
db90: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
dba0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dbb0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
dbc0: 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20 3d 20  ..init_buffer = 
dbd0: 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63 6f  buffer;..init_co
dbe0: 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e  unt = count;..in
dbf0: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
dc00: 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  t = initial_offs
dc10: 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74  et;...max_offset
dc20: 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63   = count;..max_c
dc30: 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41 50  ount = CACKEY_AP
dc40: 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f  DU_MTU;...if (t_
dc50: 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f  or_v != 1 && t_o
dc60: 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41  r_v != 2) {...CA
dc70: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dc80: 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20  F("Invalid T or 
dc90: 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  V parameter spec
dca0: 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ified, returning
dcb0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
dcc0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
dcd0: 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72  ...cmd[0] = t_or
dce0: 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20  _v;...while (1) 
dcf0: 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e  {...if (offset >
dd00: 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a  = max_offset) {.
dd10: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dd20: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 74  PRINTF("Buffer t
dd30: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e  oo small, return
dd40: 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e  ing what we got.
dd50: 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  ..");.....break;
dd60: 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20  ...}....count = 
dd70: 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66  max_offset - off
dd80: 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74  set;...if (count
dd90: 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a   > max_count) {.
dda0: 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63  ...count = max_c
ddb0: 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64  ount;...}....cmd
ddc0: 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  [1] = count;....
ddd0: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
dde0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
ddf0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
de00: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
de10: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
de20: 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61  BUFFER, ((initia
de30: 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65  l_offset + offse
de40: 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c  t) >> 8) & 0xff,
de50: 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74   (initial_offset
de60: 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78 66   + offset) & 0xf
de70: 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  f, sizeof(cmd), 
de80: 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70  cmd, 0x00, &resp
de90: 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f  code, buffer + o
dea0: 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a  ffset, &count);.
deb0: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
dec0: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
ded0: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43 41 43  _RETRY) {....CAC
dee0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
def0: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
df00: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
df10: 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a 0a  read buffer");..
df20: 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
df30: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
df40: 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 2c 20  t, init_buffer, 
df50: 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72  init_count, t_or
df60: 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c  _v, init_initial
df70: 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a 0a  _offset));...}..
df80: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
df90: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
dfa0: 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73  OK) {....if (res
dfb0: 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29  pcode == 0x6A86)
dfc0: 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63   {.....if (max_c
dfd0: 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09  ount == 1) {....
dfe0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
dff0: 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  ....max_count = 
e000: 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a  max_count / 2;..
e010: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
e020: 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
e030: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
e040: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66  ey_send_apdu() f
e050: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
e060: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e070: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
e080: 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20  .}....offset += 
e090: 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f  count;....if (co
e0a0: 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29  unt < max_count)
e0b0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
e0c0: 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74  UG_PRINTF("Short
e0d0: 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d   read -- count =
e0e0: 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69   %i, cmd[1] = %i
e0f0: 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20  ", (int) count, 
e100: 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a  (int) cmd[1]);..
e110: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
e120: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
e130: 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
e140: 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
e150: 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e  AX..if (offset >
e160: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
e170: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
e180: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
e190: 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  et exceeds maxim
e1a0: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
e1b0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
e1c0: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73  (max = %li, offs
e1d0: 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  et = %lu)", (lon
e1e0: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
e1f0: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
e200: 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09  ong) offset);...
e210: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
e220: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
e230: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e240: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
e250: 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61   in success, rea
e260: 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75  d %lu bytes", (u
e270: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
e280: 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  fset);...return(
e290: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  offset);.}../*. 
e2a0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
e2b0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
e2c0: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
e2d0: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
e2e0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
e2f0: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20  gned char *aid, 
e300: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b  size_t aid_len);
e310: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
e320: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
e330: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
e340: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
e350: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
e360: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
e370: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
e380: 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75 66  d. *         Buf
e390: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41  fer containing A
e3a0: 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65  pplet ID to sele
e3b0: 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  ct. *. *     siz
e3c0: 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20  e_t aid_len. *  
e3d0: 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66         Number of
e3e0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22 61   bytes in the "a
e3f0: 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29 20  id" (Applet ID) 
e400: 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20  parameter. *. * 
e410: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
e420: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
e430: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
e440: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
e450: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
e460: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
e470: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
e480: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
e490: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
e4a0: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
e4b0: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
e4c0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
e4d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e4e0: 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f  aid, size_t aid_
e4f0: 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64  len) {..int send
e500: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
e510: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e520: 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
e530: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
e540: 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65  "Selecting apple
e550: 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65  t:", aid, aid_le
e560: 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d  n);...send_ret =
e570: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
e580: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
e590: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
e5a0: 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c  IS_INSTR_SELECT,
e5b0: 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c   GSCIS_PARAM_SEL
e5c0: 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 30  ECT_APPLET, 0x00
e5d0: 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20  , aid_len, aid, 
e5e0: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
e5f0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73  , NULL);...if (s
e600: 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
e610: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20  Y_PCSC_E_RETRY) 
e620: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
e630: 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65  _PRINTF("ADPU Se
e640: 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65  nding failed, re
e650: 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20 61 70  trying select ap
e660: 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  plet");....retur
e670: 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  n(cackey_select_
e680: 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69 64  applet(slot, aid
e690: 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a  , aid_len));..}.
e6a0: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
e6b0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
e6c0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
e6d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
e6e0: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c  led to open appl
e6f0: 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  et, returning in
e700: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e710: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e720: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
e730: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e740: 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66  PRINTF("Successf
e750: 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69  ully selected fi
e760: 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  le");...return(C
e770: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
e780: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
e790: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
e7a0: 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 63  y_pcsc_id_type c
e7b0: 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64  ackey_detect_and
e7c0: 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70  _select_root_app
e7d0: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
e7e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 63 61  y_slot *slot, ca
e7f0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
e800: 65 20 74 79 70 65 5f 68 69 6e 74 29 3b 0a 20 2a  e type_hint);. *
e810: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
e820: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
e830: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
e840: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
e850: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
e860: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 63 61 63 6b  o. *. *     cack
e870: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
e880: 74 79 70 65 5f 68 69 6e 74 0a 20 2a 20 20 20 20  type_hint. *    
e890: 20 20 20 20 20 41 20 68 69 6e 74 20 61 73 20 74       A hint as t
e8a0: 6f 20 77 68 69 63 68 20 74 79 70 65 20 6f 66 20  o which type of 
e8b0: 63 61 72 64 20 6d 69 67 68 74 20 62 65 20 69 6e  card might be in
e8c0: 20 74 68 69 73 20 73 6c 6f 74 20 28 43 41 43 20   this slot (CAC 
e8d0: 6f 72 20 50 49 56 29 0a 20 2a 0a 20 2a 20 52 45  or PIV). *. * RE
e8e0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
e8f0: 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45    CACKEY_ID_TYPE
e900: 5f 50 49 56 20 20 20 20 20 20 20 49 66 20 74 68  _PIV       If th
e910: 65 20 63 61 72 64 20 63 6f 6e 6e 65 63 74 65 64  e card connected
e920: 20 69 73 20 61 20 50 49 56 0a 20 2a 20 20 20 20   is a PIV. *    
e930: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
e940: 43 41 43 20 20 20 20 20 20 20 49 66 20 74 68 65  CAC       If the
e950: 20 63 61 72 64 20 63 6f 6e 6e 65 63 74 65 64 20   card connected 
e960: 69 73 20 61 20 43 41 43 20 77 69 74 68 20 74 68  is a CAC with th
e970: 65 20 43 43 43 0a 20 2a 20 20 20 20 20 20 20 20  e CCC. *        
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 61 70 70 6c 65 74 0a 20 2a 20        applet. * 
e9a0: 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59      CACKEY_ID_TY
e9b0: 50 45 5f 45 52 52 4f 52 20 20 20 20 20 49 66 20  PE_ERROR     If 
e9c0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
e9d0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   determine what 
e9e0: 74 79 70 65 20 6f 66 20 63 61 72 64 0a 20 2a 20  type of card. * 
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
ea10: 63 6f 6e 6e 65 63 74 65 64 0a 20 2a 0a 20 2a 20  connected. *. * 
ea20: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
ea30: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 65 6c  s function resel
ea40: 65 63 74 73 20 74 68 65 20 22 72 6f 6f 74 22 20  ects the "root" 
ea50: 61 70 70 6c 65 74 2c 20 61 66 74 65 72 20 74 68  applet, after th
ea60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ea70: 61 6c 6c 65 64 0a 20 2a 20 20 20 20 20 74 68 65  alled. *     the
ea80: 20 75 73 65 72 20 6d 61 79 20 62 65 20 72 65 71   user may be req
ea90: 75 69 72 65 64 20 74 6f 20 6c 6f 67 69 6e 20 61  uired to login a
eaa0: 67 61 69 6e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  gain. *. */.stat
eab0: 69 63 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ic cackey_pcsc_i
eac0: 64 5f 74 79 70 65 20 63 61 63 6b 65 79 5f 64 65  d_type cackey_de
ead0: 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f  tect_and_select_
eae0: 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 74 72 75  root_applet(stru
eaf0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
eb00: 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 70 63 73  slot, cackey_pcs
eb10: 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f 68  c_id_type type_h
eb20: 69 6e 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  int) {..unsigned
eb30: 20 63 68 61 72 20 63 61 63 5f 63 63 63 5f 61 69   char cac_ccc_ai
eb40: 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44  d[] = {GSCIS_AID
eb50: 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _CCC};..unsigned
eb60: 20 63 68 61 72 20 63 61 63 5f 69 64 30 5f 61 69   char cac_id0_ai
eb70: 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44  d[] = {GSCIS_AID
eb80: 5f 49 44 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _ID0};..unsigned
eb90: 20 63 68 61 72 20 70 69 76 5f 61 69 64 5b 5d 20   char piv_aid[] 
eba0: 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  = {NISTSP800_73_
ebb0: 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 63 61 63  3_PIV_AID};..cac
ebc0: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
ebd0: 20 74 72 79 5f 74 79 70 65 73 5b 32 5d 2c 20 74   try_types[2], t
ebe0: 72 79 5f 74 79 70 65 3b 0a 09 69 6e 74 20 73 65  ry_type;..int se
ebf0: 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78  nd_ret;..int idx
ec00: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
ec10: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 6c 65 63  _PRINTF("Reselec
ec20: 74 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 61 70  ting the root ap
ec30: 70 6c 65 74 22 29 3b 0a 0a 09 69 66 20 28 74 79  plet");...if (ty
ec40: 70 65 5f 68 69 6e 74 20 3d 3d 20 43 41 43 4b 45  pe_hint == CACKE
ec50: 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57  Y_ID_TYPE_UNKNOW
ec60: 4e 29 20 7b 0a 09 09 74 79 70 65 5f 68 69 6e 74  N) {...type_hint
ec70: 20 3d 20 73 6c 6f 74 2d 3e 69 64 5f 74 79 70 65   = slot->id_type
ec80: 5f 68 69 6e 74 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  _hint;..}...slot
ec90: 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e 74 20 3d  ->id_type_hint =
eca0: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
ecb0: 55 4e 4b 4e 4f 57 4e 3b 0a 0a 09 73 77 69 74 63  UNKNOWN;...switc
ecc0: 68 20 28 74 79 70 65 5f 68 69 6e 74 29 20 7b 0a  h (type_hint) {.
ecd0: 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
ece0: 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 43 41  _TYPE_PIV:....CA
ecf0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ed00: 46 28 22 54 72 79 69 6e 67 20 74 6f 20 72 65 73  F("Trying to res
ed10: 65 6c 65 63 74 20 74 68 65 20 50 49 56 20 72 6f  elect the PIV ro
ed20: 6f 74 20 61 70 70 6c 65 74 20 66 69 72 73 74 22  ot applet first"
ed30: 29 3b 0a 0a 09 09 09 74 72 79 5f 74 79 70 65 73  );.....try_types
ed40: 5b 30 5d 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f  [0] = CACKEY_ID_
ed50: 54 59 50 45 5f 50 49 56 3b 0a 09 09 09 74 72 79  TYPE_PIV;....try
ed60: 5f 74 79 70 65 73 5b 31 5d 20 3d 20 43 41 43 4b  _types[1] = CACK
ed70: 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a  EY_ID_TYPE_CAC;.
ed80: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
ed90: 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
eda0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
edb0: 79 69 6e 67 20 74 6f 20 72 65 73 65 6c 65 63 74  ying to reselect
edc0: 20 74 68 65 20 43 41 43 20 43 43 43 20 61 70 70   the CAC CCC app
edd0: 6c 65 74 20 66 69 72 73 74 22 29 3b 0a 0a 09 09  let first");....
ede0: 09 74 72 79 5f 74 79 70 65 73 5b 30 5d 20 3d 20  .try_types[0] = 
edf0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
ee00: 41 43 3b 0a 09 09 09 74 72 79 5f 74 79 70 65 73  AC;....try_types
ee10: 5b 31 5d 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f  [1] = CACKEY_ID_
ee20: 54 59 50 45 5f 50 49 56 3b 0a 0a 09 09 09 62 72  TYPE_PIV;.....br
ee30: 65 61 6b 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  eak;..}...for (i
ee40: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
ee50: 69 7a 65 6f 66 28 74 72 79 5f 74 79 70 65 73 29  izeof(try_types)
ee60: 20 2f 20 73 69 7a 65 6f 66 28 74 72 79 5f 74 79   / sizeof(try_ty
ee70: 70 65 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  pes[0])); idx++)
ee80: 20 7b 0a 09 09 74 72 79 5f 74 79 70 65 20 3d 20   {...try_type = 
ee90: 74 72 79 5f 74 79 70 65 73 5b 69 64 78 5d 3b 0a  try_types[idx];.
eea0: 0a 09 09 73 77 69 74 63 68 20 28 74 72 79 5f 74  ...switch (try_t
eeb0: 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
eec0: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
eed0: 43 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  C:.....CACKEY_DE
eee0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
eef0: 6e 67 20 74 6f 20 73 65 6c 65 63 74 20 74 68 65  ng to select the
ef00: 20 43 41 43 20 43 43 43 20 61 70 70 6c 65 74 22   CAC CCC applet"
ef10: 29 3b 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74  );......send_ret
ef20: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
ef30: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 61  _applet(slot, ca
ef40: 63 5f 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f  c_ccc_aid, sizeo
ef50: 66 28 63 61 63 5f 63 63 63 5f 61 69 64 29 29 3b  f(cac_ccc_aid));
ef60: 0a 09 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
ef70: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
ef80: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 65  _S_OK) {......se
ef90: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
efa0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
efb0: 6f 74 2c 20 63 61 63 5f 69 64 30 5f 61 69 64 2c  ot, cac_id0_aid,
efc0: 20 73 69 7a 65 6f 66 28 63 61 63 5f 69 64 30 5f   sizeof(cac_id0_
efd0: 61 69 64 29 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  aid));.....}....
efe0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
eff0: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
f000: 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  PIV:.....CACKEY_
f010: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
f020: 79 69 6e 67 20 74 6f 20 73 65 6c 65 63 74 20 74  ying to select t
f030: 68 65 20 50 49 56 20 72 6f 6f 74 20 61 70 70 6c  he PIV root appl
f040: 65 74 22 29 3b 0a 0a 09 09 09 09 73 65 6e 64 5f  et");......send_
f050: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
f060: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
f070: 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f 66   piv_aid, sizeof
f080: 28 70 69 76 5f 61 69 64 29 29 3b 0a 0a 09 09 09  (piv_aid));.....
f090: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
f0a0: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
f0b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
f0c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
f0d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
f0e0: 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64  ssfully selected
f0f0: 20 74 68 65 20 25 73 20 61 70 70 6c 65 74 20 2d   the %s applet -
f100: 2d 20 73 65 74 74 69 6e 67 20 74 68 65 20 5c 22  - setting the \"
f110: 4c 4f 47 49 4e 20 52 45 51 55 49 52 45 44 5c 22  LOGIN REQUIRED\"
f120: 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 74 6f 6b   flag on the tok
f130: 65 6e 22 2c 0a 09 09 09 09 74 72 79 5f 74 79 70  en",.....try_typ
f140: 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  e == CACKEY_ID_T
f150: 59 50 45 5f 43 41 43 20 3f 20 22 43 41 43 22 20  YPE_CAC ? "CAC" 
f160: 3a 20 22 50 49 56 22 0a 09 09 09 29 3b 0a 0a 09  : "PIV"....);...
f170: 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c  ..slot->token_fl
f180: 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
f190: 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 73 6c  REQUIRED;.....sl
f1a0: 6f 74 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e 74  ot->id_type_hint
f1b0: 20 3d 20 74 72 79 5f 74 79 70 65 3b 0a 0a 09 09   = try_type;....
f1c0: 09 72 65 74 75 72 6e 28 74 72 79 5f 74 79 70 65  .return(try_type
f1d0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  );...}..}...CACK
f1e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f1f0: 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63  "Unable to selec
f200: 74 20 61 6e 79 20 61 70 70 6c 65 74 2c 20 72 65  t any applet, re
f210: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
f220: 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  re");...return(C
f230: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52  ACKEY_ID_TYPE_ER
f240: 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  ROR);.}../*. * S
f250: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
f260: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
f270: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
f280: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
f290: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
f2a0: 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ef);. *. * ARGUM
f2b0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
f2c0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
f2d0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
f2e0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
f2f0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
f300: 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20     uint16_t ef. 
f310: 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e  *         Elemen
f320: 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65  tal File to sele
f330: 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ct. *. * RETURN 
f340: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
f350: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
f360: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
f370: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
f380: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
f390: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
f3a0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
f3b0: 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65  s selects an Ele
f3c0: 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46  mentary File (EF
f3d0: 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72  ) under the curr
f3e0: 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20  ently selected. 
f3f0: 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20  *     Dedicated 
f400: 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20  File (DF). *. * 
f410: 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68      Typically th
f420: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
f430: 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65  er selecting the
f440: 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20   correct Applet 
f450: 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61  (using. *     ca
f460: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
f470: 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73  et) for VM cards
f480: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
f490: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
f4a0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
f4b0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
f4c0: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
f4d0: 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ef) {..unsigned 
f4e0: 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b  char fid_buf[2];
f4f0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
f500: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f510: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
f520: 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ;.../* Open the 
f530: 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20  elementary file 
f540: 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d  */..fid_buf[0] =
f550: 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66   (ef >> 8) & 0xf
f560: 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d  f;..fid_buf[1] =
f570: 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   ef & 0xff;...CA
f580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f590: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c  F("Selecting fil
f5a0: 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69  e: %04lx", (unsi
f5b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a  gned long) ef);.
f5c0: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
f5d0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
f5e0: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
f5f0: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
f600: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30  NSTR_SELECT, 0x0
f610: 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28  2, 0x0C, sizeof(
f620: 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75  fid_buf), fid_bu
f630: 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  f, 0x00, NULL, N
f640: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
f650: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
f660: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
f670: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f680: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
f690: 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74  o open file, ret
f6a0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
f6b0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
f6c0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
f6d0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
f6e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f6f0: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
f700: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
f710: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
f720: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
f730: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
f740: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
f750: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
f760: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
f770: 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20  y *root);. *. * 
f780: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
f790: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74   struct cackey_t
f7a0: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a  lv_entity *root.
f7b0: 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20   *         Root 
f7c0: 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20  of the TLV list 
f7d0: 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67  to start freeing
f7e0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
f7f0: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
f800: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
f810: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
f820: 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c   frees the TLV l
f830: 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74  inked listed ret
f840: 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20  urned from. *   
f850: 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74    "cackey_read_t
f860: 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  lv". *. */.stati
f870: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
f880: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
f890: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
f8a0: 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *root) {..struct
f8b0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
f8c0: 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b  ty *curr, *next;
f8d0: 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
f8e0: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  ULL) {...return;
f8f0: 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20  ..}...for (curr 
f900: 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75  = root; curr; cu
f910: 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e  rr = next) {...n
f920: 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78  ext = curr->_nex
f930: 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  t;....switch (cu
f940: 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61  rr->tag) {....ca
f950: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  se GSCIS_TAG_ACR
f960: 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20  _TABLE:....case 
f970: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
f980: 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63  ICATE:.....if (c
f990: 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09  urr->value) {...
f9a0: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
f9b0: 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  lue);.....}.....
f9c0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
f9d0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
f9e0: 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e  :.....if (curr->
f9f0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b  value_cardurl) {
fa00: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
fa10: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b  >value_cardurl);
fa20: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
fa30: 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75  ;...}....free(cu
fa40: 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rr);..}...return
fa50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
fa60: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
fa70: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
fa80: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
fa90: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
faa0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
fab0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
fac0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
fad0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
fae0: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
faf0: 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ad_tlv(struct ca
fb00: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
fb10: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
fb20: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75  y_tlv_entity *cu
fb30: 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74  rr_entity, *root
fb40: 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d   = NULL, *last =
fb50: 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64   NULL;..unsigned
fb60: 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32   char tlen_buf[2
fb70: 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34  ], tval_buf[1024
fb80: 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *tval;..unsig
fb90: 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75  ned char vlen_bu
fba0: 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38  f[2], vval_buf[8
fbb0: 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e  192], *vval;..un
fbc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
fbd0: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
fbe0: 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  ong tmpbuflen;..
fbf0: 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c  ssize_t tlen, vl
fc00: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  en;..ssize_t rea
fc10: 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f  d_ret;..size_t o
fc20: 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66  ffset_t = 0, off
fc30: 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69  set_v = 0;..unsi
fc40: 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09  gned char tag;..
fc50: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23  size_t length;.#
fc60: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
fc70: 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
fc80: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
fc90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fca0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
fcb0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
fcc0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
fcd0: 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, tlen_buf, si
fce0: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20  zeof(tlen_buf), 
fcf0: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
fd00: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
fd10: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29  izeof(tlen_buf))
fd20: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
fd30: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
fd40: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
fd50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
fd60: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
fd70: 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65  .}...tlen = (tle
fd80: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
fd90: 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   tlen_buf[0];...
fda0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
fdb0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
fdc0: 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, vlen_buf, si
fdd0: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20  zeof(vlen_buf), 
fde0: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
fdf0: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
fe00: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29  izeof(vlen_buf))
fe10: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
fe20: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
fe30: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
fe40: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
fe50: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
fe60: 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65  .}...vlen = (vle
fe70: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
fe80: 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   vlen_buf[0];...
fe90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fea0: 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20  NTF("Tag Length 
feb0: 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e  = %lu, Value Len
fec0: 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  gth = %lu", (uns
fed0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e  igned long) tlen
fee0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
fef0: 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65  ) vlen);...offse
ff00: 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65  t_t += 2;..offse
ff10: 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28  t_v += 2;...if (
ff20: 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76  tlen > sizeof(tv
ff30: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
ff40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ff50: 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20  ("Tag length is 
ff60: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
ff70: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
ff80: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
ff90: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65  L);..}...if (vle
ffa0: 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f  n > sizeof(vval_
ffb0: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
ffc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56  _DEBUG_PRINTF("V
ffd0: 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74  alue length is t
ffe0: 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e  oo large, return
fff0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
10000 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
10010 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
10020 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
10030 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c  uffer(slot, tval
10040 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f  _buf, tlen, 1, o
10050 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72  ffset_t);..if (r
10060 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29  ead_ret != tlen)
10070 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
10080 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
10090 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
100a0 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  T-buffer, return
100b0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
100c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
100d0 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
100e0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
100f0 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c  uffer(slot, vval
10100 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f  _buf, vlen, 2, o
10110 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72  ffset_v);..if (r
10120 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29  ead_ret != vlen)
10130 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
10140 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
10150 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
10160 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  V-buffer, return
10170 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
10180 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
10190 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74  );..}...tval = t
101a0 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d  val_buf;..vval =
101b0 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c   vval_buf;..whil
101c0 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76  e (tlen > 0 && v
101d0 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67  len > 0) {...tag
101e0 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c   = *tval;...tval
101f0 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09  ++;...tlen--;...
10200 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78  .if (*tval == 0x
10210 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  ff) {....length 
10220 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29  = (tval[2] << 8)
10230 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74   | tval[1];....t
10240 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65  val += 3;....tle
10250 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65  n -= 3;...} else
10260 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a   {....length = *
10270 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b  tval;....tval++;
10280 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a  ....tlen--;...}.
10290 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
102a0 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20  PRINTF("Tag: %s 
102b0 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  (%02x)", CACKEY_
102c0 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
102d0 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73  O_STR(tag), (uns
102e0 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b  igned int) tag);
102f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10300 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a  PRINTBUF("Value:
10310 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  ", vval, length)
10320 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79  ;....curr_entity
10330 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63   = NULL;...switc
10340 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73  h (tag) {....cas
10350 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
10360 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  URL:.....curr_en
10370 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
10380 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
10390 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  y));.....curr_en
103a0 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
103b0 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  url = malloc(siz
103c0 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
103d0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
103e0 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  );......memcpy(c
103f0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
10400 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
10410 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75  vval, 5);.....cu
10420 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
10430 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
10440 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09  e = vval[5];....
10450 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
10460 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
10470 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d  ectid = (vval[6]
10480 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d   << 8) | vval[7]
10490 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
104a0 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
104b0 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b  ->appid = (vval[
104c0 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  8] << 8) | vval[
104d0 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  9];......curr_en
104e0 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
104f0 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10500 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
10510 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
10520 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
10530 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72  R_TABLE:.....cur
10540 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
10550 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
10560 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70  ntity));.....tmp
10570 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e  buf = malloc(len
10580 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  gth);......memcp
10590 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
105a0 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75  length);......cu
105b0 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
105c0 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
105d0 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20  ntity->length = 
105e0 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72  length;.....curr
105f0 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
10600 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
10610 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
10620 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
10630 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
10640 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
10650 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  E:.....curr_enti
10660 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
10670 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
10680 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  );..#ifdef HAVE_
10690 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c  LIBZ.....tmpbufl
106a0 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b  en = length * 2;
106b0 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
106c0 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
106d0 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
106e0 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73  _ret = uncompres
106f0 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75  s(tmpbuf, &tmpbu
10700 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  flen, vval, leng
10710 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63  th);.....if (unc
10720 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a  ompress_ret != Z
10730 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  _OK) {......CACK
10740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10750 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d  "Failed to decom
10760 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73  press, uncompres
10770 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 20  s() returned %i 
10780 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20  -- resorting to 
10790 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e  direct copy", un
107a0 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a  compress_ret);..
107b0 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
107c0 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65   length;......me
107d0 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
107e0 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09  l, length);.....
107f0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
10800 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65  BUG_PRINTBUF("De
10810 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c  compressed to:",
10820 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
10830 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43  en);.#else.....C
10840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10850 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42  TF("Missing ZLIB
10860 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63   Support, this c
10870 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c 69  ertificate is li
10880 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22  kely useless..."
10890 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  );......tmpbufle
108a0 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
108b0 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
108c0 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65  val, length);.#e
108d0 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65  ndif......curr_e
108e0 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
108f0 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
10900 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62  y->length = tmpb
10910 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f  uflen;.....curr_
10920 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20  entity->value = 
10930 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72  tmpbuf;.....curr
10940 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
10950 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
10960 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53  k;....case GSCIS
10970 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09  _TAG_PKCS15:....
10980 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
10990 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
109a0 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09  rr_entity));....
109b0 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
109c0 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
109d0 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
109e0 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b  _byte = vval[0];
109f0 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10a00 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
10a10 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
10a20 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74  ...vval += lengt
10a30 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e  h;...vlen -= len
10a40 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72  gth;....if (curr
10a50 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29  _entity != NULL)
10a60 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d   {....if (root =
10a70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f  = NULL) {.....ro
10a80 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  ot = curr_entity
10a90 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  ;....}.....if (l
10aa0 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ast != NULL) {..
10ab0 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d  ...last->_next =
10ac0 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
10ad0 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75  .}.....last = cu
10ae0 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09  rr_entity;...}..
10af0 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29  }...return(root)
10b00 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
10b10 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
10b20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
10b30 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
10b40 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
10b50 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
10b60 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
10b70 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
10b80 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  d cackey_free_ce
10b90 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
10ba0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
10bb0 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63  *start, size_t c
10bc0 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73  ount, int free_s
10bd0 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20  tart) {..size_t 
10be0 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74  idx;...if (start
10bf0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
10c00 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
10c10 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
10c20 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
10c30 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e  .if (start[idx].
10c40 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09  certificate) {..
10c50 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 78  ..free(start[idx
10c60 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  ].certificate);.
10c70 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  ..}..}...if (fre
10c80 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65  e_start) {...fre
10c90 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72  e(start);..}...r
10ca0 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
10cb0 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
10cc0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
10cd0 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
10ce0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
10cf0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73  sc_identity *des
10d00 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
10d10 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
10d20 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f  start, size_t co
10d30 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69  unt) {..size_t i
10d40 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20  dx;...if (start 
10d50 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
10d60 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
10d70 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c  if (dest == NULL
10d80 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c  ) {...dest = mal
10d90 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74  loc(sizeof(*dest
10da0 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ) * count);..}..
10db0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
10dc0 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
10dd0 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d  +) {...dest[idx]
10de0 2e 69 64 5f 74 79 70 65 20 3d 20 73 74 61 72 74  .id_type = start
10df0 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a  [idx].id_type;..
10e00 09 09 73 77 69 74 63 68 20 28 64 65 73 74 5b 69  ..switch (dest[i
10e10 64 78 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09  dx].id_type) {..
10e20 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
10e30 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d  _TYPE_CAC:.....m
10e40 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e  emcpy(dest[idx].
10e50 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c  card.cac.applet,
10e60 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
10e70 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a  .cac.applet, siz
10e80 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  eof(dest[idx].ca
10e90 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
10ea0 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  .....dest[idx].c
10eb0 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73  ard.cac.file = s
10ec0 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63  tart[idx].card.c
10ed0 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72 65  ac.file;.....bre
10ee0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
10ef0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
10f00 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61  ....dest[idx].ca
10f10 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20  rd.piv.key_id = 
10f20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e  start[idx].card.
10f30 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09  piv.key_id;.....
10f40 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d  memcpy(dest[idx]
10f50 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c  .card.piv.label,
10f60 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
10f70 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 69 7a 65  .piv.label, size
10f80 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72  of(dest[idx].car
10f90 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29 3b 0a 09  d.piv.label));..
10fa0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
10fb0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
10fc0 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09  _CERT_ONLY:.....
10fd0 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 64 65 73  break;...}...des
10fe0 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
10ff0 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69  te_len = start[i
11000 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
11010 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d  len;...dest[idx]
11020 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74 61 72 74  .keysize = start
11030 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a  [idx].keysize;..
11040 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  ..dest[idx].cert
11050 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63  ificate = malloc
11060 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69  (dest[idx].certi
11070 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d  ficate_len);...m
11080 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e  emcpy(dest[idx].
11090 63 65 72 74 69 66 69 63 61 74 65 2c 20 73 74 61  certificate, sta
110a0 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
110b0 61 74 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63  ate, dest[idx].c
110c0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
110d0 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65 73  ..}...return(des
110e0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
110f0 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
11100 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
11110 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
11120 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
11130 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
11140 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
11150 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
11160 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
11170 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  c_identity *cack
11180 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74  ey_read_certs(st
11190 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
111a0 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63   *slot, struct c
111b0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
111c0 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69  ity *certs, unsi
111d0 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74  gned long *count
111e0 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  ) {..cackey_pcsc
111f0 5f 69 64 5f 74 79 70 65 20 63 68 65 63 6b 5f 69  _id_type check_i
11200 64 5f 74 79 70 65 3b 0a 09 73 74 72 75 63 74 20  d_type;..struct 
11210 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
11220 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
11230 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
11240 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c  v_entity *ccc_tl
11250 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61  v, *ccc_curr, *a
11260 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72  pp_tlv, *app_cur
11270 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  r;..unsigned cha
11280 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76 5f  r *piv_oid, piv_
11290 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d 20  oid_pivauth[] = 
112a0 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
112b0 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c 20 70 69  OID_PIVAUTH}, pi
112c0 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 5b  v_oid_signature[
112d0 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
112e0 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52  3_3_OID_SIGNATUR
112f0 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  E}, piv_oid_keym
11300 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30  gt[] = {NISTSP80
11310 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47  0_73_3_OID_KEYMG
11320 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  T};..unsigned ch
11330 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a  ar curr_aid[7];.
11340 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
11350 75 66 66 65 72 5b 38 31 39 32 5d 2c 20 2a 62 75  uffer[8192], *bu
11360 66 66 65 72 5f 70 2c 20 2a 74 6d 70 62 75 66 3b  ffer_p, *tmpbuf;
11370 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
11380 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61  outidx = 0;..cha
11390 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63  r *piv_label;..c
113a0 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61  ackey_ret transa
113b0 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a  ction_ret;..ssiz
113c0 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73  e_t read_ret;..s
113d0 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
113e0 2c 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e  , tmpbuflen;..in
113f0 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  t certs_resizabl
11400 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
11410 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69  , select_ret;..i
11420 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20  nt piv_key, piv 
11430 3d 20 30 3b 0a 09 69 6e 74 20 63 61 63 68 65 64  = 0;..int cached
11440 5f 63 65 72 74 73 5f 76 61 6c 69 64 3b 0a 09 69  _certs_valid;..i
11450 6e 74 20 69 64 78 3b 0a 09 63 61 63 6b 65 79 5f  nt idx;..cackey_
11460 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f  pcsc_id_type id_
11470 74 79 70 65 3b 0a 23 69 66 64 65 66 20 48 41 56  type;.#ifdef HAV
11480 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f  E_LIBZ..int unco
11490 6d 70 72 65 73 73 5f 72 65 74 3b 0a 09 7a 5f 73  mpress_ret;..z_s
114a0 74 72 65 61 6d 20 67 7a 69 70 5f 73 74 72 65 61  tream gzip_strea
114b0 6d 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  m;.#endif...CACK
114c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
114d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
114e0 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29   (count == NULL)
114f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11500 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20  G_PRINTF("count 
11510 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69  is NULL, returni
11520 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
11530 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
11540 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73  ;..}...if (certs
11550 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
11560 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b   (*count == 0) {
11570 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11580 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
11590 65 64 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f  ed we return 0 o
115a0 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69  bjects, short-ci
115b0 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74  rcuit");.....ret
115c0 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a  urn(certs);...}.
115d0 09 7d 0a 0a 09 63 61 63 68 65 64 5f 63 65 72 74  .}...cached_cert
115e0 73 5f 76 61 6c 69 64 20 3d 20 30 3b 0a 09 69 66  s_valid = 0;..if
115f0 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65   (!slot->slot_re
11600 73 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f  set) {...if (slo
11610 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29  t->cached_certs)
11620 20 7b 0a 09 09 09 63 61 63 68 65 64 5f 63 65 72   {....cached_cer
11630 74 73 5f 76 61 6c 69 64 20 3d 20 31 3b 0a 0a 09  ts_valid = 1;...
11640 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
11650 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20 3e  ed_certs_count >
11660 20 30 29 20 7b 0a 09 09 09 09 63 61 63 68 65 64   0) {.....cached
11670 5f 63 65 72 74 73 5f 76 61 6c 69 64 20 3d 20 31  _certs_valid = 1
11680 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
11690 69 66 20 28 63 61 63 68 65 64 5f 63 65 72 74 73  if (cached_certs
116a0 5f 76 61 6c 69 64 29 20 7b 0a 09 09 69 66 20 28  _valid) {...if (
116b0 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
116c0 0a 09 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c  ....certs = mall
116d0 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  oc(sizeof(*certs
116e0 29 20 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  ) * slot->cached
116f0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09  _certs_count);..
11700 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
11710 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
11720 75 6e 74 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  unt;...} else {.
11730 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20  ...if (*count > 
11740 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
11750 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  ts_count) {.....
11760 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63  *count = slot->c
11770 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
11780 74 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  t;....}...}....c
11790 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73  ackey_copy_certs
117a0 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61  (certs, slot->ca
117b0 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75  ched_certs, *cou
117c0 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  nt);....CACKEY_D
117d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
117e0 75 72 6e 69 6e 67 20 63 61 63 68 65 64 20 63 65  urning cached ce
117f0 72 74 69 66 69 63 61 74 65 73 20 66 6f 72 20 74  rtificates for t
11800 68 69 73 20 73 6c 6f 74 20 28 63 61 72 64 20 68  his slot (card h
11810 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 73 65  as not been rese
11820 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
11830 63 61 63 68 65 64 20 63 65 72 74 73 20 61 76 61  cached certs ava
11840 69 6c 61 62 6c 65 29 22 29 3b 0a 0a 09 09 72 65  ilable)");....re
11850 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 7d 0a  turn(certs);..}.
11860 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
11870 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61  ed_certs) {...ca
11880 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
11890 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
118a0 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  ts, slot->cached
118b0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29  _certs_count, 1)
118c0 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65  ;....slot->cache
118d0 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  d_certs = NULL;.
118e0 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20  .}.../* Begin a 
118f0 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73 61  SmartCard transa
11900 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61  ction */..transa
11910 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b  ction_ret = cack
11920 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
11930 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20  tion(slot);..if 
11940 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74  (transaction_ret
11950 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
11960 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
11970 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
11980 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e  nable begin tran
11990 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69  saction, returni
119a0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
119b0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
119c0 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d  ;..}...id_type =
119d0 20 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61   cackey_detect_a
119e0 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61  nd_select_root_a
119f0 70 70 6c 65 74 28 73 6c 6f 74 2c 20 43 41 43 4b  pplet(slot, CACK
11a00 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f  EY_ID_TYPE_UNKNO
11a10 57 4e 29 3b 0a 0a 09 73 77 69 74 63 68 20 28 69  WN);...switch (i
11a20 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  d_type) {...case
11a30 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
11a40 43 41 43 3a 0a 09 09 09 70 69 76 20 3d 20 30 3b  CAC:....piv = 0;
11a50 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
11a60 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11a70 45 5f 50 49 56 3a 0a 09 09 09 70 69 76 20 3d 20  E_PIV:....piv = 
11a80 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
11a90 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
11aa0 59 50 45 5f 45 52 52 4f 52 3a 0a 09 09 09 2f 2a  YPE_ERROR:..../*
11ab0 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74   Terminate Smart
11ac0 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  Card Transaction
11ad0 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   */....cackey_en
11ae0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
11af0 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 63 65 72  ot);.....if (cer
11b00 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts == NULL) {...
11b10 09 09 2a 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ..*count = 0;...
11b20 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55  .}.....return(NU
11b30 4c 4c 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  LL);.....break;.
11b40 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
11b50 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a  _TYPE_CERT_ONLY:
11b60 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11b70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11b80 20 49 6d 70 6f 73 73 69 62 6c 65 20 63 6f 6e 64   Impossible cond
11b90 69 74 69 6f 6e 20 72 65 61 63 68 65 64 2e 22 29  ition reached.")
11ba0 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  ;.....break;..}.
11bb0 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
11bc0 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ULL) {...certs =
11bd0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
11be0 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a  certs) * 5);...*
11bf0 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72  count = 5;...cer
11c00 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31  ts_resizable = 1
11c10 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65  ;..} else {...ce
11c20 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
11c30 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 76 29  0;..}...if (piv)
11c40 20 7b 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20   {...for (idx = 
11c50 30 3b 20 69 64 78 20 3c 20 33 3b 20 69 64 78 2b  0; idx < 3; idx+
11c60 2b 29 20 7b 0a 09 09 09 73 77 69 74 63 68 20 28  +) {....switch (
11c70 69 64 78 29 20 7b 0a 09 09 09 09 63 61 73 65 20  idx) {.....case 
11c80 30 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20  0:......piv_oid 
11c90 3d 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74  = piv_oid_pivaut
11ca0 68 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20  h;......piv_key 
11cb0 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  = NISTSP800_78_3
11cc0 5f 4b 45 59 5f 50 49 56 41 55 54 48 3b 0a 09 09  _KEY_PIVAUTH;...
11cd0 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22  ...piv_label = "
11ce0 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 3b  Authentication";
11cf0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
11d00 09 63 61 73 65 20 31 3a 0a 09 09 09 09 09 70 69  .case 1:......pi
11d10 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
11d20 73 69 67 6e 61 74 75 72 65 3b 0a 09 09 09 09 09  signature;......
11d30 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50  piv_key = NISTSP
11d40 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47  800_78_3_KEY_SIG
11d50 4e 41 54 55 52 45 3b 0a 09 09 09 09 09 70 69 76  NATURE;......piv
11d60 5f 6c 61 62 65 6c 20 3d 20 22 53 69 67 6e 61 74  _label = "Signat
11d70 75 72 65 22 3b 0a 09 09 09 09 09 62 72 65 61 6b  ure";......break
11d80 3b 0a 09 09 09 09 63 61 73 65 20 32 3a 0a 09 09  ;.....case 2:...
11d90 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
11da0 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b 0a 09 09 09  _oid_keymgt;....
11db0 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54  ..piv_key = NIST
11dc0 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b  SP800_78_3_KEY_K
11dd0 45 59 4d 47 54 3b 0a 09 09 09 09 09 70 69 76 5f  EYMGT;......piv_
11de0 6c 61 62 65 6c 20 3d 20 22 4b 65 79 20 4d 61 6e  label = "Key Man
11df0 61 67 65 6d 65 6e 74 22 3b 0a 09 09 09 09 09 62  agement";......b
11e00 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  reak;....}.....r
11e10 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ead_ret = cackey
11e20 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20  _get_data(slot, 
11e30 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 62  buffer, sizeof(b
11e40 75 66 66 65 72 29 2c 20 70 69 76 5f 6f 69 64 29  uffer), piv_oid)
11e50 3b 0a 0a 09 09 09 69 66 20 28 72 65 61 64 5f 72  ;.....if (read_r
11e60 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 63  et <= 0) {.....c
11e70 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
11e80 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72  ..curr_id = &cer
11e90 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f  ts[outidx];....o
11ea0 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 63 75 72  utidx++;.....cur
11eb0 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  r_id->keysize = 
11ec0 2d 31 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  -1;....curr_id->
11ed0 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59  id_type = CACKEY
11ee0 5f 49 44 5f 54 59 50 45 5f 50 49 56 3b 0a 09 09  _ID_TYPE_PIV;...
11ef0 09 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 70  .curr_id->card.p
11f00 69 76 2e 6b 65 79 5f 69 64 20 3d 20 70 69 76 5f  iv.key_id = piv_
11f10 6b 65 79 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63  key;....memcpy(c
11f20 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76  urr_id->card.piv
11f30 2e 6c 61 62 65 6c 2c 20 70 69 76 5f 6c 61 62 65  .label, piv_labe
11f40 6c 2c 20 73 74 72 6c 65 6e 28 70 69 76 5f 6c 61  l, strlen(piv_la
11f50 62 65 6c 29 20 2b 20 31 29 3b 0a 0a 09 09 09 63  bel) + 1);.....c
11f60 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11f70 61 74 65 5f 6c 65 6e 20 3d 20 72 65 61 64 5f 72  ate_len = read_r
11f80 65 74 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  et;....curr_id->
11f90 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61  certificate = ma
11fa0 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65  lloc(curr_id->ce
11fb0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
11fc0 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d  ....buffer_len =
11fd0 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 3b   sizeof(buffer);
11fe0 0a 09 09 09 62 75 66 66 65 72 5f 70 20 3d 20 63  ....buffer_p = c
11ff0 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
12000 76 5f 74 61 67 28 62 75 66 66 65 72 2c 20 26 62  v_tag(buffer, &b
12010 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78 37 30 2c  uffer_len, 0x70,
12020 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
12030 69 63 61 74 65 2c 20 26 63 75 72 72 5f 69 64 2d  icate, &curr_id-
12040 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
12050 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 66 65  );.....if (buffe
12060 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  r_p == NULL) {..
12070 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12080 50 52 49 4e 54 46 28 22 52 65 61 64 69 6e 67 20  PRINTF("Reading 
12090 63 65 72 74 69 66 69 63 61 74 65 20 66 72 6f 6d  certificate from
120a0 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73   BER-TLV respons
120b0 65 20 66 61 69 6c 65 64 2c 20 73 6b 69 70 70 69  e failed, skippi
120c0 6e 67 20 6b 65 79 20 25 69 22 2c 20 69 64 78 29  ng key %i", idx)
120d0 3b 0a 0a 09 09 09 09 66 72 65 65 28 63 75 72 72  ;......free(curr
120e0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
120f0 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  );......curr_id-
12100 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 4e  >certificate = N
12110 55 4c 4c 3b 0a 0a 09 09 09 09 6f 75 74 69 64 78  ULL;......outidx
12120 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  --;......continu
12130 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
12140 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
12150 63 61 74 65 5f 6c 65 6e 20 3e 20 34 29 20 7b 0a  cate_len > 4) {.
12160 09 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 63  ....if (memcmp(c
12170 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12180 61 74 65 2c 20 22 5c 78 31 66 5c 78 38 62 5c 78  ate, "\x1f\x8b\x
12190 30 38 5c 78 30 30 22 2c 20 34 29 20 3d 3d 20 30  08\x00", 4) == 0
121a0 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ) {.#ifdef HAVE_
121b0 4c 49 42 5a 0a 09 09 09 09 09 74 6d 70 62 75 66  LIBZ......tmpbuf
121c0 6c 65 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63  len = curr_id->c
121d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 2a  ertificate_len *
121e0 20 32 3b 0a 09 09 09 09 09 74 6d 70 62 75 66 20   2;......tmpbuf 
121f0 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c  = malloc(tmpbufl
12200 65 6e 29 3b 0a 0a 09 09 09 09 09 43 41 43 4b 45  en);.......CACKE
12210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12220 28 22 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  ("Attempting to 
12230 64 65 63 6f 6d 70 72 65 73 73 3a 22 2c 20 63 75  decompress:", cu
12240 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
12250 74 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72  te, curr_id->cer
12260 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a  tificate_len);..
12270 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
12280 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a  .zalloc = NULL;.
12290 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
122a0 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 09  .zfree = NULL;..
122b0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
122c0 6f 70 61 71 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  opaque = NULL;..
122d0 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
122e0 2e 6e 65 78 74 5f 69 6e 20 20 3d 20 63 75 72 72  .next_in  = curr
122f0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
12300 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  ;......gzip_stre
12310 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 63 75  am.avail_in = cu
12320 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
12330 74 65 5f 6c 65 6e 3b 0a 09 09 09 09 09 67 7a 69  te_len;......gzi
12340 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 6f 75  p_stream.next_ou
12350 74 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  t = tmpbuf;.....
12360 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61  .gzip_stream.ava
12370 69 6c 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 6c  il_out = tmpbufl
12380 65 6e 3b 0a 0a 09 09 09 09 09 75 6e 63 6f 6d 70  en;.......uncomp
12390 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61  ress_ret = infla
123a0 74 65 49 6e 69 74 28 26 67 7a 69 70 5f 73 74 72  teInit(&gzip_str
123b0 65 61 6d 29 3b 0a 09 09 09 09 09 69 66 20 28 75  eam);......if (u
123c0 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d  ncompress_ret ==
123d0 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 2f   Z_OK) {......./
123e0 2a 20 54 72 79 20 61 67 61 69 6e 20 61 73 20 61  * Try again as a
123f0 20 67 7a 69 70 20 62 75 66 66 65 72 20 2a 2f 0a   gzip buffer */.
12400 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
12410 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 45 6e  _ret = inflateEn
12420 64 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b  d(&gzip_stream);
12430 0a 09 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  .......if (uncom
12440 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f  press_ret == Z_O
12450 4b 29 20 7b 0a 09 09 09 09 09 09 09 67 7a 69 70  K) {........gzip
12460 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d  _stream.zalloc =
12470 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 67 7a   NULL;........gz
12480 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20  ip_stream.zfree 
12490 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 67  = NULL;........g
124a0 7a 69 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75  zip_stream.opaqu
124b0 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
124c0 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65  ..gzip_stream.ne
124d0 78 74 5f 69 6e 20 20 3d 20 63 75 72 72 5f 69 64  xt_in  = curr_id
124e0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
124f0 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61  ......gzip_strea
12500 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 63 75 72  m.avail_in = cur
12510 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
12520 65 5f 6c 65 6e 3b 0a 09 09 09 09 09 09 09 67 7a  e_len;........gz
12530 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 6f  ip_stream.next_o
12540 75 74 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ut = tmpbuf;....
12550 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
12560 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74 6d 70 62  avail_out = tmpb
12570 75 66 6c 65 6e 3b 0a 09 09 09 09 09 09 09 75 6e  uflen;........un
12580 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69  compress_ret = i
12590 6e 66 6c 61 74 65 49 6e 69 74 32 28 26 67 7a 69  nflateInit2(&gzi
125a0 70 5f 73 74 72 65 61 6d 2c 20 33 31 29 3b 0a 09  p_stream, 31);..
125b0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09  .....}......}...
125c0 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73  ...if (uncompres
125d0 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b  s_ret == Z_OK) {
125e0 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  .......uncompres
125f0 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 28  s_ret = inflate(
12600 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20 30 29  &gzip_stream, 0)
12610 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66  ;......}......if
12620 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74   (uncompress_ret
12630 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44   == Z_STREAM_END
12640 29 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70  ) {.......uncomp
12650 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61  ress_ret = infla
12660 74 65 45 6e 64 28 26 67 7a 69 70 5f 73 74 72 65  teEnd(&gzip_stre
12670 61 6d 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  am);......} else
12680 20 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72   {.......uncompr
12690 65 73 73 5f 72 65 74 20 3d 20 5a 5f 44 41 54 41  ess_ret = Z_DATA
126a0 5f 45 52 52 4f 52 3b 0a 09 09 09 09 09 7d 0a 09  _ERROR;......}..
126b0 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65  ....if (uncompre
126c0 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20  ss_ret == Z_OK) 
126d0 7b 0a 09 09 09 09 09 09 74 6d 70 62 75 66 6c 65  {.......tmpbufle
126e0 6e 20 3d 20 67 7a 69 70 5f 73 74 72 65 61 6d 2e  n = gzip_stream.
126f0 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 09 09  total_out;......
12700 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12710 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72  RINTBUF("Decompr
12720 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62  essed to:", tmpb
12730 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  uf, tmpbuflen);.
12740 0a 09 09 09 09 09 09 66 72 65 65 28 63 75 72 72  .......free(curr
12750 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
12760 29 3b 0a 0a 09 09 09 09 09 09 63 75 72 72 5f 69  );........curr_i
12770 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  d->certificate =
12780 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 09 09 63   tmpbuf;.......c
12790 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
127a0 61 74 65 5f 6c 65 6e 20 3d 20 74 6d 70 62 75 66  ate_len = tmpbuf
127b0 6c 65 6e 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  len;......} else
127c0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
127d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65  DEBUG_PRINTF("De
127e0 63 6f 6d 70 72 65 73 73 69 6e 67 20 66 61 69 6c  compressing fail
127f0 65 64 21 20 75 6e 63 6f 6d 70 72 65 73 73 28 29  ed! uncompress()
12800 20 72 65 74 75 72 6e 65 64 20 25 69 22 2c 20 75   returned %i", u
12810 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a  ncompress_ret);.
12820 0a 09 09 09 09 09 09 66 72 65 65 28 74 6d 70 62  .......free(tmpb
12830 75 66 29 3b 0a 09 09 09 09 09 7d 0a 23 65 6c 73  uf);......}.#els
12840 65 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  e......CACKEY_DE
12850 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12860 72 2e 20 20 57 65 20 67 6f 74 20 61 20 63 6f 6d  r.  We got a com
12870 70 72 65 73 73 65 64 20 63 65 72 74 69 66 69 63  pressed certific
12880 61 74 65 20 62 75 74 20 77 65 20 64 6f 20 6e 6f  ate but we do no
12890 74 20 68 61 76 65 20 7a 6c 69 62 2e 20 20 48 6f  t have zlib.  Ho
128a0 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  ping for the bes
128b0 74 2e 22 29 3b 0a 23 65 6e 64 69 66 0a 09 09 09  t.");.#endif....
128c0 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65  .}....}...}..} e
128d0 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64 20  lse {.../* Read 
128e0 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20  all the applets 
128f0 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54  from the CCC's T
12900 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76 20  LV */...ccc_tlv 
12910 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
12920 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 4c  v(slot);..../* L
12930 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73  ook for CARDURLs
12940 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64   that coorespond
12950 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20   to PKI applets 
12960 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63 5f 63 75  */...for (ccc_cu
12970 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63  rr = ccc_tlv; cc
12980 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72  c_curr; ccc_curr
12990 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65   = ccc_curr->_ne
129a0 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  xt) {....CACKEY_
129b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
129c0 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20  und tag: %s ... 
129d0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
129e0 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
129f0 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  ccc_curr->tag));
12a00 0a 0a 09 09 09 69 66 20 28 63 63 63 5f 63 75 72  .....if (ccc_cur
12a10 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
12a20 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09  TAG_CARDURL) {..
12a30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12a40 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
12a50 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
12a60 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 41  ly care about CA
12a70 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 09  RDURLs)");......
12a80 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
12a90 09 09 09 69 66 20 28 28 63 63 63 5f 63 75 72 72  ...if ((ccc_curr
12aa0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
12ab0 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b 45  >apptype & CACKE
12ac0 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21  Y_TLV_APP_PKI) !
12ad0 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  = CACKEY_TLV_APP
12ae0 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43 41 43 4b  _PKI) {.....CACK
12af0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12b00 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
12b10 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
12b20 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65   about PKI apple
12b30 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20  ts, this applet 
12b40 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32  supports: %s/%02
12b50 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  x)", CACKEY_DEBU
12b60 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54  G_FUNC_APPTYPE_T
12b70 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
12b80 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
12b90 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e  pptype), (unsign
12ba0 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72  ed int) ccc_curr
12bb0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
12bc0 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 09  >apptype);......
12bd0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
12be0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12bf0 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c  PRINTBUF("RID:",
12c00 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
12c10 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73  _cardurl->rid, s
12c20 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e  izeof(ccc_curr->
12c30 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
12c40 69 64 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  id));....CACKEY_
12c50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70  DEBUG_PRINTF("Ap
12c60 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  pID = %s/%04lx",
12c70 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
12c80 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
12c90 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
12ca0 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c  cardurl->appid),
12cb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12cc0 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
12cd0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
12ce0 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
12cf0 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74  G_PRINTF("Object
12d00 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20  ID = %s/%04lx", 
12d10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
12d20 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63  C_OBJID_TO_STR(c
12d30 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12d40 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
12d50 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
12d60 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  g) ccc_curr->val
12d70 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
12d80 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63 70  ctid);.....memcp
12d90 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f  y(curr_aid, ccc_
12da0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
12db0 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66  url->rid, sizeof
12dc0 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
12dd0 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b  _cardurl->rid));
12de0 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ....curr_aid[siz
12df0 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
12e00 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
12e10 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
12e20 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
12e30 66 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73  f;....curr_aid[s
12e40 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20  izeof(curr_aid) 
12e50 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d  - 1] = ccc_curr-
12e60 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
12e70 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09  appid & 0xff;...
12e80 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e  ../* Select foun
12e90 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a  d applet ... */.
12ea0 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
12eb0 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
12ec0 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f  plet(slot, curr_
12ed0 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
12ee0 5f 61 69 64 29 29 3b 0a 09 09 09 69 66 20 28 73  _aid));....if (s
12ef0 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
12f00 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
12f10 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12f20 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
12f30 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65   to select apple
12f40 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63  t, skipping proc
12f50 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  essing of this o
12f60 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f  bject");......co
12f70 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
12f80 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65  ./* ... and obje
12f90 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 09  ct (file) */....
12fa0 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
12fb0 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
12fc0 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e  slot, ccc_curr->
12fd0 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
12fe0 62 6a 65 63 74 69 64 29 3b 0a 09 09 09 69 66 20  bjectid);....if 
12ff0 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43  (select_ret != C
13000 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
13010 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
13020 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
13030 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c  ed to select fil
13040 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63  e, skipping proc
13050 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  essing of this o
13060 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f  bject");......co
13070 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
13080 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73  ./* Process this
13090 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b   file's TLV look
130a0 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69 63  ing for certific
130b0 61 74 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f 74  ates */....app_t
130c0 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  lv = cackey_read
130d0 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09 09  _tlv(slot);.....
130e0 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d  .for (app_curr =
130f0 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75   app_tlv; app_cu
13100 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61  rr; app_curr = a
13110 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20  pp_curr->_next) 
13120 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
13130 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
13140 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45   tag: %s", CACKE
13150 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
13160 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72  _TO_STR(app_curr
13170 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09 69 66 20  ->tag));.....if 
13180 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 21  (app_curr->tag !
13190 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  = GSCIS_TAG_CERT
131a0 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
131b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
131c0 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
131d0 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
131e0 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54 49  care about CERTI
131f0 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09  FICATEs)");.....
13200 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ..continue;.....
13210 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 20 3d  }......curr_id =
13220 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b   &certs[outidx];
13230 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a  .....outidx++;..
13240 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f  ....curr_id->id_
13250 74 79 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44  type = CACKEY_ID
13260 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09 09 09 6d  _TYPE_CAC;.....m
13270 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63  emcpy(curr_id->c
13280 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20  ard.cac.applet, 
13290 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
132a0 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  (curr_id->card.c
132b0 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09  ac.applet));....
132c0 09 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  .curr_id->card.c
132d0 61 63 2e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  ac.file = ccc_cu
132e0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
132f0 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
13300 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a  .curr_id->keysiz
13310 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41 43  e = -1;......CAC
13320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13330 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69  ("Filling curr_i
13340 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
13350 65 74 20 28 25 70 29 20 77 69 74 68 20 25 6c 75  et (%p) with %lu
13360 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69   bytes:", curr_i
13370 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
13380 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  et, (unsigned lo
13390 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  ng) sizeof(curr_
133a0 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
133b0 6c 65 74 29 29 3b 0a 09 09 09 09 43 41 43 4b 45  let));.....CACKE
133c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
133d0 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64  ("VAL:", curr_id
133e0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
133f0 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  t, sizeof(curr_i
13400 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
13410 65 74 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  et));......curr_
13420 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
13430 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e  len = app_curr->
13440 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75 72  length;......cur
13450 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
13460 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
13470 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
13480 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79  len);.....memcpy
13490 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
134a0 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d  icate, app_curr-
134b0 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d  >value, curr_id-
134c0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
134d0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 75 74 69  );......if (outi
134e0 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a  dx >= *count) {.
134f0 09 09 09 09 09 69 66 20 28 63 65 72 74 73 5f 72  .....if (certs_r
13500 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09  esizable) {.....
13510 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09  ..*count *= 2;..
13520 09 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20  .....if (*count 
13530 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 63  != 0) {........c
13540 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63  erts = realloc(c
13550 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65  erts, sizeof(*ce
13560 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29  rts) * (*count))
13570 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ;.......} else {
13580 0a 09 09 09 09 09 09 09 63 65 72 74 73 20 3d 20  ........certs = 
13590 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 7d 0a 09 09  NULL;.......}...
135a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
135b0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
135c0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63  ....}....}.....c
135d0 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61  ackey_free_tlv(a
135e0 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20  pp_tlv);.....if 
135f0 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e  (outidx >= *coun
13600 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  t) {.....break;.
13610 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ...}...}....cack
13620 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f  ey_free_tlv(ccc_
13630 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e  tlv);..}...*coun
13640 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66  t = outidx;...if
13650 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c   (certs_resizabl
13660 65 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e  e) {...if (*coun
13670 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 65 72  t != 0) {....cer
13680 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
13690 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
136a0 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
136b0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 66 72  ..} else {....fr
136c0 65 65 28 63 65 72 74 73 29 3b 0a 0a 09 09 09 63  ee(certs);.....c
136d0 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  erts = NULL;...}
136e0 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68  ..}...slot->cach
136f0 65 64 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65  ed_certs = cacke
13700 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c  y_copy_certs(NUL
13710 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74  L, certs, *count
13720 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  );..slot->cached
13730 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a  _certs_count = *
13740 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d  count;.../* Term
13750 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
13760 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
13770 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
13780 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
13790 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d  return(certs);.}
137a0 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
137b0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
137c0 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
137d0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
137e0 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
137f0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
13800 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13810 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
13820 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  t cackey_signdec
13830 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63 6b  rypt(struct cack
13840 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
13850 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
13860 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
13870 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13880 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c  buf, size_t bufl
13890 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
138a0 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f  r *outbuf, size_
138b0 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74  t outbuflen, int
138c0 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75   padInput, int u
138d0 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63  npadOutput) {..c
138e0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
138f0 70 65 20 69 64 5f 74 79 70 65 2c 20 63 68 65 63  pe id_type, chec
13900 6b 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69  k_id_type;..unsi
13910 67 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61 75  gned char dyn_au
13920 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d 2c  th_template[10],
13930 20 2a 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75   *dyn_auth_tmpbu
13940 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  f;..unsigned cha
13950 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62  r *tmpbuf, *tmpb
13960 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 2c  uf_s, *outbuf_s,
13970 20 2a 6f 75 74 62 75 66 5f 70 3b 0a 09 75 6e 73   *outbuf_p;..uns
13980 69 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73  igned char bytes
13990 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c  _to_send, p1, cl
139a0 61 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ass;..unsigned c
139b0 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09  har blocktype;..
139c0 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f  cackey_ret send_
139d0 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  ret;..uint16_t r
139e0 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f  espcode;..ssize_
139f0 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e  t retval = 0, un
13a00 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65  padoffset;..size
13a10 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61  _t tmpbuflen, pa
13a20 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c  dlen, tmpoutbufl
13a30 65 6e 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a  en, outbuf_len;.
13a40 09 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66  .int free_tmpbuf
13a50 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a   = 0;..int le;..
13a60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13a70 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
13a80 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e  ...if (slot == N
13a90 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
13aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13ab0 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55  ror.  slot is NU
13ac0 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
13ad0 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75  -1);..}...if (bu
13ae0 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  f == NULL) {...C
13af0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13b00 54 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20  TF("Error.  buf 
13b10 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
13b20 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
13b30 66 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c  f (outbuf == NUL
13b40 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
13b50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13b60 72 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55  r.  outbuf is NU
13b70 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
13b80 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64  -1);..}...if (id
13b90 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20  entity == NULL) 
13ba0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13bb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13bc0 20 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c   identity is NUL
13bd0 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
13be0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65  1);..}...if (ide
13bf0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
13c00 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tity == NULL) {.
13c10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13c20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69  RINTF("Error.  i
13c30 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13c40 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29  entity is NULL")
13c50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
13c60 0a 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20  ..}...id_type = 
13c70 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
13c80 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65  dentity->id_type
13c90 3b 0a 09 69 66 20 28 69 64 5f 74 79 70 65 20 3d  ;..if (id_type =
13ca0 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
13cb0 5f 43 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09  _CERT_ONLY) {...
13cc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13cd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65  NTF("Error.  ide
13ce0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
13cf0 74 69 74 79 20 69 73 20 43 41 43 4b 45 59 5f 49  tity is CACKEY_I
13d00 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
13d10 2c 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 62  , which cannot b
13d20 65 20 75 73 65 64 20 66 6f 72 20 73 69 67 6e 2f  e used for sign/
13d30 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 72 65  decrypt");....re
13d40 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73  turn(-1);..}...s
13d50 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20  witch (id_type) 
13d60 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  {...case CACKEY_
13d70 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 63  ID_TYPE_PIV:...c
13d80 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13d90 50 45 5f 43 41 43 3a 0a 09 09 09 62 72 65 61 6b  PE_CAC:....break
13da0 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
13db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13dc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65  NTF("Error.  ide
13dd0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
13de0 74 69 74 79 20 69 73 20 6e 6f 74 20 61 20 73 75  tity is not a su
13df0 70 70 6f 72 74 65 64 20 76 61 6c 75 65 2e 20 54  pported value. T
13e00 79 70 65 20 69 73 3a 20 30 78 25 6c 78 20 28 50  ype is: 0x%lx (P
13e10 49 56 20 3d 20 30 78 25 6c 78 2c 20 43 41 43 20  IV = 0x%lx, CAC 
13e20 3d 20 30 78 25 6c 78 29 22 2c 20 28 75 6e 73 69  = 0x%lx)", (unsi
13e30 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 5f 74 79  gned long) id_ty
13e40 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  pe, (unsigned lo
13e50 6e 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ng) CACKEY_ID_TY
13e60 50 45 5f 50 49 56 2c 20 28 75 6e 73 69 67 6e 65  PE_PIV, (unsigne
13e70 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49  d long) CACKEY_I
13e80 44 5f 54 59 50 45 5f 43 41 43 29 3b 0a 0a 09 09  D_TYPE_CAC);....
13e90 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
13ea0 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69  ../* Determine i
13eb0 64 65 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65  dentity Key size
13ec0 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74   */..if (identit
13ed0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13ee0 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b  ->keysize < 0) {
13ef0 0a 09 09 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 3d 20 78 35 30 39 5f 74 6f 5f 6b 65  ize = x509_to_ke
13f20 79 73 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e  ysize(identity->
13f30 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
13f40 65 72 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e  ertificate, iden
13f50 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13f60 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
13f70 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50  _len);..}.../* P
13f80 61 64 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65  ad message to ke
13f90 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70  y size */..if (p
13fa0 61 64 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20  adInput) {...if 
13fb0 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
13fc0 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
13fd0 65 20 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28  e > 0) {....if (
13fe0 62 75 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69  buflen != identi
13ff0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
14000 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09  y->keysize) {...
14010 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28  ..if (buflen > (
14020 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
14030 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
14040 20 2d 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41   - 3)) {......CA
14050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14060 46 28 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61  F("Error.  Messa
14070 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
14080 74 6f 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22  to sign/decrypt"
14090 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
140a0 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  -1);.....}......
140b0 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e  tmpbuflen = iden
140c0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
140d0 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09  ity->keysize;...
140e0 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
140f0 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09  c(tmpbuflen);...
14100 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
14110 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d  1;......padlen =
14120 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66   tmpbuflen - buf
14130 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 43 41  len - 3;......CA
14140 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14150 46 28 22 4e 65 65 64 20 74 6f 20 70 61 64 20 74  F("Need to pad t
14160 68 65 20 62 75 66 66 65 72 20 77 69 74 68 20 25  he buffer with %
14170 6c 6c 75 20 62 79 74 65 73 20 28 74 6d 70 62 75  llu bytes (tmpbu
14180 66 6c 65 6e 20 3d 20 25 6c 6c 75 2c 20 62 75 66  flen = %llu, buf
14190 6c 65 6e 20 3d 20 25 6c 6c 75 29 22 2c 20 28 75  len = %llu)", (u
141a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
141b0 67 29 20 70 61 64 6c 65 6e 2c 20 28 75 6e 73 69  g) padlen, (unsi
141c0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
141d0 74 6d 70 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69  tmpbuflen, (unsi
141e0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20  gned long long) 
141f0 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 2f 2a  buflen);....../*
14200 20 52 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41   RSA PKCS#1 EMSA
14210 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64  -PKCS1-v1_5 Padd
14220 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75  ing */.....tmpbu
14230 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09  f[0] = 0x00;....
14240 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30  .tmpbuf[1] = 0x0
14250 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74  1;.....memset(&t
14260 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20  mpbuf[2], 0xFF, 
14270 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70  padlen);.....tmp
14280 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d  buf[padlen + 2]=
14290 20 30 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70   0x00;.....memcp
142a0 79 28 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  y(&tmpbuf[padlen
142b0 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c   + 3], buf, bufl
142c0 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  en);......CACKEY
142d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
142e0 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66  "Unpadded:", buf
142f0 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43  , buflen);.....C
14300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14310 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20  TBUF("Padded:", 
14320 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65  tmpbuf, tmpbufle
14330 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  n);....} else {.
14340 09 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  ....tmpbuf = buf
14350 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ;.....tmpbuflen 
14360 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72  = buflen;.....fr
14370 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
14380 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
14390 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
143a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
143b0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
143c0 20 64 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73   determine key s
143d0 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20  ize, hoping the 
143e0 6d 65 73 73 61 67 65 20 69 73 20 70 72 6f 70 65  message is prope
143f0 72 6c 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a  rly padded!");..
14400 09 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b  ...tmpbuf = buf;
14410 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
14420 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f  buflen;....free_
14430 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70  tmpbuf = 0;....p
14440 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09  adlen = 0;...}..
14450 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75  } else {...tmpbu
14460 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75  f = buf;...tmpbu
14470 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
14480 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
14490 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ;...padlen = 0;.
144a0 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72  .}.../* Begin tr
144b0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
144c0 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
144d0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
144e0 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
144f0 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 73 77 69  t applet */..swi
14500 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
14510 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
14520 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 43 41  _TYPE_CAC:....CA
14530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14540 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70  F("Selecting app
14550 6c 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20  let found at %p 
14560 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  ...", identity->
14570 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
14580 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 3b  ard.cac.applet);
14590 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63  ....cackey_selec
145a0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69  t_applet(slot, i
145b0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
145c0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
145d0 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28  .applet, sizeof(
145e0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
145f0 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
14600 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09  c.applet));.....
14610 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63  /* Select correc
14620 74 20 66 69 6c 65 20 2a 2f 0a 09 09 09 63 61 63  t file */....cac
14630 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28  key_select_file(
14640 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e  slot, identity->
14650 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
14660 61 72 64 2e 63 61 63 2e 66 69 6c 65 29 3b 0a 09  ard.cac.file);..
14670 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
14680 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
14690 49 56 3a 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  IV:....dyn_auth_
146a0 74 65 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78  template[0] = 0x
146b0 37 43 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  7C;....dyn_auth_
146c0 74 65 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78  template[1] = 0x
146d0 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f  82;....dyn_auth_
146e0 74 65 6d 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28  template[2] = ((
146f0 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26  tmpbuflen + 6) &
14700 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
14710 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
14720 61 74 65 5b 33 5d 20 3d 20 28 74 6d 70 62 75 66  ate[3] = (tmpbuf
14730 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 30 30 66  len + 6) & 0x00f
14740 66 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  f;....dyn_auth_t
14750 65 6d 70 6c 61 74 65 5b 34 5d 20 3d 20 30 78 38  emplate[4] = 0x8
14760 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  2;....dyn_auth_t
14770 65 6d 70 6c 61 74 65 5b 35 5d 20 3d 20 30 78 30  emplate[5] = 0x0
14780 30 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  0;....dyn_auth_t
14790 65 6d 70 6c 61 74 65 5b 36 5d 20 3d 20 30 78 38  emplate[6] = 0x8
147a0 31 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  1;....dyn_auth_t
147b0 65 6d 70 6c 61 74 65 5b 37 5d 20 3d 20 30 78 38  emplate[7] = 0x8
147c0 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  2;....dyn_auth_t
147d0 65 6d 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74 6d  emplate[8] = (tm
147e0 70 62 75 66 6c 65 6e 20 26 20 30 78 66 66 30 30  pbuflen & 0xff00
147f0 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61  ) >> 8;....dyn_a
14800 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20  uth_template[9] 
14810 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78  = tmpbuflen & 0x
14820 30 30 66 66 3b 0a 0a 09 09 09 64 79 6e 5f 61 75  00ff;.....dyn_au
14830 74 68 5f 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  th_tmpbuf = mall
14840 6f 63 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 73  oc(tmpbuflen + s
14850 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74  izeof(dyn_auth_t
14860 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65  emplate));....me
14870 6d 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d  mcpy(dyn_auth_tm
14880 70 62 75 66 2c 20 64 79 6e 5f 61 75 74 68 5f 74  pbuf, dyn_auth_t
14890 65 6d 70 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28  emplate, sizeof(
148a0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
148b0 65 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64  e));....memcpy(d
148c0 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 2b  yn_auth_tmpbuf +
148d0 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68   sizeof(dyn_auth
148e0 5f 74 65 6d 70 6c 61 74 65 29 2c 20 74 6d 70 62  _template), tmpb
148f0 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a  uf, tmpbuflen);.
14900 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70  ....if (free_tmp
14910 62 75 66 29 20 7b 0a 09 09 09 09 66 72 65 65 28  buf) {.....free(
14920 74 6d 70 62 75 66 29 3b 0a 09 09 09 7d 0a 0a 09  tmpbuf);....}...
14930 09 09 74 6d 70 62 75 66 6c 65 6e 20 2b 3d 20 73  ..tmpbuflen += s
14940 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74  izeof(dyn_auth_t
14950 65 6d 70 6c 61 74 65 29 3b 0a 09 09 09 74 6d 70  emplate);....tmp
14960 62 75 66 20 3d 20 64 79 6e 5f 61 75 74 68 5f 74  buf = dyn_auth_t
14970 6d 70 62 75 66 3b 0a 09 09 09 66 72 65 65 5f 74  mpbuf;....free_t
14980 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 62  mpbuf = 1;.....b
14990 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43  reak;...case CAC
149a0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
149b0 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b  _ONLY:....break;
149c0 0a 09 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d  ..}...tmpbuf_s =
149d0 20 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66   tmpbuf;..outbuf
149e0 5f 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68  _s = outbuf;..wh
149f0 69 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20  ile (tmpbuflen) 
14a00 7b 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e  {...tmpoutbuflen
14a10 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09   = outbuflen;...
14a20 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e  .if (tmpbuflen >
14a30 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
14a40 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
14a50 73 65 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41 50  send = CACKEY_AP
14a60 44 55 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73 65  DU_MTU;...} else
14a70 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
14a80 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b  end = tmpbuflen;
14a90 0a 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65 74  ...}....send_ret
14aa0 20 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45   = CACKEY_PCSC_E
14ab0 5f 47 45 4e 45 52 49 43 3b 0a 09 09 73 77 69 74  _GENERIC;...swit
14ac0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
14ad0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
14ae0 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 69  _TYPE_CAC:.....i
14af0 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43  f (tmpbuflen > C
14b00 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20  ACKEY_APDU_MTU) 
14b10 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78 38 30  {......p1 = 0x80
14b20 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30  ;......le = 0x00
14b30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
14b40 09 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09  ....p1 = 0x00;..
14b50 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09  ....le = 0x00;..
14b60 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72  ...}......send_r
14b70 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
14b80 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
14b90 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
14ba0 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
14bb0 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54  NSTR_SIGNDECRYPT
14bc0 2c 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65  , p1, 0x00, byte
14bd0 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75  s_to_send, tmpbu
14be0 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65  f, le, &respcode
14bf0 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75  , outbuf, &tmpou
14c00 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72  tbuflen);.....br
14c10 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43  eak;....case CAC
14c20 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
14c30 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c  .....if (tmpbufl
14c40 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55  en > CACKEY_APDU
14c50 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 63 6c 61  _MTU) {......cla
14c60 73 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09 09  ss = 0x10;......
14c70 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d  le = 0x00;.....}
14c80 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c 61   else {......cla
14c90 73 73 20 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  ss = GSCIS_CLASS
14ca0 5f 49 53 4f 37 38 31 36 3b 0a 09 09 09 09 09 6c  _ISO7816;......l
14cb0 65 20 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a 0a  e = 256;.....}..
14cc0 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
14cd0 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
14ce0 73 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53  slot, class, NIS
14cf0 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54  TSP800_73_3_INST
14d00 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53  R_GENAUTH, NISTS
14d10 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
14d20 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79  SA2048, identity
14d30 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
14d40 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  >card.piv.key_id
14d50 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  , bytes_to_send,
14d60 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65   tmpbuf, le, &re
14d70 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20  spcode, outbuf, 
14d80 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  &tmpoutbuflen);.
14d90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14da0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14db0 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09  E_CERT_ONLY:....
14dc0 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
14dd0 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
14de0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
14df0 20 7b 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74   {....if (free_t
14e00 6d 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20  mpbuf) {.....if 
14e10 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
14e20 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29  ..free(tmpbuf_s)
14e30 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
14e40 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
14e50 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
14e60 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
14e70 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28  (slot);.....if (
14e80 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
14e90 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
14ea0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
14eb0 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
14ec0 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20   Sending Failed 
14ed0 2d 2d 20 72 65 74 72 79 69 6e 67 2e 22 29 3b 0a  -- retrying.");.
14ee0 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b  .....return(cack
14ef0 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73  ey_signdecrypt(s
14f00 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2c 20 62  lot, identity, b
14f10 75 66 2c 20 62 75 66 6c 65 6e 2c 20 6f 75 74 62  uf, buflen, outb
14f20 75 66 2c 20 6f 75 74 62 75 66 6c 65 6e 2c 20 70  uf, outbuflen, p
14f30 61 64 49 6e 70 75 74 2c 20 75 6e 70 61 64 4f 75  adInput, unpadOu
14f40 74 70 75 74 29 29 3b 0a 09 09 09 7d 0a 0a 09 09  tput));....}....
14f50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f60 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
14f70 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74  ng Failed -- ret
14f80 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e  urning in error.
14f90 22 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70  ");.....if (resp
14fa0 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 20 7c  code == 0x6982 |
14fb0 7c 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78  | respcode == 0x
14fc0 36 65 30 30 20 7c 7c 20 72 65 73 70 63 6f 64 65  6e00 || respcode
14fd0 20 3d 3d 20 30 78 36 64 30 30 29 20 7b 0a 09 09   == 0x6d00) {...
14fe0 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
14ff0 3d 20 30 78 36 65 30 30 29 20 7b 0a 09 09 09 09  = 0x6e00) {.....
15000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15010 49 4e 54 46 28 22 47 6f 74 20 5c 22 57 52 4f 4e  INTF("Got \"WRON
15020 47 20 43 4c 41 53 53 5c 22 2c 20 74 68 69 73 20  G CLASS\", this 
15030 6d 65 61 6e 73 20 77 65 20 61 72 65 20 74 61 6c  means we are tal
15040 6b 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f 6e  king to the wron
15050 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79  g object (likely
15060 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 72   because the car
15070 64 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d 20  d went away) -- 
15080 72 65 73 65 74 74 69 6e 67 22 29 3b 0a 09 09 09  resetting");....
15090 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 73 70  .} else if (resp
150a0 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20  code == 0x6d00) 
150b0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
150c0 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f 74 20  BUG_PRINTF("Got 
150d0 5c 22 49 4e 56 41 4c 49 44 20 49 4e 53 54 52 55  \"INVALID INSTRU
150e0 43 54 49 4f 4e 5c 22 2c 20 74 68 69 73 20 6d 65  CTION\", this me
150f0 61 6e 73 20 77 65 20 61 72 65 20 74 61 6c 6b 69  ans we are talki
15100 6e 67 20 74 6f 20 74 68 65 20 77 72 6f 6e 67 20  ng to the wrong 
15110 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20 62  object (likely b
15120 65 63 61 75 73 65 20 74 68 65 20 63 61 72 64 20  ecause the card 
15130 77 65 6e 74 20 61 77 61 79 29 20 2d 2d 20 72 65  went away) -- re
15140 73 65 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d  setting");.....}
15150 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43   else {......CAC
15160 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15170 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75  ("Security statu
15180 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64  s not satisified
15190 20 28 72 65 73 70 63 6f 64 65 20 3d 20 30 78 25   (respcode = 0x%
151a0 30 34 78 29 2e 20 20 52 65 74 75 72 6e 69 6e 67  04x).  Returning
151b0 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20 28 69 6e   NEEDLOGIN", (in
151c0 74 29 20 72 65 73 70 63 6f 64 65 29 3b 0a 09 09  t) respcode);...
151d0 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
151e0 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
151f0 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 63 61 63 6b  slot);......cack
15200 65 79 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65  ey_detect_and_se
15210 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74  lect_root_applet
15220 28 73 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49 44  (slot, CACKEY_ID
15230 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a  _TYPE_UNKNOWN);.
15240 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e  .....slot->token
15250 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
15260 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09  IN_REQUIRED;....
15270 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15280 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
15290 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
152a0 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
152b0 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
152c0 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43  BSENT) {.....CAC
152d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
152e0 28 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  ("Token absent. 
152f0 20 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e   Returning TOKEN
15300 41 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63  ABSENT");......c
15310 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
15320 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
15330 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15340 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15350 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  NT);....}.....CA
15360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15370 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 77 65 6e  F("Something wen
15380 74 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 73  t wrong during s
15390 69 67 6e 69 6e 67 2c 20 72 65 73 65 74 74 69 6e  igning, resettin
153a0 67 20 74 68 65 20 73 6c 6f 74 20 61 6e 64 20 68  g the slot and h
153b0 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oping for the be
153c0 73 74 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  st.");.....cacke
153d0 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
153e0 74 28 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  t();.....cackey_
153f0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
15400 0a 09 09 09 63 61 63 6b 65 79 5f 64 65 74 65 63  ....cackey_detec
15410 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f  t_and_select_roo
15420 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 43  t_applet(slot, C
15430 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e  ACKEY_ID_TYPE_UN
15440 4b 4e 4f 57 4e 29 3b 0a 0a 09 09 09 72 65 74 75  KNOWN);.....retu
15450 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
15460 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
15470 09 09 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65  ..tmpbuf += byte
15480 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70  s_to_send;...tmp
15490 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f  buflen -= bytes_
154a0 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62  to_send;....outb
154b0 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c  uf += tmpoutbufl
154c0 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20  en;...outbuflen 
154d0 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  -= tmpoutbuflen;
154e0 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70  ...retval += tmp
154f0 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09  outbuflen;..}...
15500 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29  if (free_tmpbuf)
15510 20 7b 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f   {...if (tmpbuf_
15520 73 29 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70  s) {....free(tmp
15530 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  buf_s);...}..}..
15540 09 6f 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66  .outbuf = outbuf
15550 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61  _s;.../* End tra
15560 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
15570 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
15580 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64  ion(slot);..#ifd
15590 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
155a0 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
155b0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
155c0 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50   (outbuflen > _P
155d0 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
155e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
155f0 5f 50 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c  _PRINTF("Outbufl
15600 65 6e 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  en exceeds maxim
15610 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
15620 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
15630 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62  (max = %li, outb
15640 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28  uflen = %lu)", (
15650 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49  long) _POSIX_SSI
15660 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65  ZE_MAX, (unsigne
15670 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65  d long) outbufle
15680 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  n);....return(-1
15690 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
156a0 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75  endif.../* We mu
156b0 73 74 20 72 65 6d 6f 76 65 20 74 68 65 20 22 37  st remove the "7
156c0 43 22 20 74 61 67 20 74 6f 20 67 65 74 20 74 6f  C" tag to get to
156d0 20 74 68 65 20 73 69 67 6e 61 74 75 72 65 20 2a   the signature *
156e0 2f 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  /..switch (id_ty
156f0 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43  pe) {...case CAC
15700 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
15710 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d  ....outbuf_len =
15720 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62   retval;....outb
15730 75 66 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65  uf_p = cackey_re
15740 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75  ad_bertlv_tag(ou
15750 74 62 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65  tbuf, &outbuf_le
15760 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c 2c 20 20  n, 0x7C, NULL,  
15770 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09  &outbuf_len);...
15780 09 69 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d  .if (outbuf_p ==
15790 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43   NULL) {.....CAC
157a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
157b0 28 22 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20  ("Response from 
157c0 50 49 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45  PIV for GENERATE
157d0 20 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20   AUTHENTICATION 
157e0 77 61 73 20 6e 6f 74 20 61 20 30 78 37 43 20 74  was not a 0x7C t
157f0 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ag, returning in
15800 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
15810 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
15820 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 6f  }.....retval = o
15830 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f  utbuf_len;.....o
15840 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76  utbuf_len = retv
15850 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20  al;....outbuf_p 
15860 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
15870 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c  rtlv_tag(outbuf,
15880 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78   &outbuf_len, 0x
15890 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62  82, NULL,  &outb
158a0 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  uf_len);....if (
158b0 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c  outbuf_p == NULL
158c0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
158d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
158e0 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66  ponse from PIV f
158f0 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48  or GENERATE AUTH
15900 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e  ENTICATION was n
15910 6f 74 20 61 20 30 78 38 32 20 77 69 74 68 69 6e  ot a 0x82 within
15920 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74   a 0x7C tag, ret
15930 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
15940 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  e");......return
15950 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  (-1);....}.....r
15960 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c  etval = outbuf_l
15970 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  en;.....break;..
15980 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
15990 54 59 50 45 5f 43 41 43 3a 0a 09 09 63 61 73 65  TYPE_CAC:...case
159a0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
159b0 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72  CERT_ONLY:....br
159c0 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70  eak;..}.../* Unp
159d0 61 64 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20  ad reply */..if 
159e0 28 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a  (unpadOutput) {.
159f0 09 09 69 66 20 28 72 65 74 76 61 6c 20 3c 20 33  ..if (retval < 3
15a00 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
15a10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c  BUG_PRINTF("Repl
15a20 79 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  y is too small, 
15a30 77 65 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20  we are not able 
15a40 74 6f 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73  to unpad -- pass
15a50 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70  ing back and hop
15a60 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74  ing for the best
15a70 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  !");.....CACKEY_
15a80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15a90 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
15aa0 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69  ss, retval = %li
15ab0 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67   (bytes)", (long
15ac0 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65  ) retval);....re
15ad0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09  turn(retval);...
15ae0 7d 0a 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5b  }....if (outbuf[
15af0 30 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  0] != 0x00) {...
15b00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15b10 49 4e 54 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a  INTF("Unrecogniz
15b20 65 64 20 70 61 64 64 69 6e 67 20 73 63 68 65 6d  ed padding schem
15b30 65 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  e -- passing bac
15b40 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
15b50 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
15b60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15b70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15b80 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
15b90 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
15ba0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
15bb0 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
15bc0 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c  tval);...}....bl
15bd0 6f 63 6b 74 79 70 65 20 3d 20 6f 75 74 62 75 66  ocktype = outbuf
15be0 5b 31 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73  [1];...unpadoffs
15bf0 65 74 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63  et = 0;....switc
15c00 68 20 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  h (blocktype) {.
15c10 09 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09  ...case 0x00:...
15c20 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
15c30 65 6d 65 20 31 2c 20 74 68 65 20 66 69 72 73 74  eme 1, the first
15c40 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69   non-zero byte i
15c50 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64  s the start of d
15c60 61 74 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  ata */.....for (
15c70 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
15c80 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
15c90 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
15ca0 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
15cb0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
15cc0 73 65 74 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a  set] != 0x00) {.
15cd0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15ce0 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  ..}.....}.....br
15cf0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30  eak;....case 0x0
15d00 31 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  1:...../* Paddin
15d10 67 20 53 63 68 65 6d 65 20 32 2c 20 70 61 64 20  g Scheme 2, pad 
15d20 62 79 74 65 73 20 61 72 65 20 30 78 46 46 20 66  bytes are 0xFF f
15d30 6f 6c 6c 6f 77 65 64 20 62 79 20 30 78 30 30 20  ollowed by 0x00 
15d40 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
15d50 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
15d60 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
15d70 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
15d80 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
15d90 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
15da0 20 21 3d 20 30 78 46 46 29 20 7b 0a 09 09 09 09   != 0xFF) {.....
15db0 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
15dc0 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30  adoffset] == 0x0
15dd0 30 29 20 7b 0a 09 09 09 09 09 09 09 75 6e 70 61  0) {........unpa
15de0 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09  doffset++;......
15df0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
15e00 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
15e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15e20 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64  NTF("Invalid pad
15e30 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c  ding data found,
15e40 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
15e50 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61  ilure, should ha
15e60 76 65 20 62 65 65 6e 20 30 78 30 30 20 66 6f 75  ve been 0x00 fou
15e70 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73  nd 0x%02x", (uns
15e80 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75  igned int) outbu
15e90 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b  f[unpadoffset]);
15ea0 0a 0a 09 09 09 09 09 09 09 72 65 74 75 72 6e 28  .........return(
15eb0 2d 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  -1);.......}....
15ec0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
15ed0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15ee0 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61  INTF("Invalid pa
15ef0 64 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64  dding data found
15f00 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
15f10 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68  ailure, should h
15f20 61 76 65 20 62 65 65 6e 20 30 78 46 46 20 66 6f  ave been 0xFF fo
15f30 75 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e  und 0x%02x", (un
15f40 73 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62  signed int) outb
15f50 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29  uf[unpadoffset])
15f60 3b 0a 0a 09 09 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
15f70 2d 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  -1);......}.....
15f80 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
15f90 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 09 2f  case 0x02:...../
15fa0 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
15fb0 20 33 2c 20 70 61 64 20 62 79 74 65 73 20 61 72   3, pad bytes ar
15fc0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74  e non-zero first
15fd0 20 7a 65 72 6f 20 62 79 74 65 20 66 6f 75 6e 64   zero byte found
15fe0 20 69 73 20 74 68 65 20 73 65 70 65 72 61 74 6f   is the seperato
15ff0 72 20 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f  r byte */.....fo
16000 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  r (unpadoffset =
16010 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20   2; unpadoffset 
16020 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f  < retval; unpado
16030 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09  ffset++) {......
16040 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
16050 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29  offset] == 0x00)
16060 20 7b 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66   {.......unpadof
16070 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62  fset++;........b
16080 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
16090 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
160a0 7d 0a 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66  }....if (unpadof
160b0 66 73 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b  fset > retval) {
160c0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
160d0 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20  _PRINTF("Offset 
160e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 72 65 70  greater than rep
160f0 6c 79 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e  ly size, abortin
16100 67 2e 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74  g.  (unpadoffset
16110 20 3d 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d   = %lu, retval =
16120 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
16130 64 20 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66  d long) unpadoff
16140 73 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  set, (unsigned l
16150 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
16160 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
16170 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
16180 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
16190 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65  ed:", outbuf, re
161a0 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c  tval);....retval
161b0 20 2d 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b   -= unpadoffset;
161c0 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75  ...memmove(outbu
161d0 66 2c 20 6f 75 74 62 75 66 20 2b 20 75 6e 70 61  f, outbuf + unpa
161e0 64 6f 66 66 73 65 74 2c 20 72 65 74 76 61 6c 29  doffset, retval)
161f0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
16200 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61  G_PRINTBUF("Unpa
16210 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20  dded:", outbuf, 
16220 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43  retval);..}....C
16230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16240 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
16250 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
16260 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
16270 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
16280 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
16290 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
162a0 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
162b0 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
162c0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
162d0 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
162e0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
162f0 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
16300 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
16310 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
16320 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74  token_present(st
16330 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
16340 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
16350 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65  y_ret pcsc_conne
16360 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72  ct_ret;..DWORD r
16370 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73  eader_len = 0, s
16380 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63  tate = 0, protoc
16390 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b  ol = 0, atr_len;
163a0 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41  ..BYTE atr[MAX_A
163b0 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20  TR_SIZE];..LONG 
163c0 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72  status_ret, scar
163d0 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c  d_reconn_ret;..L
163e0 50 53 54 52 20 2a 72 65 61 64 65 72 5f 6e 61 6d  PSTR *reader_nam
163f0 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  e;...CACKEY_DEBU
16400 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
16410 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  .");...if (slot-
16420 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43  >internal) {...C
16430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16440 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f  TF("Returning to
16450 6b 65 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74  ken present (int
16460 65 72 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a  ernal token)");.
16470 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
16480 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
16490 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  SENT);..}...pcsc
164a0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
164b0 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
164c0 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70  rd(slot);..if (p
164d0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
164e0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
164f0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
16500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
16510 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20  able to connect 
16520 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
16530 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
16540 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
16550 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
16560 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
16570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16580 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64  F("Calling SCard
16590 53 74 61 74 75 73 28 29 20 74 6f 20 64 65 74 65  Status() to dete
165a0 72 6d 69 6e 65 20 63 61 72 64 20 73 74 61 74 75  rmine card statu
165b0 73 22 29 3b 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d  s");...atr_len =
165c0 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73   sizeof(atr);..s
165d0 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
165e0 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
165f0 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
16600 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
16610 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
16620 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 20  tr, &atr_len);. 
16630 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
16640 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 53 55   == SCARD_E_INSU
16650 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 29  FFICIENT_BUFFER)
16660 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16670 47 5f 50 52 49 4e 54 46 28 22 53 63 61 72 64 53  G_PRINTF("ScardS
16680 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64  tatus() returned
16690 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49   SCARD_E_INSUFFI
166a0 43 49 45 4e 54 5f 42 55 46 46 45 52 2c 20 61 73  CIENT_BUFFER, as
166b0 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61  suming this is a
166c0 20 62 75 67 20 28 65 2e 67 2e 2c 20 47 6f 6f 67   bug (e.g., Goog
166d0 6c 65 20 50 43 53 43 29 20 69 6d 70 6c 65 6d 65  le PCSC) impleme
166e0 6e 74 61 74 69 6f 6e 20 61 6e 64 20 72 65 74 72  ntation and retr
166f0 79 69 6e 67 22 29 3b 0a 0a 09 09 61 74 72 5f 6c  ying");....atr_l
16700 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29  en = sizeof(atr)
16710 3b 0a 0a 09 09 72 65 61 64 65 72 5f 6c 65 6e 20  ;....reader_len 
16720 3d 20 33 32 37 36 38 3b 0a 09 09 72 65 61 64 65  = 32768;...reade
16730 72 5f 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28  r_name = malloc(
16740 72 65 61 64 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09  reader_len);....
16750 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
16760 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
16770 63 73 63 5f 63 61 72 64 2c 20 72 65 61 64 65 72  csc_card, reader
16780 5f 6e 61 6d 65 2c 20 26 72 65 61 64 65 72 5f 6c  _name, &reader_l
16790 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
167a0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
167b0 5f 6c 65 6e 29 3b 0a 0a 09 09 66 72 65 65 28 72  _len);....free(r
167c0 65 61 64 65 72 5f 6e 61 6d 65 29 3b 0a 09 7d 0a  eader_name);..}.
167d0 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
167e0 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41   == SCARD_E_INVA
167f0 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09  LID_HANDLE) {...
16800 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16810 4e 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73  NTF("SCardStatus
16820 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
16830 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
16840 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 61 73 20 6e  LE, marking as n
16850 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65  ot already conne
16860 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20  cted and trying 
16870 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65  again");...cacke
16880 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
16890 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63  t(slot);....pcsc
168a0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
168b0 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
168c0 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28  rd(slot);...if (
168d0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
168e0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
168f0 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
16900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16910 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
16920 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
16930 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
16940 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
16950 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
16960 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
16970 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16980 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20  PRINTF("Calling 
16990 53 43 61 72 64 53 74 61 74 75 73 28 29 20 61 67  SCardStatus() ag
169a0 61 69 6e 22 29 3b 0a 0a 09 09 61 74 72 5f 6c 65  ain");....atr_le
169b0 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b  n = sizeof(atr);
169c0 0a 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ...status_ret = 
169d0 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
169e0 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
169f0 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
16a00 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
16a10 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
16a20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74  );..}...if (stat
16a30 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  us_ret != SCARD_
16a40 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 63  S_SUCCESS) {...c
16a50 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
16a60 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
16a70 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d  if (status_ret =
16a80 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
16a90 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
16aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ab0 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
16ac0 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
16ad0 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
16ae0 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
16af0 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
16b00 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  lot, SCARD_PROTO
16b10 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
16b20 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a 09 09 09  ROTOCOL_T1);....
16b30 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  if (scard_reconn
16b40 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
16b50 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f  SUCCESS) {...../
16b60 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
16b70 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
16b80 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
16b90 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
16ba0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
16bb0 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
16bc0 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
16bd0 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f  epth--;......slo
16be0 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
16bf0 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
16c00 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
16c10 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
16c20 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
16c30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16c40 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
16c50 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69  essful, requeryi
16c60 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73  ng");.....status
16c70 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
16c80 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
16c90 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
16ca0 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
16cb0 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
16cc0 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66  atr_len);.....if
16cd0 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20   (status_ret != 
16ce0 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
16cf0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
16d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69  EBUG_PRINTF("Sti
16d10 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65  ll unable to que
16d20 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
16d30 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
16d40 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
16d50 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
16d60 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
16d70 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
16d80 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
16d90 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
16da0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
16db0 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09  SENT);.....}....
16dc0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
16dd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16de0 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f  ("Unable to reco
16df0 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
16e00 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
16e10 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63  bsent.  SCardRec
16e20 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20  onnect() = %s", 
16e30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
16e40 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
16e50 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  R(scard_reconn_r
16e60 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  et));......retur
16e70 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
16e80 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
16e90 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
16ea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16eb0 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
16ec0 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
16ed0 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
16ee0 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
16ef0 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
16f00 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
16f10 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
16f20 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
16f30 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
16f40 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
16f50 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
16f60 09 69 66 20 28 28 73 74 61 74 65 20 26 20 53 43  .if ((state & SC
16f70 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53  ARD_ABSENT) == S
16f80 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09  CARD_ABSENT) {..
16f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16fa0 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 61 62  INTF("Card is ab
16fb0 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  sent, returning 
16fc0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
16fd0 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
16fe0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
16ff0 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ENT);..}...CACKE
17000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17010 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  Returning token 
17020 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65  present.");...re
17030 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
17040 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
17050 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
17060 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
17070 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
17080 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
17090 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
170a0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
170b0 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
170c0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
170d0 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
170e0 65 74 5f 70 69 6e 28 73 74 72 75 63 74 20 63 61  et_pin(struct ca
170f0 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
17100 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17110 6f 6c 64 5f 70 69 6e 2c 20 75 6e 73 69 67 6e 65  old_pin, unsigne
17120 64 20 6c 6f 6e 67 20 6f 6c 64 5f 70 69 6e 5f 6c  d long old_pin_l
17130 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  en, unsigned cha
17140 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64  r *pin, unsigned
17150 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 29 20 7b   long pin_len) {
17160 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
17170 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
17180 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
17190 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
171a0 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46  ac_pin[8] = {0xF
171b0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
171c0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
171d0 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75   0xFF, 0xFF};..u
171e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 6c 64  nsigned char old
171f0 5f 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30  _cac_pin[8] = {0
17200 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
17210 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
17220 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a  F, 0xFF, 0xFF};.
17230 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70  .unsigned char p
17240 69 6e 5f 75 70 64 61 74 65 5b 73 69 7a 65 6f 66  in_update[sizeof
17250 28 63 61 63 5f 70 69 6e 29 20 2b 20 73 69 7a 65  (cac_pin) + size
17260 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 5d  of(old_cac_pin)]
17270 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
17280 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e   num_certs;..uin
17290 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63  t16_t response_c
172a0 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f  ode;..int tries_
172b0 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20  remaining;..int 
172c0 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b  send_ret;..int k
172d0 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30  ey_reference = 0
172e0 78 30 30 3b 0a 0a 09 2f 2a 20 41 70 70 61 72 65  x00;.../* Appare
172f0 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61  ntly, CAC PINs a
17300 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62  re *EXACTLY* 8 b
17310 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64  ytes long -- pad
17320 20 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f   with 0xFF if to
17330 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
17340 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a  pin_len >= 8) {.
17350 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e  ..memcpy(cac_pin
17360 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c  , pin, 8);..} el
17370 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  se {...memcpy(ca
17380 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f  c_pin, pin, pin_
17390 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f  len);..}...if (o
173a0 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29  ld_pin_len >= 8)
173b0 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f   {...memcpy(old_
173c0 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e  cac_pin, old_pin
173d0 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  , 8);..} else {.
173e0 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f 63 61 63  ..memcpy(old_cac
173f0 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 2c 20 6f  _pin, old_pin, o
17400 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a  ld_pin_len);..}.
17410 0a 09 2f 2a 20 43 6f 6e 63 61 74 65 6e 61 74 65  ../* Concatenate
17420 20 62 6f 74 68 20 50 49 4e 73 20 74 6f 67 65 74   both PINs toget
17430 68 65 72 20 74 6f 20 73 65 6e 64 20 61 73 20 61  her to send as a
17440 20 73 69 6e 67 6c 65 20 69 6e 73 74 72 75 63 74   single instruct
17450 69 6f 6e 20 2a 2f 0a 09 6d 65 6d 63 70 79 28 70  ion */..memcpy(p
17460 69 6e 5f 75 70 64 61 74 65 2c 20 6f 6c 64 5f 63  in_update, old_c
17470 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 6f  ac_pin, sizeof(o
17480 6c 64 5f 63 61 63 5f 70 69 6e 29 29 3b 0a 09 6d  ld_cac_pin));..m
17490 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65  emcpy(pin_update
174a0 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61   + sizeof(old_ca
174b0 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c  c_pin), cac_pin,
174c0 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29   sizeof(cac_pin)
174d0 29 3b 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50  );.../* Reject P
174e0 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 74 6f  INs which are to
174f0 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
17500 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09  pin_len < 5) {..
17510 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17520 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20  INTF("Rejecting 
17530 4e 65 77 20 50 49 4e 20 77 68 69 63 68 20 69 73  New PIN which is
17540 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67   too short (leng
17550 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62  th = %lu, must b
17560 65 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70  e atleast 5)", p
17570 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  in_len);....retu
17580 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
17590 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69  _BADPIN);..}...i
175a0 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3c  f (old_pin_len <
175b0 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   5) {...CACKEY_D
175c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a  EBUG_PRINTF("Rej
175d0 65 63 74 69 6e 67 20 4f 6c 64 20 50 49 4e 20 77  ecting Old PIN w
175e0 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72  hich is too shor
175f0 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c  t (length = %lu,
17600 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74   must be atleast
17610 20 35 29 22 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65   5)", old_pin_le
17620 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  n);....return(CA
17630 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
17640 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56  IN);..}.../* PIV
17650 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
17660 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66 65  uses a "key_refe
17670 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20 2a  rence" of 0x80 *
17680 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  /..pcsc_identiti
17690 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
176a0 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c  _certs(slot, NUL
176b0 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
176c0 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e  .if (num_certs >
176d0 20 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74   0 && pcsc_ident
176e0 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
176f0 0a 09 09 73 77 69 74 63 68 20 28 70 63 73 63 5f  ...switch (pcsc_
17700 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64  identities[0].id
17710 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
17720 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
17730 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  PIV:.....CACKEY_
17740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
17750 20 68 61 76 65 20 50 49 56 20 63 61 72 64 2c 20   have PIV card, 
17760 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65 6d  so we will attem
17770 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61  pt to authentica
17780 74 65 20 75 73 69 6e 67 20 74 68 65 20 50 49 56  te using the PIV
17790 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79   Application key
177a0 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09   reference");...
177b0 09 09 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  ...key_reference
177c0 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 62 72 65   = 0x80;.....bre
177d0 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a  ak;....default:.
177e0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
177f0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
17800 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
17810 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
17820 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75  1);..}.../* Issu
17830 65 20 61 20 53 65 74 20 50 49 4e 20 28 43 48 41  e a Set PIN (CHA
17840 4e 47 45 20 52 45 46 45 52 45 4e 43 45 29 20 2a  NGE REFERENCE) *
17850 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
17860 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
17870 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
17880 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
17890 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46  INSTR_CHANGE_REF
178a0 45 52 45 4e 43 45 2c 20 30 78 30 30 2c 20 6b 65  ERENCE, 0x00, ke
178b0 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a  y_reference, siz
178c0 65 6f 66 28 70 69 6e 5f 75 70 64 61 74 65 29 2c  eof(pin_update),
178d0 20 70 69 6e 5f 75 70 64 61 74 65 2c 20 30 78 30   pin_update, 0x0
178e0 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64  0, &response_cod
178f0 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  e, NULL, NULL);.
17900 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
17910 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
17920 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73  OK) {...if ((res
17930 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36  ponse_code & 0x6
17940 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20  3C0) == 0x63C0) 
17950 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69  {....tries_remai
17960 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65  ning = (response
17970 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09  _code & 0xF);...
17980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17990 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
179a0 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
179b0 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69  %i tries remaini
179c0 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69  ng", tries_remai
179d0 6e 69 6e 67 29 3b 0a 0a 09 09 09 72 65 74 75 72  ning);.....retur
179e0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
179f0 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09  BADPIN);...}....
17a00 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  if (response_cod
17a10 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a 09  e == 0x6983) {..
17a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17a30 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
17a40 20 73 65 74 20 50 49 4e 2c 20 64 65 76 69 63 65   set PIN, device
17a50 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72 20 63 68   is locked or ch
17a60 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e 20 69  anging the PIN i
17a70 73 20 64 69 73 61 62 6c 65 64 22 29 3b 0a 0a 09  s disabled");...
17a80 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
17a90 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a  PCSC_E_LOCKED);.
17aa0 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
17ab0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
17ac0 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
17ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17ae0 50 49 4e 20 43 68 61 6e 67 65 20 73 75 63 63 65  PIN Change succe
17af0 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
17b00 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
17b10 4b 29 3b 0a 0a 09 2f 2a 20 44 69 73 61 62 6c 65  K);.../* Disable
17b20 20 61 20 77 61 72 6e 69 6e 67 2c 20 73 69 6e 63   a warning, sinc
17b30 65 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75  e this is only u
17b40 73 65 64 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  sed in debug mod
17b50 65 20 2a 2f 0a 09 74 72 69 65 73 5f 72 65 6d 61  e */..tries_rema
17b60 69 6e 69 6e 67 20 3d 20 74 72 69 65 73 5f 72 65  ining = tries_re
17b70 6d 61 69 6e 69 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 20  maining;.}../*. 
17b80 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
17b90 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
17ba0 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
17bb0 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
17bc0 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
17bd0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
17be0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
17bf0 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
17c00 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75  ackey_login(stru
17c10 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
17c20 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
17c30 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e  har *pin, unsign
17c40 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c  ed long pin_len,
17c50 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61   int *tries_rema
17c60 69 6e 69 6e 67 5f 70 2c 20 69 6e 74 20 72 65 74  ining_p, int ret
17c70 72 69 65 73 29 20 7b 0a 09 73 74 72 75 63 74 20  ries) {..struct 
17c80 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
17c90 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
17ca0 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
17cb0 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d   char cac_pin[8]
17cc0 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
17cd0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
17ce0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
17cf0 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  FF};..unsigned l
17d00 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
17d10 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
17d20 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
17d30 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
17d40 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e  nt send_ret;..in
17d50 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20  t key_reference 
17d60 3d 20 30 78 30 30 2c 20 68 61 76 65 5f 70 69 76  = 0x00, have_piv
17d70 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65   = 0;..cackey_re
17d80 74 20 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 74  t connect_ret, t
17d90 6f 6b 65 6e 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49  oken_ret;.../* I
17da0 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
17db0 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75  do not know abou
17dc0 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73  t how many tries
17dd0 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a   are remaining *
17de0 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  /..if (tries_rem
17df0 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74  aining_p) {...*t
17e00 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
17e10 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41   = -1;..}.../* A
17e20 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50  pparently, CAC P
17e30 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59  INs are *EXACTLY
17e40 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d  * 8 bytes long -
17e50 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20  - pad with 0xFF 
17e60 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  if too short */.
17e70 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20  .if (pin_len >= 
17e80 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  8) {...memcpy(ca
17e90 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a  c_pin, pin, 8);.
17ea0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
17eb0 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
17ec0 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09   pin_len);..}...
17ed0 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e 73 20 77  /* Reject PINs w
17ee0 68 69 63 68 20 61 72 65 20 74 6f 6f 20 73 68 6f  hich are too sho
17ef0 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c  rt */..if (pin_l
17f00 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b  en < 5) {...CACK
17f10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17f20 22 52 65 6a 65 63 74 69 6e 67 20 50 49 4e 20 77  "Rejecting PIN w
17f30 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72  hich is too shor
17f40 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c  t (length = %lu,
17f50 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74   must be atleast
17f60 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   5)", pin_len);.
17f70 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
17f80 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
17f90 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74  ..}.../* PIV aut
17fa0 68 65 6e 74 69 63 61 74 69 6f 6e 20 75 73 65 73  hentication uses
17fb0 20 61 20 22 6b 65 79 5f 72 65 66 65 72 65 6e 63   a "key_referenc
17fc0 65 22 20 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70  e" of 0x80 */..p
17fd0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
17fe0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
17ff0 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26  ts(slot, NULL, &
18000 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20  num_certs);..if 
18010 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 20 26  (num_certs > 0 &
18020 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  & pcsc_identitie
18030 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73  s != NULL) {...s
18040 77 69 74 63 68 20 28 70 63 73 63 5f 69 64 65 6e  witch (pcsc_iden
18050 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70  tities[0].id_typ
18060 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43  e) {....case CAC
18070 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
18080 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18090 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61 76  G_PRINTF("We hav
180a0 65 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20 77  e PIV card, so w
180b0 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  e will attempt t
180c0 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65 20 75  o authenticate u
180d0 73 69 6e 67 20 74 68 65 20 50 49 56 20 41 70 70  sing the PIV App
180e0 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65 66  lication key ref
180f0 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09 68  erence");......h
18100 61 76 65 5f 70 69 76 20 3d 20 31 3b 0a 09 09 09  ave_piv = 1;....
18110 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75  .break;....defau
18120 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  lt:.....break;..
18130 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65  .}....cackey_fre
18140 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65  e_certs(pcsc_ide
18150 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72  ntities, num_cer
18160 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  ts, 1);..}...if 
18170 28 68 61 76 65 5f 70 69 76 20 3d 3d 20 31 29 20  (have_piv == 1) 
18180 7b 0a 09 09 6b 65 79 5f 72 65 66 65 72 65 6e 63  {...key_referenc
18190 65 20 3d 20 30 78 38 30 3b 0a 09 7d 0a 0a 09 2f  e = 0x80;..}.../
181a0 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72 69  * Issue PIN Veri
181b0 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20  fy */..send_ret 
181c0 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
181d0 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
181e0 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
181f0 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59  CIS_INSTR_VERIFY
18200 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66 65  , 0x00, key_refe
18210 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63 61  rence, sizeof(ca
18220 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c  c_pin), cac_pin,
18230 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65   0x00, &response
18240 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  _code, NULL, NUL
18250 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  L);...if (send_r
18260 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
18270 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28  C_S_OK) {...if (
18280 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
18290 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33   0x63C0) == 0x63
182a0 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72  C0) {....tries_r
182b0 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70  emaining = (resp
182c0 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29  onse_code & 0xF)
182d0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
182e0 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
182f0 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
18300 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d  ed, %i tries rem
18310 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72  aining", tries_r
18320 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69  emaining);.....i
18330 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  f (tries_remaini
18340 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72 69  ng_p) {.....*tri
18350 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d  es_remaining_p =
18360 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
18370 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
18380 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
18390 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09  BADPIN);...}....
183a0 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  if (response_cod
183b0 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a 09  e == 0x6983) {..
183c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
183d0 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
183e0 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
183f0 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64  device is locked
18400 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
18410 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
18420 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  KED);...}....if 
18430 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d  (response_code =
18440 3d 20 30 78 36 64 30 30 29 20 7b 0a 09 09 09 69  = 0x6d00) {....i
18450 66 20 28 72 65 74 72 69 65 73 20 3e 20 30 29 20  f (retries > 0) 
18460 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
18470 55 47 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 49  UG_PRINTF("Got I
18480 53 4f 20 37 38 31 36 20 52 65 73 70 6f 6e 73 65  SO 7816 Response
18490 20 5c 22 36 44 20 30 30 5c 22 20 69 6e 20 72 65   \"6D 00\" in re
184a0 73 70 6f 6e 73 65 20 74 6f 20 61 20 56 45 52 49  sponse to a VERI
184b0 46 59 20 72 65 71 75 65 73 74 2e 22 29 3b 0a 09  FY request.");..
184c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
184d0 50 52 49 4e 54 46 28 22 57 65 20 64 69 64 20 6e  PRINTF("We did n
184e0 6f 74 20 65 78 70 65 63 74 20 74 68 69 73 20 62  ot expect this b
184f0 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
18500 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 4e 49   mentioned in NI
18510 53 54 20 53 50 20 38 30 30 2d 37 33 2d 33 20 50  ST SP 800-73-3 P
18520 61 72 74 20 32 20 53 65 63 74 69 6f 6e 20 33 2e  art 2 Section 3.
18530 32 2e 31 20 6f 72 20 47 53 43 2d 49 53 20 76 32  2.1 or GSC-IS v2
18540 2e 31 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59  .1");.....CACKEY
18550 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57  _DEBUG_PRINTF("W
18560 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 74  e are going to t
18570 72 79 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ry to reset the 
18580 63 61 72 64 20 61 6e 64 20 73 65 6c 65 63 74 20  card and select 
18590 74 68 65 20 61 70 70 6c 65 74 20 61 67 61 69 6e  the applet again
185a0 2e 22 29 3b 0a 0a 09 09 09 09 69 66 20 28 6e 75  .");......if (nu
185b0 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70  m_certs > 0 && p
185c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
185d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 63  = NULL) {......c
185e0 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64  ackey_detect_and
185f0 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70  _select_root_app
18600 6c 65 74 28 73 6c 6f 74 2c 20 70 63 73 63 5f 69  let(slot, pcsc_i
18610 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f  dentities[0].id_
18620 74 79 70 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  type);.....}....
18630 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
18640 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
18650 0a 09 09 09 09 63 6f 6e 6e 65 63 74 5f 72 65 74  .....connect_ret
18660 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
18670 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09  t_card(slot);...
18680 09 09 69 66 20 28 63 6f 6e 6e 65 63 74 5f 72 65  ..if (connect_re
18690 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
186a0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41  _S_OK) {......CA
186b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
186c0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63  F("Unable to rec
186d0 6f 6e 6e 65 63 74 20 61 66 74 65 72 20 72 65 73  onnect after res
186e0 65 74 74 69 6e 67 20 74 68 65 20 63 61 72 64 2c  etting the card,
186f0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
18700 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09 72 65  ror.");.......re
18710 74 75 72 6e 28 63 6f 6e 6e 65 63 74 5f 72 65 74  turn(connect_ret
18720 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
18730 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18740 46 28 22 56 65 72 69 66 79 69 6e 67 20 77 65 20  F("Verifying we 
18750 73 74 69 6c 6c 20 68 61 76 65 20 61 20 74 6f 6b  still have a tok
18760 65 6e 2e 22 29 3b 0a 09 09 09 09 74 6f 6b 65 6e  en.");.....token
18770 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 74 6f  _ret = cackey_to
18780 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 6c 6f 74  ken_present(slot
18790 29 3b 0a 09 09 09 09 69 66 20 28 74 6f 6b 65 6e  );.....if (token
187a0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
187b0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
187c0 4e 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  NT) {......CACKE
187d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
187e0 54 6f 6b 65 6e 20 6e 6f 74 20 70 72 65 73 65 6e  Token not presen
187f0 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  t, returning in 
18800 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 09 09  error.");.......
18810 72 65 74 75 72 6e 28 74 6f 6b 65 6e 5f 72 65 74  return(token_ret
18820 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
18830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18840 46 28 22 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67  F("Trying to log
18850 69 6e 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 09  in again");.....
18860 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 6c 6f  return(cackey_lo
18870 67 69 6e 28 73 6c 6f 74 2c 20 70 69 6e 2c 20 70  gin(slot, pin, p
18880 69 6e 5f 6c 65 6e 2c 20 74 72 69 65 73 5f 72 65  in_len, tries_re
18890 6d 61 69 6e 69 6e 67 5f 70 2c 20 72 65 74 72 69  maining_p, retri
188a0 65 73 20 2d 20 31 29 29 3b 0a 09 09 09 7d 0a 09  es - 1));....}..
188b0 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
188c0 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
188d0 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
188e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
188f0 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
18900 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
18910 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
18920 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
18930 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
18940 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
18950 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
18960 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
18970 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
18980 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
18990 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
189a0 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
189b0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
189c0 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74  _to_label(struct
189d0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
189e0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
189f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18a00 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67  label_buf, unsig
18a10 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62  ned long label_b
18a20 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  uf_len) {..unsig
18a30 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69  ned long certifi
18a40 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20  cate_len;..void 
18a50 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f  *label_asn1;..vo
18a60 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  id *certificate;
18a70 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f  ..int x509_read_
18a80 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61  ret;...certifica
18a90 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  te = identity->c
18aa0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72  ertificate;..cer
18ab0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69  tificate_len = i
18ac0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
18ad0 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  cate_len;...if (
18ae0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
18af0 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
18b00 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
18b10 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
18b20 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
18b30 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
18b40 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a  te_len, (void **
18b50 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a  ) &label_asn1);.
18b60 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
18b70 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  et < 0) {...retu
18b80 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
18b90 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
18ba0 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
18bb0 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
18bc0 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
18bd0 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
18be0 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e  bel_buf_len, "CN
18bf0 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65  ");..if (x509_re
18c00 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
18c10 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
18c20 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69   x509_dn_to_stri
18c30 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78  ng(label_asn1, x
18c40 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63  509_read_ret, (c
18c50 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66  har *) label_buf
18c60 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c  , label_buf_len,
18c70 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78   NULL);....if (x
18c80 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
18c90 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d  0) {....return(-
18ca0 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  1);...}..}..#ifd
18cb0 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
18cc0 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
18cd0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
18ce0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
18cf0 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
18d00 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
18d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30  EBUG_PRINTF("x50
18d20 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65  9_read_ret excee
18d30 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
18d40 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
18d50 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
18d60 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  li, x509_read_re
18d70 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  t = %lu)", (long
18d80 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
18d90 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
18da0 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65  ng) x509_read_re
18db0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
18dc0 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23  );..}.#  endif.#
18dd0 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78  endif...return(x
18de0 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d  509_read_ret);.}
18df0 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
18e00 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
18e10 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
18e20 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64  utex_create(void
18e30 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68   **mutex) {..pth
18e40 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
18e50 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
18e60 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
18e70 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
18e80 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
18e90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
18ea0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
18eb0 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
18ec0 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
18ed0 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
18ee0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
18ef0 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
18f00 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
18f10 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29  *pthread_mutex))
18f20 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64  ;...if (!pthread
18f30 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43  _mutex) {....CAC
18f40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18f50 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f  ("Failed to allo
18f60 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a  cate memory.");.
18f70 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
18f80 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ..}....pthread_r
18f90 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
18fa0 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65  mutex_init(pthre
18fb0 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b  ad_mutex, NULL);
18fc0 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
18fd0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
18fe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18ff0 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
19000 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72  tex_init() retur
19010 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
19020 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
19030 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
19040 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78  );...}....*mutex
19050 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
19060 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  ;..} else {...if
19070 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72   (cackey_args.Cr
19080 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09  eateMutex) {....
19090 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
190a0 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
190b0 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  teMutex(mutex);.
190c0 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
190d0 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
190e0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
190f0 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
19100 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
19110 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
19120 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
19130 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
19140 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
19150 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
19160 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
19170 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19180 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
19190 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
191a0 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
191b0 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
191c0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
191d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f  ey_mutex_lock(vo
191e0 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
191f0 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
19200 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
19210 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
19220 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
19230 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
19240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19250 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
19260 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
19270 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
19280 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
19290 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
192a0 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
192b0 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
192c0 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
192d0 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
192e0 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
192f0 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
19300 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
19310 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19320 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
19330 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72  tex_lock() retur
19340 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
19350 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
19360 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
19370 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
19380 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
19390 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  gs.LockMutex) {.
193a0 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
193b0 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c   = cackey_args.L
193c0 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
193d0 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
193e0 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
193f0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
19400 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
19410 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
19420 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
19430 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
19440 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
19450 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
19460 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
19470 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19480 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
19490 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
194a0 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
194b0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
194c0 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
194d0 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
194e0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76  y_mutex_unlock(v
194f0 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
19500 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
19510 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
19520 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
19530 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
19540 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
19550 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19560 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
19570 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
19580 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
19590 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
195a0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
195b0 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
195c0 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
195d0 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
195e0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
195f0 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
19600 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
19610 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
19620 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19630 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
19640 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20  _mutex_unlock() 
19650 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
19660 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
19670 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
19680 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
19690 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
196a0 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
196b0 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
196c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
196d0 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
196e0 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
196f0 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
19700 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
19710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19720 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
19730 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20  s.UnlockMutex() 
19740 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
19750 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
19760 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
19770 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
19780 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
19790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
197a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
197b0 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
197c0 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
197d0 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42  static CK_ATTRIB
197e0 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67  UTE_PTR cackey_g
197f0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
19800 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62  _OBJECT_CLASS ob
19810 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63  jectclass, struc
19820 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
19830 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
19840 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
19850 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b  identity_num, CK
19860 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
19870 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43  unt) {..static C
19880 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20  K_BBOOL ck_true 
19890 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  = 1;..static CK_
198a0 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d  BBOOL ck_false =
198b0 20 30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54   0;..static CK_T
198c0 52 55 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20  RUST ck_trusted 
198d0 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c  = CK_TRUSTED_DEL
198e0 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e  EGATOR;..CK_ULON
198f0 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20  G numattrs = 0, 
19900 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43  retval_count;..C
19910 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  K_ATTRIBUTE_TYPE
19920 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
19930 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63  ..CK_ATTRIBUTE c
19940 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61  urr_attr, *retva
19950 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  l;..CK_VOID_PTR 
19960 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
19970 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43  G ulValueLen;..C
19980 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63  K_OBJECT_CLASS c
19990 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
199a0 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  .CK_CERTIFICATE_
199b0 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63  TYPE ck_certific
199c0 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45  ate_type;..CK_KE
199d0 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79  Y_TYPE ck_key_ty
199e0 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52  pe;..CK_UTF8CHAR
199f0 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b   ucTmpBuf[1024];
19a00 0a 09 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68  ..SHA1Context sh
19a10 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58  a1_ctx;..MD5_CTX
19a20 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38   md5_ctx;..uint8
19a30 5f 74 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41  _t sha1_hash[SHA
19a40 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e  1HashSize];..uin
19a50 74 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44  t8_t md5_hash[MD
19a60 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73  5HashSize];..uns
19a70 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
19a80 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f  ificate;..ssize_
19a90 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
19aa0 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61  n = -1, x509_rea
19ab0 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c  d_ret;..int pVal
19ac0 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45  ue_free;...CACKE
19ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19ae0 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c  Called (objectCl
19af0 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74  ass = %lu, ident
19b00 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22  ity_num = %lu)."
19b10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19b20 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69  ) objectclass, i
19b30 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09  dentity_num);...
19b40 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  *pulCount = 0;..
19b50 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
19b60 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
19b70 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
19b80 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
19b90 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
19ba0 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
19bb0 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  TE_KEY && object
19bc0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
19bd0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
19be0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19bf0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
19c00 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
19c10 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74  , invalid object
19c20 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74   class");....ret
19c30 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
19c40 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09  /* Get Cert */..
19c50 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
19c60 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
19c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
19c80 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
19c90 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
19ca0 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69  id identiy provi
19cb0 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ded");....return
19cc0 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72  (NULL);..}...cer
19cd0 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
19ce0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
19cf0 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
19d00 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
19d10 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
19d20 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
19d30 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63  e_len == -1 || c
19d40 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55  ertificate == NU
19d50 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
19d60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19d70 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
19d80 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64   (NULL), this id
19d90 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20  entity does not 
19da0 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65  have an X.509 ce
19db0 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
19dc0 61 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64  ated with it and
19dd0 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29   will not work")
19de0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
19df0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66  );..}.../* Verif
19e00 79 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61  y that certifica
19e10 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f  te is ASN.1 enco
19e20 64 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66  ded X.509 certif
19e30 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35  icate */..if (x5
19e40 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72  09_to_serial(cer
19e50 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
19e60 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29  icate_len, NULL)
19e70 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 0) {...CACKEY
19e80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
19e90 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
19ea0 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58  ts (NULL), the X
19eb0 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
19ec0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19ed0 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69   this identity i
19ee0 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a  s not valid");..
19ef0 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
19f00 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e  .}...retval_coun
19f10 74 20 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20  t = 64;..retval 
19f20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f  = malloc(retval_
19f30 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  count * sizeof(*
19f40 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20  retval));...for 
19f50 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
19f60 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  = 0; curr_attr_t
19f70 79 70 65 20 3c 20 30 78 63 65 35 33 36 33 62 66  ype < 0xce5363bf
19f80 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
19f90 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72  ++) {...if (curr
19fa0 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78  _attr_type == 0x
19fb0 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61  800) {....curr_a
19fc0 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35  ttr_type = 0xce5
19fd0 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56  36300;...}....pV
19fe0 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09  alue_free = 0;..
19ff0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1a000 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
1a010 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
1a020 73 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74  switch (curr_att
1a030 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  r_type) {....cas
1a040 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09  e CKA_CLASS:....
1a050 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a060 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1a070 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
1a080 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e  LASS (0x%08lx) .
1a090 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1a0a0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1a0b0 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62  ype);......ck_ob
1a0c0 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a  ject_class = obj
1a0d0 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70  ectclass;......p
1a0e0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65  Value = &ck_obje
1a0f0 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c  ct_class;.....ul
1a100 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1a110 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  f(ck_object_clas
1a120 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  s);......CACKEY_
1a130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1a140 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1a150 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1a160 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1a170 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a  K_OBJECT_CLASS *
1a180 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1a190 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1a1a0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1a1b0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1a1c0 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09  ase CKA_TOKEN:..
1a1d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a1e0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1a1f0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1a200 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29  _TOKEN (0x%08lx)
1a210 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a220 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a230 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
1a240 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
1a250 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a260 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1a270 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1a280 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a290 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1a2a0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1a2b0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1a2c0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1a2d0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1a2e0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1a2f0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1a300 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50  k;....case CKA_P
1a310 52 49 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b  RIVATE:.....CACK
1a320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a330 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1a340 69 62 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54  ibute CKA_PRIVAT
1a350 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
1a360 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a370 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1a380 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1a390 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
1a3a0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1a3b0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1a3c0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1a3d0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1a3e0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1a3f0 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
1a400 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1a410 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1a420 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
1a430 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
1a440 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1a450 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
1a460 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a470 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1a480 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1a490 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1a4a0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
1a4b0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
1a4c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a4d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a4e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a4f0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1a500 53 54 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  STED:.....CACKEY
1a510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a520 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1a530 75 74 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20  ute CKA_TRUSTED 
1a540 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1a550 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a560 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1a570 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1a580 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
1a590 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1a5a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a5b0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1a5c0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1a5d0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1a5e0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1a5f0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1a600 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1a610 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1a620 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
1a630 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1a640 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
1a650 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a660 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1a670 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1a680 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a690 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1a6a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1a6b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a6c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1a6d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1a6e0 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
1a6f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a700 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1a710 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1a720 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30  KA_MODIFIABLE (0
1a730 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1a740 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1a750 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1a760 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1a770 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
1a780 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1a790 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
1a7a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a7b0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1a7c0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1a7d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1a7e0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1a7f0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1a800 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1a810 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1a820 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1a830 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09  ase CKA_LABEL:..
1a840 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a850 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1a860 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1a870 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29  _LABEL (0x%08lx)
1a880 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a890 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a8a0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1a8b0 28 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79  (identity->id_ty
1a8c0 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f  pe == CACKEY_ID_
1a8d0 54 59 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09  TYPE_PIV) {.....
1a8e0 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
1a8f0 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62  ty->card.piv.lab
1a900 65 6c 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  el;......ulValue
1a910 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61  Len = strlen(pVa
1a920 6c 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  lue);.....} else
1a930 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c   {......ulValueL
1a940 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63  en = snprintf((c
1a950 68 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c  har *) ucTmpBuf,
1a960 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66   sizeof(ucTmpBuf
1a970 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c  ), "Identity #%l
1a980 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
1a990 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ng) identity_num
1a9a0 29 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
1a9b0 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09   ucTmpBuf;......
1a9c0 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20  .if (ulValueLen 
1a9d0 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42  >= sizeof(ucTmpB
1a9e0 75 66 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56  uf)) {.......ulV
1a9f0 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09  alueLen = 0;....
1aa00 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
1aa10 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
1aa20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1aa30 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1aa40 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
1aa50 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
1aa60 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1aa70 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1aa80 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1aa90 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45  VALUE:.....CACKE
1aaa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1aab0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1aac0 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28  bute CKA_VALUE (
1aad0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1aae0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1aaf0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1ab00 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a  .....switch (obj
1ab10 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09  ectclass) {.....
1ab20 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54  .case CKO_PRIVAT
1ab30 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43  E_KEY:.......CAC
1ab40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ab50 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1ab60 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1ab70 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61  e we are a priva
1ab80 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09  te key.");......
1ab90 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
1aba0 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  se CKO_NETSCAPE_
1abb0 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43  TRUST:.......CAC
1abc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1abd0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1abe0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1abf0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
1ac00 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1ac10 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
1ac20 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
1ac30 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09  PUBLIC_KEY:.....
1ac40 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
1ac50 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
1ac60 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
1ac70 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62  et = x509_to_pub
1ac80 6b 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c  key(certificate,
1ac90 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1aca0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
1acb0 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
1acc0 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09  _ret < 0) { ....
1acd0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
1ace0 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73  LL;........} els
1acf0 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61  e {.........ulVa
1ad00 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
1ad10 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d  ad_ret;........}
1ad20 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09  .......}........
1ad30 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
1ad40 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
1ad50 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  :.......pValue =
1ad60 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09   certificate;...
1ad70 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1ad80 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1ad90 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
1ada0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
1adb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1adc0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1add0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
1ade0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1adf0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1ae00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1ae10 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09   CKA_ISSUER:....
1ae20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ae30 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1ae40 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
1ae50 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20  SSUER (0x%08lx) 
1ae60 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1ae70 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1ae80 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1ae90 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1aea0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
1aeb0 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
1aec0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1aed0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1aee0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1aef0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1af00 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1af10 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
1af20 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74  rtificate or Net
1af30 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1af40 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1af50 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
1af60 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
1af70 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
1af80 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
1af90 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65  509_to_issuer(ce
1afa0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
1afb0 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
1afc0 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
1afd0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
1afe0 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
1aff0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
1b000 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
1b010 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
1b020 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
1b030 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
1b040 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b050 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1b060 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
1b070 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b080 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b090 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1b0a0 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
1b0b0 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
1b0c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1b0d0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1b0e0 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
1b0f0 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BER (0x%08lx) ..
1b100 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1b110 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1b120 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1b130 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
1b140 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
1b150 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1b160 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1b170 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1b180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b190 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b1a0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b1b0 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
1b1c0 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63  ificate or Netsc
1b1d0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1b1e0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1b1f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
1b200 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
1b210 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
1b220 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
1b230 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
1b240 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1b250 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
1b260 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
1b270 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
1b280 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
1b290 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
1b2a0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
1b2b0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
1b2c0 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
1b2d0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1b2e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1b2f0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
1b300 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
1b310 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b320 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b330 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1b340 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09   CKA_SUBJECT:...
1b350 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b360 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1b370 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1b380 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78  SUBJECT (0x%08lx
1b390 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b3a0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b3b0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1b3c0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
1b3d0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
1b3e0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1b3f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1b400 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1b410 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1b420 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
1b430 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09  ficate");.......
1b440 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1b450 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
1b460 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
1b470 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
1b480 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65   = x509_to_subje
1b490 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ct(certificate, 
1b4a0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
1b4b0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
1b4c0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
1b4d0 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
1b4e0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1b4f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1b500 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
1b510 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
1b520 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
1b530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b540 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1b550 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
1b560 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1b570 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1b580 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1b590 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09  .case CKA_ID:...
1b5a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b5b0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1b5c0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1b5d0 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ID (0x%08lx) ...
1b5e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1b5f0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1b600 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1b610 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1b620 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1b630 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1b640 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1b650 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1b660 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1b670 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
1b680 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1b690 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1b6a0 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30  ......ucTmpBuf[0
1b6b0 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e  ] = ((identity_n
1b6c0 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20  um + 1) >> 8) & 
1b6d0 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42  0xff;.....ucTmpB
1b6e0 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69  uf[1] =  (identi
1b6f0 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78  ty_num + 1) & 0x
1b700 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ff;......pValue 
1b710 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09  = &ucTmpBuf;....
1b720 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b  .ulValueLen = 2;
1b730 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b740 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b750 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
1b760 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
1b770 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1b780 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1b790 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1b7a0 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
1b7b0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1b7c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1b7d0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1b7e0 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
1b7f0 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TYPE (0x%08lx) .
1b800 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1b810 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1b820 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1b830 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
1b840 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
1b850 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1b860 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1b870 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1b880 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1b890 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
1b8a0 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
1b8b0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1b8c0 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
1b8d0 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61  rt one certifica
1b8e0 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  te type */.....c
1b8f0 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
1b900 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a  pe = CKC_X_509;.
1b910 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1b920 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
1b930 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
1b940 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63  en = sizeof(ck_c
1b950 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29  ertificate_type)
1b960 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1b970 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1b980 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58   returning CKC_X
1b990 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25  _509 (%lu) (%p/%
1b9a0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1b9b0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54  long) *((CK_CERT
1b9c0 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20  IFICATE_TYPE *) 
1b9d0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
1b9e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b9f0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1ba00 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1ba10 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a  e CKA_KEY_TYPE:.
1ba20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ba30 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1ba40 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1ba50 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30  A_KEY_TYPE (0x%0
1ba60 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1ba70 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1ba80 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1ba90 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1baa0 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
1bab0 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
1bac0 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
1bad0 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43  _KEY) {......CAC
1bae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1baf0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1bb00 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1bb10 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b  e we are not a k
1bb20 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ey.");.......bre
1bb30 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
1bb40 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
1bb50 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a  t one key type *
1bb60 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70  /.....ck_key_typ
1bb70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09  e = CKK_RSA;....
1bb80 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b  ..pValue = &ck_k
1bb90 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56  ey_type;.....ulV
1bba0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1bbb0 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a  (ck_key_type);..
1bbc0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1bbd0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1bbe0 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20  turning CKK_RSA 
1bbf0 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
1bc00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1bc10 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
1bc20 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
1bc30 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1bc40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1bc50 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1bc60 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1bc70 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45  _SIGN:.....CACKE
1bc80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bc90 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1bca0 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30  bute CKA_SIGN (0
1bcb0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1bcc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1bcd0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1bce0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1bcf0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
1bd00 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1bd10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bd20 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1bd30 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1bd40 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1bd50 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1bd60 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1bd70 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1bd80 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1bd90 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
1bda0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
1bdb0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
1bdc0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1bdd0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
1bde0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
1bdf0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1be00 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
1be10 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1be20 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
1be30 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1be40 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1be50 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1be60 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1be70 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1be80 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1be90 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1bea0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1beb0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1bec0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
1bed0 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
1bee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bef0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1bf00 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
1bf10 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25  IGN_RECOVER (0x%
1bf20 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1bf30 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1bf40 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1bf50 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1bf60 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1bf70 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1bf80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bf90 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1bfa0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1bfb0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1bfc0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1bfd0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1bfe0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
1bff0 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f  * We currently o
1c000 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67  nly support "Sig
1c010 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22  n with Appendix"
1c020 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d   */.....pValue =
1c030 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
1c040 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1c050 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
1c060 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c070 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1c080 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
1c090 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1c0a0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
1c0b0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
1c0c0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1c0d0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1c0e0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1c0f0 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
1c100 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPT:.....CACKEY_
1c110 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1c120 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1c130 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28  te CKA_DECRYPT (
1c140 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1c150 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1c160 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1c170 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1c180 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
1c190 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1c1a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c1b0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1c1c0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1c1d0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
1c1e0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1c1f0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1c200 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1c210 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1c220 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
1c230 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c  _KEY || objectcl
1c240 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass == CKO_PUBLI
1c250 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  C_KEY) {......pV
1c260 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
1c270 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1c280 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
1c290 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
1c2a0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1c2b0 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
1c2c0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1c2d0 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
1c2e0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1c2f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1c300 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1c310 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1c320 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1c330 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1c340 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1c350 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1c360 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1c370 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1c380 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09  _SENSITIVE:.....
1c390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c3a0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1c3b0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45  attribute CKA_SE
1c3c0 4e 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78  NSITIVE (0x%08lx
1c3d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1c3e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1c3f0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1c400 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1c410 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1c420 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1c430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c440 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1c450 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1c460 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1c470 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1c480 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1c490 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
1c4a0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1c4b0 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
1c4c0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1c4d0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
1c4e0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1c4f0 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
1c500 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
1c510 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1c520 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1c530 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
1c540 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
1c550 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c560 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1c570 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
1c580 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1c590 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
1c5a0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1c5b0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1c5c0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1c5d0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c5e0 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54  case CKA_EXTRACT
1c5f0 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
1c600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1c610 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1c620 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ute CKA_EXTRACTA
1c630 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
1c640 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1c650 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1c660 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1c670 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1c680 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1c690 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1c6a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1c6b0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1c6c0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1c6d0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1c6e0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1c6f0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1c700 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
1c710 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
1c720 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
1c730 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
1c740 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
1c750 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1c760 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
1c770 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
1c780 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
1c790 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1c7a0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
1c7b0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
1c7c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c7d0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1c7e0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1c7f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c800 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1c810 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1c820 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c830 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1c840 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1c850 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09   CKA_MODULUS:...
1c860 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c870 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1c880 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1c890 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78  MODULUS (0x%08lx
1c8a0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1c8b0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1c8c0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1c8d0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1c8e0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1c8f0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1c900 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c910 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1c920 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1c930 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1c940 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1c950 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1c960 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1c970 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1c980 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1c990 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1c9a0 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74  _to_modulus(cert
1c9b0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1c9c0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
1c9d0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
1c9e0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
1c9f0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
1ca00 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
1ca10 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
1ca20 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
1ca30 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
1ca40 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1ca50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1ca60 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
1ca70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
1ca80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1ca90 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1caa0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1cab0 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
1cac0 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  NENT:.....CACKEY
1cad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1cae0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1caf0 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ute CKA_PUBLIC_E
1cb00 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78  XPONENT (0x%08lx
1cb10 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1cb20 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1cb30 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1cb40 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1cb50 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1cb60 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1cb70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cb80 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1cb90 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1cba0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1cbb0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1cbc0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1cbd0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1cbe0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
1cbf0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
1cc00 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
1cc10 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72  _to_exponent(cer
1cc20 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
1cc30 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
1cc40 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
1cc50 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
1cc60 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
1cc70 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
1cc80 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
1cc90 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
1cca0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
1ccb0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1ccc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1ccd0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
1cce0 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
1ccf0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1cd00 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1cd10 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1cd20 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49  e CKA_TRUST_DIGI
1cd30 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09  TAL_SIGNATURE:..
1cd40 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1cd50 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e  _NON_REPUDIATION
1cd60 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1cd70 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52  UST_KEY_ENCIPHER
1cd80 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b  MENT:....case CK
1cd90 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43  A_TRUST_DATA_ENC
1cda0 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61  IPHERMENT:....ca
1cdb0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
1cdc0 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63  _AGREEMENT:....c
1cdd0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
1cde0 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09  Y_CERT_SIGN:....
1cdf0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
1ce00 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65  RL_SIGN:....case
1ce10 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45   CKA_TRUST_SERVE
1ce20 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20  R_AUTH:....case 
1ce30 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54  CKA_TRUST_CLIENT
1ce40 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
1ce50 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49  KA_TRUST_CODE_SI
1ce60 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43  GNING:....case C
1ce70 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
1ce80 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43  ROTECTION:.....C
1ce90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cea0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1ceb0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
1cec0 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29  ST_... (0x%08lx)
1ced0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1cee0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1cef0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
1cf00 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65  lue = &ck_truste
1cf10 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  d;.....ulValueLe
1cf20 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1cf30 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43  usted);......CAC
1cf40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cf50 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1cf60 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1cf70 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1cf80 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70  *((CK_TRUST *) p
1cf90 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1cfa0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1cfb0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1cfc0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1cfd0 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48   CKA_CERT_SHA1_H
1cfe0 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASH:.....CACKEY_
1cff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1d000 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1d010 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31  te CKA_CERT_SHA1
1d020 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20  _HASH (0x%08lx) 
1d030 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1d040 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1d050 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1d060 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
1d070 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1d080 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1d090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1d0a0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1d0b0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1d0c0 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73  e are not a Nets
1d0d0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
1d0e0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
1d0f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41  ;.....}......SHA
1d100 31 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78  1Reset(&sha1_ctx
1d110 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74  );.....SHA1Input
1d120 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74  (&sha1_ctx, cert
1d130 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1d140 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53  cate_len);.....S
1d150 48 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f  HA1Result(&sha1_
1d160 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b  ctx, sha1_hash);
1d170 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73  ......pValue = s
1d180 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c  ha1_hash;.....ul
1d190 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1d1a0 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09  f(sha1_hash);...
1d1b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d1c0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1d1d0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1d1e0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1d1f0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1d200 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1d210 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
1d220 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09  T_MD5_HASH:.....
1d230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d240 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1d250 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
1d260 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25  RT_MD5_HASH (0x%
1d270 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1d280 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1d290 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1d2a0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1d2b0 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
1d2c0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1d2d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d2e0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1d2f0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1d300 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1d310 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1d320 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1d330 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1d340 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f  ...MD5Init(&md5_
1d350 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64  ctx);.....MD5Upd
1d360 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65  ate(&md5_ctx, ce
1d370 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
1d380 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
1d390 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61  .MD5Final(md5_ha
1d3a0 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a  sh, &md5_ctx);..
1d3b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35  ....pValue = md5
1d3c0 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c  _hash;.....ulVal
1d3d0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d  ueLen = sizeof(m
1d3e0 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43  d5_hash);......C
1d3f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d400 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1d410 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
1d420 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1d430 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1d440 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1d450 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61  default:.....pVa
1d460 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1d470 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
1d480 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62  _LONG) -1;.....b
1d490 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
1d4a0 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61  (((CK_LONG) ulVa
1d4b0 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f  lueLen) != ((CK_
1d4c0 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09  LONG) -1)) {....
1d4d0 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74  /* Push curr_att
1d4e0 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
1d4f0 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72   */....curr_attr
1d500 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74  .type = curr_att
1d510 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f  r_type;....curr_
1d520 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20  attr.ulValueLen 
1d530 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  = ulValueLen;...
1d540 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  ..curr_attr.pVal
1d550 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  ue = malloc(curr
1d560 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
1d570 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  );....memcpy(cur
1d580 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70  r_attr.pValue, p
1d590 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
1d5a0 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  .ulValueLen);...
1d5b0 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65  ..if (pValue_fre
1d5c0 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
1d5d0 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b  ...free(pValue);
1d5e0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75  ....}.....if (nu
1d5f0 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c  mattrs >= retval
1d600 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65  _count) {.....re
1d610 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
1d620 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
1d630 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
1d640 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09  tval));....}....
1d650 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b  .memcpy(&retval[
1d660 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72  numattrs], &curr
1d670 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75  _attr, sizeof(cu
1d680 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75  rr_attr));....nu
1d690 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d  mattrs++;...}..}
1d6a0 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
1d6b0 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c  != 0) {...retval
1d6c0 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  _count = numattr
1d6d0 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65  s;...retval = re
1d6e0 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
1d6f0 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
1d700 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
1d710 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28  } else {...free(
1d720 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76  retval);....retv
1d730 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  al = NULL;..}...
1d740 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61  *pulCount = numa
1d750 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ttrs;...CACKEY_D
1d760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1d770 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63  urning %lu objec
1d780 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74  ts (%p).", numat
1d790 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65  trs, (void *) re
1d7a0 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
1d7b0 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
1d7c0 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
1d7d0 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73  ree_identities(s
1d7e0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1d7f0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
1d800 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
1d810 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
1d820 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
1d830 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
1d840 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1d850 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a  _idx, attr_idx;.
1d860 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1d870 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e   == NULL || iden
1d880 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20  tities_count == 
1d890 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  0) {...return;..
1d8a0 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20  }...for (id_idx 
1d8b0 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64  = 0; id_idx < id
1d8c0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20  entities_count; 
1d8d0 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  id_idx++) {...if
1d8e0 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   (identities[id_
1d8f0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
1d900 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f   {....for (attr_
1d910 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
1d920 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69  x < identities[i
1d930 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1d940 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64  s_count; attr_id
1d950 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f  x++) {.....curr_
1d960 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69  attr = &identiti
1d970 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1d980 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b  butes[attr_idx];
1d990 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
1d9a0 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09  ttr->pValue) {..
1d9b0 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74  ....free(curr_at
1d9c0 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09  tr->pValue);....
1d9d0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
1d9e0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1d9f0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
1da00 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69  .....free(identi
1da10 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1da20 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a  ributes);....}..
1da30 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1da40 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b  erts(identities[
1da50 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1da60 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09  ntity, 1, 1);...
1da70 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e  }..}...free(iden
1da80 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74  tities);.}..stat
1da90 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
1daa0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1dab0 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1dac0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1dad0 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20  ty *identities, 
1dae0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1daf0 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09  m_dod_certs) {..
1db00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
1db10 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d  rt_idx, id_idx =
1db20 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69   0;...if (identi
1db30 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
1db40 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64  ..return(num_dod
1db50 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a  _certs * 3);..}.
1db60 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
1db70 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
1db80 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63  num_dod_certs; c
1db90 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69  ert_idx++) {...i
1dba0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1dbb0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1dbc0 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
1dbd0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1dbe0 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1dbf0 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1dc00 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c  CKO_CERTIFICATE,
1dc10 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1dc20 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1dc30 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1dc40 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1dc50 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1dc60 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a  );...id_idx++;..
1dc70 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1dc80 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1dc90 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
1dca0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1dcb0 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
1dcc0 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
1dcd0 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  es(CKO_PUBLIC_KE
1dce0 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b  Y, &extra_certs[
1dcf0 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30  cert_idx], 0xf00
1dd00 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  0 | cert_idx, &i
1dd10 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1dd20 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1dd30 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b  nt);...id_idx++;
1dd40 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1dd50 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1dd60 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  tity = NULL;...i
1dd70 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1dd80 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1dd90 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1dda0 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50  utes(CKO_NETSCAP
1ddb0 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f  E_TRUST, &extra_
1ddc0 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1ddd0 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1dde0 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1ddf0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1de00 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1de10 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75  idx++;..}...retu
1de20 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73  rn(id_idx);.}..s
1de30 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
1de40 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  key_identity *ca
1de50 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
1de60 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1de70 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
1de80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64  nsigned long *id
1de90 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75  s_found) {..stru
1dea0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
1deb0 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
1dec0 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63  entities;..struc
1ded0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1dee0 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
1def0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
1df00 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63  m_ids, id_idx, c
1df10 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e  urr_id_type;..un
1df20 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1df30 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63  certs, num_dod_c
1df40 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
1df50 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74  .int include_ext
1df60 72 61 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e  ra_certs = 0, in
1df70 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b  clude_dod_certs;
1df80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1df90 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1dfa0 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75  );...if (ids_fou
1dfb0 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
1dfc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dfd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73  NTF("Error.  ids
1dfe0 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29  _found is NULL")
1dff0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
1e000 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
1e010 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49  CKEY_CARD_SLOT_I
1e020 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52  NCLUDE_EXTRA_CER
1e030 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  TS..include_extr
1e040 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e  a_certs = 1;.#en
1e050 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
1e060 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52  ("CACKEY_DOD_CER
1e070 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
1e080 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1e090 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1e0a0 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 1;..}...if (
1e0b0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
1e0c0 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  O_DOD_CERTS_ON_H
1e0d0 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
1e0e0 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
1e0f0 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a  xtra_certs = 0;.
1e100 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1e110 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1e120 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1e130 43 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53  CKEY_EXTRA_CERTS
1e140 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1e150 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1e160 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 1;..} else {
1e170 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1e180 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c  erts = 0;..}.#el
1e190 73 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  se..if (getenv("
1e1a0 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1e1b0 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1e1c0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1e1d0 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65  _certs = 0;..} e
1e1e0 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1e1f0 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1e200 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69  }.#endif...if (i
1e210 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1e220 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  ) {...num_dod_ce
1e230 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74  rts = sizeof(ext
1e240 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65  ra_certs) / size
1e250 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30  of(extra_certs[0
1e260 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ]);..} else {...
1e270 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  num_dod_certs = 
1e280 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  0;..}...if (slot
1e290 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ->internal) {...
1e2a0 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
1e2b0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1e2c0 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64  ties(NULL, num_d
1e2d0 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66  od_certs);....if
1e2e0 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20   (num_ids != 0) 
1e2f0 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  {....identities 
1e300 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1e310 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1e320 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63  ities));.....cac
1e330 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1e340 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69  ntities(identiti
1e350 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  es, num_dod_cert
1e360 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
1e370 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ..identities = N
1e380 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73  ULL;...}....*ids
1e390 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
1e3a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
1e3b0 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63  tities);..}...pc
1e3c0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
1e3d0 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
1e3e0 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e  s(slot, NULL, &n
1e3f0 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
1e400 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1e410 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  != NULL) {.../* 
1e420 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f  Convert number o
1e430 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65  f Certs to numbe
1e440 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  r of objects */.
1e450 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
1e460 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
1e470 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
1e480 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
1e490 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  ....if (include_
1e4a0 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09  extra_certs) {..
1e4b0 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63  ..num_ids += cac
1e4c0 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1e4d0 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75  ntities(NULL, nu
1e4e0 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09  m_dod_certs);...
1e4f0 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20  }....identities 
1e500 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1e510 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1e520 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41  ities));..../* A
1e530 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c  dd certificates,
1e540 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e   public keys, an
1e550 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66  d private keys f
1e560 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72  rom the smartcar
1e570 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20  d */...id_idx = 
1e580 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
1e590 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
1e5a0 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65   < num_certs; ce
1e5b0 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66  rt_idx++) {....f
1e5c0 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
1e5d0 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
1e5e0 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
1e5f0 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
1e600 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
1e610 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74  e++) {.....ident
1e620 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1e630 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1e640 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1e650 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
1e660 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1e670 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
1e680 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1e690 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1e6a0 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
1e6b0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1e6c0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1e6d0 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
1e6e0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
1e6f0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1e700 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70  ity));.....memcp
1e710 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
1e720 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1e730 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  ty, &pcsc_identi
1e740 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1e750 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1e760 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1e770 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  identity));.....
1e780 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1e790 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1e7a0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  y->certificate =
1e7b0 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65   malloc(pcsc_ide
1e7c0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1e7d0 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1e7e0 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69  n);.....memcpy(i
1e7f0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1e800 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
1e810 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  >certificate, pc
1e820 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1e830 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1e840 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
1e850 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1e860 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1e870 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  ......id_idx++;.
1e880 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1e890 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1e8a0 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  rts) {....CACKEY
1e8b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1e8c0 6e 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65  ncluding US Gove
1e8d0 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1e8e0 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20  tes on hardware 
1e8f0 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b  slot");.....cack
1e900 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1e910 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65  tities(identitie
1e920 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f  s + id_idx, num_
1e930 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
1e940 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1e950 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
1e960 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
1e970 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
1e980 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
1e990 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
1e9a0 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64 73 5f 66  es);..}...*ids_f
1e9b0 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72  ound = 0;..retur
1e9c0 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73 74 61 74  n(NULL);.}..stat
1e9d0 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
1e9e0 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 63 68 61  ckey_get_pin(cha
1e9f0 72 20 2a 70 69 6e 62 75 66 29 20 7b 0a 09 46 49  r *pinbuf) {..FI
1ea00 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72  LE *pinfd;..char
1ea10 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e   *fgets_ret;..in
1ea20 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09  t pclose_ret;...
1ea30 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  if (cackey_pin_c
1ea40 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20  ommand == NULL) 
1ea50 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  {...return(CACKE
1ea60 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
1ea70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62  );..}...if (pinb
1ea80 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
1ea90 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
1eaa0 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
1eab0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1eac0 5f 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59 5f  _PRINTF("CACKEY_
1ead0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25 73  PIN_COMMAND = %s
1eae0 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ", cackey_pin_co
1eaf0 6d 6d 61 6e 64 29 3b 0a 0a 09 70 69 6e 66 64 20  mmand);...pinfd 
1eb00 3d 20 70 6f 70 65 6e 28 63 61 63 6b 65 79 5f 70  = popen(cackey_p
1eb10 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 22 72 22 29  in_command, "r")
1eb20 3b 0a 09 69 66 20 28 70 69 6e 66 64 20 3d 3d 20  ;..if (pinfd == 
1eb30 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1eb40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eb50 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c  rror.  %s: Unabl
1eb60 65 20 74 6f 20 72 75 6e 22 2c 20 63 61 63 6b 65  e to run", cacke
1eb70 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a  y_pin_command);.
1eb80 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
1eb90 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
1eba0 0a 09 7d 0a 0a 09 66 67 65 74 73 5f 72 65 74 20  ..}...fgets_ret 
1ebb0 3d 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c 20  = fgets(pinbuf, 
1ebc0 33 32 2c 20 70 69 6e 66 64 29 3b 0a 09 69 66 20  32, pinfd);..if 
1ebd0 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55  (fgets_ret == NU
1ebe0 4c 4c 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b 30  LL) {...pinbuf[0
1ebf0 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 70  ] = '\0';..}...p
1ec00 63 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f  close_ret = pclo
1ec10 73 65 28 70 69 6e 66 64 29 3b 0a 09 69 66 20 28  se(pinfd);..if (
1ec20 70 63 6c 6f 73 65 5f 72 65 74 20 3d 3d 20 2d 31  pclose_ret == -1
1ec30 20 26 26 20 65 72 72 6e 6f 20 3d 3d 20 45 43 48   && errno == ECH
1ec40 49 4c 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ILD) {...CACKEY_
1ec50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
1ec60 74 69 63 65 2e 20 20 70 63 6c 6f 73 65 28 29 20  tice.  pclose() 
1ec70 69 6e 64 69 63 61 74 65 64 20 69 74 20 63 6f 75  indicated it cou
1ec80 6c 64 20 6e 6f 74 20 67 65 74 20 74 68 65 20 73  ld not get the s
1ec90 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 68 69  tatus of the chi
1eca0 6c 64 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20  ld, assuming it 
1ecb0 73 75 63 63 65 65 65 64 65 64 20 21 22 29 3b 0a  succeeeded !");.
1ecc0 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20  ...pclose_ret = 
1ecd0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 63 6c 6f  0;..}...if (pclo
1ece0 73 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  se_ret != 0) {..
1ecf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ed00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73  INTF("Error.  %s
1ed10 3a 20 65 78 69 74 65 64 20 77 69 74 68 20 6e 6f  : exited with no
1ed20 6e 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f 66  n-zero status of
1ed30 20 25 69 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e   %i", cackey_pin
1ed40 5f 63 6f 6d 6d 61 6e 64 2c 20 70 63 6c 6f 73 65  _command, pclose
1ed50 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
1ed60 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
1ed70 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20  ADPIN);..}...if 
1ed80 28 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20  (strlen(pinbuf) 
1ed90 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 1) {...CACKEY_
1eda0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1edb0 72 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72 6e  ror.  %s: return
1edc0 65 64 20 6e 6f 20 64 61 74 61 22 2c 20 63 61 63  ed no data", cac
1edd0 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29  key_pin_command)
1ede0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
1edf0 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
1ee00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 69 6e 62  );..}...if (pinb
1ee10 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66  uf[strlen(pinbuf
1ee20 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20  ) - 1] == '\n') 
1ee30 7b 0a 09 09 70 69 6e 62 75 66 5b 73 74 72 6c 65  {...pinbuf[strle
1ee40 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d  n(pinbuf) - 1] =
1ee50 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 72 65 74 75   '\0';..}...retu
1ee60 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
1ee70 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1ee80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1ee90 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29  V, C_Initialize)
1eea0 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e  (CK_VOID_PTR pIn
1eeb0 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f  itArgs) {..CK_C_
1eec0 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20  INITIALIZE_ARGS 
1eed0 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69  CK_PTR args;..ui
1eee0 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67 68  nt32_t idx, high
1eef0 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d  est_slot;..int m
1ef00 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 09  utex_init_ret;..
1ef10 69 6e 74 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  int include_dod_
1ef20 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  certs;...CACKEY_
1ef30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1ef40 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
1ef50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1ef60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1ef70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ef80 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74  r.  Already init
1ef90 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1efa0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1efb0 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49  KI_ALREADY_INITI
1efc0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1efd0 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e   (pInitArgs != N
1efe0 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20  ULL) {...args = 
1eff0 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d  pInitArgs;...mem
1f000 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73  cpy(&cackey_args
1f010 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63  , args, sizeof(c
1f020 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09  ackey_args));...
1f030 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
1f040 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  eMutex == NULL |
1f050 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
1f060 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
1f070 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
1f080 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
1f090 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  >UnlockMutex == 
1f0a0 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61  NULL) {....if (a
1f0b0 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
1f0c0 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
1f0d0 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21  ->DestroyMutex !
1f0e0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1f0f0 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  LockMutex != NUL
1f100 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
1f110 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20  kMutex != NULL) 
1f120 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
1f130 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f140 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20  . Some, but not 
1f150 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72  All threading pr
1f160 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 65  imitives provide
1f170 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
1f180 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1f190 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  BAD);....}...}..
1f1a0 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
1f1b0 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
1f1c0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1f1d0 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79  key_args.Destroy
1f1e0 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1f1f0 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
1f200 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1f210 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
1f220 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
1f230 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ..cackey_args.fl
1f240 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ags = 0;..}...fo
1f250 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1f260 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1f270 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1f280 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1f290 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1f2a0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
1f2b0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
1f2c0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
1f2d0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1f2e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f2f0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1f300 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1f310 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b   idx++) {...cack
1f320 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
1f330 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b  tive = 0;...cack
1f340 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1f350 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
1f360 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1f370 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
1f380 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63  n_depth = 0;...c
1f390 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1f3a0 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
1f3b0 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
1f3c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1f3d0 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  x].slot_reset = 
1f3e0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1f3f0 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  s[idx].token_fla
1f400 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  gs = 0;...cackey
1f410 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
1f420 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  l = NULL;...cack
1f430 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e  ey_slots[idx].in
1f440 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 63 61  ternal = 0;...ca
1f450 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1f460 69 64 5f 74 79 70 65 5f 68 69 6e 74 20 3d 20 43  id_type_hint = C
1f470 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e  ACKEY_ID_TYPE_UN
1f480 4b 4e 4f 57 4e 3b 0a 09 7d 0a 0a 23 69 66 64 65  KNOWN;..}..#ifde
1f490 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52  f CACKEY_NO_EXTR
1f4a0 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65 74  A_CERTS..if (get
1f4b0 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52  env("CACKEY_EXTR
1f4c0 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c  A_CERTS") != NUL
1f4d0 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  L) {...include_d
1f4e0 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d  od_certs = 1;..}
1f4f0 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64   else {...includ
1f500 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  e_dod_certs = 0;
1f510 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67  ..}.#else..if (g
1f520 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
1f530 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
1f540 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1f550 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1f560 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  0;..} else {...i
1f570 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1f580 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a   = 1;..}.#endif.
1f590 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f  ..if (include_do
1f5a0 64 5f 63 65 72 74 73 20 3d 3d 20 30 29 20 7b 0a  d_certs == 0) {.
1f5b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f5c0 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f 74  RINTF("Asked not
1f5d0 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44 20   to include DoD 
1f5e0 63 65 72 74 69 66 69 63 61 74 65 73 22 29 3b 0a  certificates");.
1f5f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69 67 68  .} else {...high
1f600 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65  est_slot = (size
1f610 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1f620 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1f630 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b  _slots[0])) - 1;
1f640 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1f650 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69  _PRINTF("Includi
1f660 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69 6e 20  ng DoD certs in 
1f670 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69  slot %lu", (unsi
1f680 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67 68 65  gned long) highe
1f690 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63  st_slot);....cac
1f6a0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1f6b0 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d  t_slot].active =
1f6c0 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   1;...cackey_slo
1f6d0 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1f6e0 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09  .internal = 1;..
1f6f0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1f700 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65  ghest_slot].labe
1f710 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  l = (unsigned ch
1f720 61 72 20 2a 29 20 22 55 53 20 47 6f 76 65 72 6e  ar *) "US Govern
1f730 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65  ment Certificate
1f740 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  s";...cackey_slo
1f750 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1f760 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 22  .pcsc_reader = "
1f770 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65  CACKey";...cacke
1f780 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1f790 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
1f7a0 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  s = 0;..}...cack
1f7b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
1f7c0 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
1f7d0 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
1f7e0 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
1f7f0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
1f800 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
1f810 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
1f820 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
1f830 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
1f840 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f850 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
1f860 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
1f870 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
1f880 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
1f890 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
1f8a0 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
1f8b0 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66 69   1;..}.../* Defi
1f8c0 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  ne a command to 
1f8d0 70 72 6f 6d 70 74 20 75 73 65 72 20 66 6f 72 20  prompt user for 
1f8e0 61 20 50 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20  a PIN */.#ifdef 
1f8f0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1f900 4e 44 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b  ND_DEFAULT..cack
1f910 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1f920 20 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d   strdup(CACKEY_M
1f930 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54  ACRO_DEFAULT_XST
1f940 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  R(CACKEY_PIN_COM
1f950 4d 41 4e 44 5f 44 45 46 41 55 4c 54 29 29 3b 0a  MAND_DEFAULT));.
1f960 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 43  #endif..#ifdef C
1f970 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1f980 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a  D_XONLY_DEFAULT.
1f990 09 69 66 20 28 67 65 74 65 6e 76 28 22 44 49 53  .if (getenv("DIS
1f9a0 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20  PLAY") != NULL) 
1f9b0 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63  {...cackey_pin_c
1f9c0 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28  ommand = strdup(
1f9d0 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
1f9e0 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59  AULT_XSTR(CACKEY
1f9f0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1fa00 4c 59 5f 44 45 46 41 55 4c 54 29 29 3b 0a 09 7d  LY_DEFAULT));..}
1fa10 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65  .#endif...if (ge
1fa20 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e  tenv("CACKEY_PIN
1fa30 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d 20 4e 55  _COMMAND") != NU
1fa40 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
1fa50 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72  in_command = str
1fa60 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b  dup(getenv("CACK
1fa70 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29  EY_PIN_COMMAND")
1fa80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  );..}...if (gete
1fa90 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43  nv("CACKEY_PIN_C
1faa0 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 20 21  OMMAND_XONLY") !
1fab0 3d 20 4e 55 4c 4c 20 26 26 20 67 65 74 65 6e 76  = NULL && getenv
1fac0 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e  ("DISPLAY") != N
1fad0 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
1fae0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74  pin_command = st
1faf0 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43  rdup(getenv("CAC
1fb00 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1fb10 58 4f 4e 4c 59 22 29 29 3b 0a 09 7d 0a 0a 09 69  XONLY"));..}...i
1fb20 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
1fb30 6d 6d 61 6e 64 20 26 26 20 73 74 72 63 6d 70 28  mmand && strcmp(
1fb40 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1fb50 6e 64 2c 20 22 22 29 20 3d 3d 20 30 29 20 7b 0a  nd, "") == 0) {.
1fb60 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 69  ..free(cackey_pi
1fb70 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 09 09 63 61  n_command);...ca
1fb80 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1fb90 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 23 69 66   = NULL;..}..#if
1fba0 64 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44 45  def CACKEY_READE
1fbb0 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f  RS_INCLUDE_ONLY_
1fbc0 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f  DEFAULT..cackey_
1fbd0 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
1fbe0 6f 6e 6c 79 20 3d 20 73 74 72 64 75 70 28 43 41  only = strdup(CA
1fbf0 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55  CKEY_MACRO_DEFAU
1fc00 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 52  LT_XSTR(CACKEY_R
1fc10 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f  EADERS_INCLUDE_O
1fc20 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23  NLY_DEFAULT));.#
1fc30 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41  endif..#ifdef CA
1fc40 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43  CKEY_READERS_EXC
1fc50 4c 55 44 45 5f 44 45 46 41 55 4c 54 0a 09 63 61  LUDE_DEFAULT..ca
1fc60 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
1fc70 6c 75 64 65 20 3d 20 73 74 72 64 75 70 28 43 41  lude = strdup(CA
1fc80 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55  CKEY_MACRO_DEFAU
1fc90 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 52  LT_XSTR(CACKEY_R
1fca0 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45 5f 44  EADERS_EXCLUDE_D
1fcb0 45 46 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66  EFAULT));.#endif
1fcc0 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1fcd0 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e  ACKEY_READERS_IN
1fce0 43 4c 55 44 45 5f 4f 4e 4c 59 22 29 20 21 3d 20  CLUDE_ONLY") != 
1fcf0 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1fd00 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
1fd10 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75 70 28 67  _only = strdup(g
1fd20 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52 45  etenv("CACKEY_RE
1fd30 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e  ADERS_INCLUDE_ON
1fd40 4c 59 22 29 29 3b 0a 0a 09 09 69 66 20 28 63 61  LY"));....if (ca
1fd50 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1fd60 6c 75 64 65 5f 6f 6e 6c 79 5b 30 5d 20 3d 3d 20  lude_only[0] == 
1fd70 27 5c 30 27 29 20 7b 0a 09 09 09 66 72 65 65 28  '\0') {....free(
1fd80 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1fd90 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09  nclude_only);...
1fda0 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  ..cackey_readers
1fdb0 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20  _include_only = 
1fdc0 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  NULL;...}..}...i
1fdd0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1fde0 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44  Y_READERS_EXCLUD
1fdf0 45 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  E") != NULL) {..
1fe00 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  .cackey_readers_
1fe10 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64 75 70  exclude = strdup
1fe20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1fe30 52 45 41 44 45 52 53 5f 45 58 43 4c 55 44 45 22  READERS_EXCLUDE"
1fe40 29 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ));....if (cacke
1fe50 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64  y_readers_exclud
1fe60 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  e[0] == '\0') {.
1fe70 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72  ...free(cackey_r
1fe80 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b  eaders_exclude);
1fe90 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
1fea0 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55  ers_exclude = NU
1feb0 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  LL;...}..}...CAC
1fec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fed0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1fee0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1fef0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1ff00 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1ff10 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1ff20 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b  , C_Finalize)(CK
1ff30 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72  _VOID_PTR pReser
1ff40 76 65 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  ved) {..uint32_t
1ff50 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
1ff60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1ff70 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52  led.");...if (pR
1ff80 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29  eserved != NULL)
1ff90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ffa0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ffb0 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f   pReserved is no
1ffc0 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
1ffd0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1ffe0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1fff0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
20000 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
20010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20020 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
20030 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
20040 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
20050 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
20060 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ED);..}...for (i
20070 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
20080 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
20090 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
200a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
200b0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
200c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
200d0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
200e0 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  ) {....C_CloseSe
200f0 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a  ssion(idx);...}.
20100 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .}...cackey_slot
20110 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
20120 28 31 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20  (1);...for (idx 
20130 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
20140 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
20150 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
20160 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
20170 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
20180 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e  ey_slots[idx].in
20190 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f 6e  ternal) {....con
201a0 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
201b0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
201c0 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
201d0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  ) {....cackey_fr
201e0 65 65 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f  ee_certs(cackey_
201f0 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65  slots[idx].cache
20200 64 5f 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f  d_certs, cackey_
20210 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65  slots[idx].cache
20220 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31  d_certs_count, 1
20230 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
20240 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
20250 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  certs = NULL;...
20260 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63  }..}...cackey_pc
20270 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b  sc_disconnect();
20280 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
20290 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c  n_command != NUL
202a0 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  L) {...free(cack
202b0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
202c0 0a 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63  ....cackey_pin_c
202d0 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 09  ommand = NULL;..
202e0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 72  }...if (cackey_r
202f0 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f  eaders_include_o
20300 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nly != NULL) {..
20310 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61  .free(cackey_rea
20320 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
20330 79 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65  y);....cackey_re
20340 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
20350 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ly = NULL;..}...
20360 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65  if (cackey_reade
20370 72 73 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55  rs_exclude != NU
20380 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63  LL) {...free(cac
20390 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
203a0 75 64 65 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  ude);....cackey_
203b0 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20  readers_exclude 
203c0 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63  = NULL;..}...cac
203d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
203e0 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 0;...CACKEY_DE
203f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20400 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20410 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
20420 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
20430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
20440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
20450 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50  tInfo)(CK_INFO_P
20460 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
20470 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
20480 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d  manufacturerID[]
20490 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d   = "U.S. Governm
204a0 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ent";..static CK
204b0 5f 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72  _UTF8CHAR librar
204c0 79 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d  yDescription[] =
204d0 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43   "CACKey";...CAC
204e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
204f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20500 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
20510 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20520 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20530 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
20540 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20550 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
20560 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
20570 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
20580 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20590 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
205a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
205b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
205c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
205d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
205e0 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f  ...pInfo->crypto
205f0 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  kiVersion.major 
20600 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
20610 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
20620 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
20630 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
20640 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  iVersion.minor =
20650 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
20660 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
20670 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
20680 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
20690 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
206a0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
206b0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
206c0 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
206d0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
206e0 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  D, manufacturerI
206f0 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61  D, sizeof(manufa
20700 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a  cturerID) - 1);.
20710 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
20720 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28   0x00;...memset(
20730 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
20740 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20  scription, ' ', 
20750 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69  sizeof(pInfo->li
20760 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
20770 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
20780 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
20790 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65  ption, libraryDe
207a0 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f  scription, sizeo
207b0 66 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  f(libraryDescrip
207c0 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49  tion) - 1);...pI
207d0 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73  nfo->libraryVers
207e0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63  ion.major = (cac
207f0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
20800 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
20810 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56  .pInfo->libraryV
20820 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
20830 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
20840 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  n() >> 8) & 0xff
20850 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
20860 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20870 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20880 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
20890 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
208a0 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73  *. * Process lis
208b0 74 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e  t of readers, an
208c0 64 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67  d create mapping
208d0 20 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20   between reader 
208e0 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44  name and slot ID
208f0 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
20900 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
20910 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b  _GetSlotList)(CK
20920 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73  _BBOOL tokenPres
20930 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f  ent, CK_SLOT_ID_
20940 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43  PTR pSlotList, C
20950 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
20960 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20  ount) {..static 
20970 69 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d  int first_call =
20980 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72   1;..int mutex_r
20990 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63  etval;..int pcsc
209a0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43  _connect_ret;..C
209b0 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73  K_ULONG count, s
209c0 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63  lot_count = 0, c
209d0 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64  urrslot, slot_id
209e0 78 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72  x;..char *pcsc_r
209f0 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65  eaders, *pcsc_re
20a00 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72  aders_s, *pcsc_r
20a10 65 61 64 65 72 73 5f 65 3b 0a 09 63 68 61 72 20  eaders_e;..char 
20a20 2a 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61  *reader_check_pa
20a30 74 74 65 72 6e 3b 0a 09 44 57 4f 52 44 20 70 63  ttern;..DWORD pc
20a40 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a  sc_readers_len;.
20a50 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74  .LONG scard_list
20a60 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69  readers_ret;..si
20a70 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72  ze_t curr_reader
20a80 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f  _len;..int slot_
20a90 72 65 73 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c  reset;..int incl
20aa0 75 64 65 5f 72 65 61 64 65 72 3b 0a 0a 09 43 41  ude_reader;...CA
20ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20ac0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20ad0 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
20ae0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
20af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20b00 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69  rror. pulCount i
20b10 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
20b20 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
20b30 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
20b40 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
20b50 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
20b60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20b70 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
20b80 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
20b90 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
20ba0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
20bb0 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
20bc0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20bd0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
20be0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20bf0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
20c00 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20c10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20c20 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
20c30 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20c40 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20c50 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c  ROR);..}.../* Cl
20c60 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  ear list of slot
20c70 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74  s */..slot_reset
20c80 20 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74   = 0;..if (pSlot
20c90 4c 69 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69  List) {...if (fi
20ca0 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66  rst_call) {....f
20cb0 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a  irst_call = 0;..
20cc0 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  ...slot_reset = 
20cd0 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20  1;...}..../* If 
20ce0 61 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73  any of the slots
20cf0 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 65 74   have been reset
20d00 20 74 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20   then purge all 
20d10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  information and 
20d20 63 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09  check again */..
20d30 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
20d40 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   0; currslot < (
20d50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20d60 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
20d70 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
20d80 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
20d90 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
20da0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74  ts[currslot].int
20db0 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e  ernal) {.....con
20dc0 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
20dd0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
20de0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
20df0 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ve) {.....contin
20e00 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ue;....}.....if 
20e10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
20e20 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73  rrslot].slot_res
20e30 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72  et) {.....slot_r
20e40 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62  eset = 1;......b
20e50 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  reak;....}...}..
20e60 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74  ..if (slot_reset
20e70 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
20e80 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67  BUG_PRINTF("Purg
20e90 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66  ing all slot inf
20ea0 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09  ormation.");....
20eb0 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
20ec0 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
20ed0 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
20ee0 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c  ally being suppl
20ef0 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72  y the slot infor
20f00 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  mation */....cac
20f10 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
20f20 6e 65 63 74 5f 61 6c 6c 28 31 29 3b 0a 0a 09 09  nect_all(1);....
20f30 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
20f40 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   0; currslot < (
20f50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20f60 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
20f70 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
20f80 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
20f90 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
20fa0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e  ots[currslot].in
20fb0 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63  ternal) {......c
20fc0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a  ontinue;.....}..
20fd0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
20fe0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
20ff0 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 0a  e = 0;....}...}.
21000 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
21010 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
21020 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
21030 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
21040 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
21050 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
21060 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
21070 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
21080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21090 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
210a0 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20  o PC/SC failed, 
210b0 61 73 73 75 6d 69 6e 67 20 6e 6f 20 68 61 72 64  assuming no hard
210c0 77 61 72 65 20 73 6c 6f 74 73 22 29 3b 0a 09 7d  ware slots");..}
210d0 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72   else {...pcsc_r
210e0 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a  eaders_len = 0;.
210f0 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
21100 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
21110 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
21120 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
21130 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
21140 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
21150 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
21160 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
21170 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52   SCARD_F_COMM_ER
21180 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ROR) {....CACKEY
21190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
211a0 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52  rror. SCardListR
211b0 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65  eaders() returne
211c0 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45  d SCARD_F_COMM_E
211d0 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43  RROR, assuming C
211e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
211f0 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65  SC went away. Re
21200 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a  connecting.");..
21210 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  ...cackey_pcsc_d
21220 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09  isconnect();....
21230 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
21240 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45  ect();.....CACKE
21250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21260 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74  Trying SCardList
21270 52 65 61 64 65 72 73 28 29 20 61 67 61 69 6e 22  Readers() again"
21280 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  );....scard_list
21290 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
212a0 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
212b0 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
212c0 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  le, NULL, NULL, 
212d0 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
212e0 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  n);...}....if (s
212f0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
21300 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
21310 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46  INSUFFICIENT_BUF
21320 46 45 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  FER) {....CACKEY
21330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21340 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52  rror. SCardListR
21350 65 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65  eaders() returne
21360 64 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  d SCARD_E_INSUFF
21370 49 43 49 45 4e 54 5f 42 55 46 46 45 52 2c 20 61  ICIENT_BUFFER, a
21380 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20  ssuming this is 
21390 61 20 62 75 67 20 28 65 2e 67 2e 2c 20 47 6f 6f  a bug (e.g., Goo
213a0 67 6c 65 20 50 43 53 43 29 20 61 6e 64 20 61 6c  gle PCSC) and al
213b0 6c 6f 63 61 74 69 6e 67 20 61 20 6d 61 73 73 69  locating a massi
213c0 76 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  ve amount of spa
213d0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
213e0 65 61 64 65 72 20 6c 69 73 74 2e 22 29 3b 0a 0a  eader list.");..
213f0 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
21400 6c 65 6e 20 3d 20 33 32 37 36 38 3b 0a 09 09 09  len = 32768;....
21410 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
21420 73 5f 72 65 74 20 3d 20 53 43 41 52 44 5f 53 5f  s_ret = SCARD_S_
21430 53 55 43 43 45 53 53 3b 0a 09 09 7d 0a 0a 09 09  SUCCESS;...}....
21440 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
21450 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
21460 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20  RD_S_SUCCESS && 
21470 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
21480 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63   != 0) {....pcsc
21490 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f  _readers = mallo
214a0 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  c(pcsc_readers_l
214b0 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61  en);....pcsc_rea
214c0 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65  ders_s = pcsc_re
214d0 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64  aders;.....scard
214e0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
214f0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
21500 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
21510 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70  _handle, NULL, p
21520 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63  csc_readers, &pc
21530 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
21540 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
21550 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
21560 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
21570 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61  ) {.....pcsc_rea
21580 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65  ders_e = pcsc_re
21590 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61  aders + pcsc_rea
215a0 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f  ders_len;....../
215b0 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f  * Start with Slo
215c0 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64  t ID 1, to avoid
215d0 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e   a bug in GDM on
215e0 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20   RHEL */...../* 
215f0 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70  Bug 594911: http
21600 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64  s://bugzilla.red
21610 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67  hat.com/show_bug
21620 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a  .cgi?id=594911 *
21630 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d  /.....currslot =
21640 20 31 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70   1;.....while (p
21650 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63  csc_readers < pc
21660 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
21670 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78  ...../* Find nex
21680 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  t available slot
21690 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b 20   */......for (; 
216a0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
216b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
216c0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
216d0 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
216e0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09  rslot++) {......
216f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
21700 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
21710 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62 72  ive) {........br
21720 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  eak;.......}....
21730 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f 72  ..}.......curr_r
21740 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c  eader_len = strl
21750 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  en(pcsc_readers)
21760 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73  ;.......if ((pcs
21770 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72  c_readers + curr
21780 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70  _reader_len) > p
21790 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
217a0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
217b0 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
217c0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
217d0 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
217e0 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
217f0 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d  .if (currslot >=
21800 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
21810 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
21820 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
21830 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  )) {.......CACKE
21840 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21850 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65  Found more reade
21860 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72  rs than slots ar
21870 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a  e available!");.
21880 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
21890 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45  ...}.......CACKE
218a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
218b0 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73  Found reader: %s
218c0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 25 6c 75   (currslot = %lu
218d0 29 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  )", pcsc_readers
218e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
218f0 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09  ) currslot);....
21900 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
21910 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
21920 6c 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ly != NULL) {...
21930 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21940 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74  _PRINTF("Asked t
21950 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20 72  o include only r
21960 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e 67 3a  eaders matching:
21970 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 65 61   %s", cackey_rea
21980 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
21990 79 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c 75  y);........inclu
219a0 64 65 5f 72 65 61 64 65 72 20 3d 20 30 3b 0a 09  de_reader = 0;..
219b0 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65 63  .....reader_chec
219c0 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61 63 6b  k_pattern = cack
219d0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
219e0 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09 7d 20  de_only;......} 
219f0 65 6c 73 65 20 69 66 20 28 63 61 63 6b 65 79 5f  else if (cackey_
21a00 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20  readers_exclude 
21a10 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  != NULL) {......
21a20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21a30 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f 20 65  INTF("Asked to e
21a40 78 63 6c 75 64 65 20 72 65 61 64 65 72 73 20 6d  xclude readers m
21a50 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 63 61  atching: %s", ca
21a60 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
21a70 6c 75 64 65 29 3b 0a 0a 09 09 09 09 09 09 69 6e  lude);........in
21a80 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31  clude_reader = 1
21a90 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f 63  ;.......reader_c
21aa0 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63  heck_pattern = c
21ab0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
21ac0 63 6c 75 64 65 3b 0a 09 09 09 09 09 7d 20 65 6c  clude;......} el
21ad0 73 65 20 7b 0a 09 09 09 09 09 09 69 6e 63 6c 75  se {.......inclu
21ae0 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a 09  de_reader = 1;..
21af0 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65 63  .....reader_chec
21b00 6b 5f 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c  k_pattern = NULL
21b10 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
21b20 66 20 28 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  f (reader_check_
21b30 70 61 74 74 65 72 6e 20 21 3d 20 4e 55 4c 4c 29  pattern != NULL)
21b40 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 74 72   {.......if (str
21b50 73 74 72 28 70 63 73 63 5f 72 65 61 64 65 72 73  str(pcsc_readers
21b60 2c 20 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70  , reader_check_p
21b70 61 74 74 65 72 6e 29 20 21 3d 20 4e 55 4c 4c 29  attern) != NULL)
21b80 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59   {........CACKEY
21b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
21ba0 68 69 73 20 72 65 61 64 65 72 20 6d 61 74 63 68  his reader match
21bb0 65 64 20 74 68 65 20 70 61 74 74 65 72 6e 2e 22  ed the pattern."
21bc0 29 3b 0a 09 09 09 09 09 09 0a 09 09 09 09 09 09  );..............
21bd0 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20  .include_reader 
21be0 3d 20 21 69 6e 63 6c 75 64 65 5f 72 65 61 64 65  = !include_reade
21bf0 72 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  r;.......}......
21c00 7d 0a 0a 09 09 09 09 09 69 66 20 28 69 6e 63 6c  }.......if (incl
21c10 75 64 65 5f 72 65 61 64 65 72 20 21 3d 20 31 29  ude_reader != 1)
21c20 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
21c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6b  DEBUG_PRINTF("Sk
21c40 69 70 70 69 6e 67 20 74 68 69 73 20 72 65 61 64  ipping this read
21c50 65 72 2e 22 29 3b 0a 0a 09 09 09 09 09 09 70 63  er.");........pc
21c60 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75  sc_readers += cu
21c70 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20  rr_reader_len + 
21c80 31 3b 0a 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e  1;........contin
21c90 75 65 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ue;......}......
21ca0 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20  ./* Only update 
21cb0 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  the list of slot
21cc0 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75  s if we are actu
21cd0 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64  ally being asked
21ce0 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
21cf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
21d00 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
21d10 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  st) {.......if (
21d20 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
21d30 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
21d40 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
21d50 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63  ve = 1;........c
21d60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
21d70 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  slot].internal =
21d80 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
21d90 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21da0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
21db0 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64  strdup(pcsc_read
21dc0 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63  ers);........cac
21dd0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21de0 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot].pcsc_card_co
21df0 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09  nnected = 0;....
21e00 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
21e10 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73  [currslot].trans
21e20 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
21e30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
21e40 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
21e50 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
21e60 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
21e70 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
21e80 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
21e90 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 09 63  ULL) {.........c
21ea0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
21eb0 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
21ec0 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
21ed0 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 09 7d  QUIRED;........}
21ee0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09   else {.........
21ef0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
21f00 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  rslot].token_fla
21f10 67 73 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 7d  gs = 0;........}
21f20 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
21f30 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
21f40 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  abel = NULL;....
21f50 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
21f60 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63  _slot_reset(&cac
21f70 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21f80 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09  ot]);.......}...
21f90 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
21fa0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
21fb0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
21fc0 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 2f  tive) {......../
21fd0 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69  * Artificially i
21fe0 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62  ncrease the numb
21ff0 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f  er of active slo
22000 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20  ts by what will 
22010 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f  become active */
22020 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
22030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
22040 6e 64 20 69 6e 2d 61 63 74 69 76 65 20 73 6c 6f  nd in-active slo
22050 74 20 25 6c 75 2c 20 62 75 74 20 69 74 20 77 69  t %lu, but it wi
22060 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
22070 65 72 20 61 20 72 65 73 65 74 20 2d 2d 20 6d 61  er a reset -- ma
22080 72 6b 69 6e 67 20 61 73 20 61 63 74 69 76 65 20  rking as active 
22090 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67 20 70  for accounting p
220a0 75 72 70 6f 73 65 73 22 2c 20 28 75 6e 73 69 67  urposes", (unsig
220b0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c  ned long) currsl
220c0 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c 6f  ot);.........slo
220d0 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
220e0 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63  .}......}......c
220f0 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09  urrslot++;......
22100 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d  .pcsc_readers +=
22110 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
22120 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09 7d   + 1;.....}....}
22130 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
22140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22150 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20  "Second call to 
22160 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
22170 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
22180 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
22190 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
221a0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
221b0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
221c0 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
221d0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
221e0 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28  ;....}.....free(
221f0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b  pcsc_readers_s);
22200 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
22210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22220 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74  TF("First call t
22230 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
22240 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
22250 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
22260 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
22270 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
22280 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
22290 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
222a0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
222b0 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 6f 72  t);...}..}...for
222c0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
222d0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
222e0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
222f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
22300 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
22310 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20  rslot++) {...if 
22320 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
22330 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20  rrslot].active) 
22340 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
22350 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
22360 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c  active slot %lu,
22370 20 72 65 61 64 65 72 20 3d 20 25 73 22 2c 20 28   reader = %s", (
22380 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
22390 75 72 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f  urrslot, cackey_
223a0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
223b0 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
223c0 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a  ..slot_count++;.
223d0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
223e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
223f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22400 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
22410 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
22420 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22440 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
22450 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22460 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22470 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22480 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
22490 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
224a0 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b  nt = slot_count;
224b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
224c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
224d0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
224e0 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
224f0 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72  rs, but not stor
22500 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69  ing IDs (pSlotLi
22510 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b  st == NULL)", CK
22520 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
22530 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
22540 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22550 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74  _OK);..}...count
22560 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69   = *pulCount;..i
22570 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f  f (count < slot_
22580 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45  count) {...CACKE
22590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
225a0 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
225b0 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
225c0 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25  s, but we have %
225d0 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f  lu entries.", co
225e0 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  unt, slot_count)
225f0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
22600 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22610 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
22620 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72  OO_SMALL");....r
22630 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
22640 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
22650 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
22660 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
22670 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22680 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
22690 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
226a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
226b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
226c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
226d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
226e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
226f0 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30  }...slot_idx = 0
22700 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ;..for (currslot
22710 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20   = 0; (currslot 
22720 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
22730 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
22740 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
22750 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ))); currslot++)
22760 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
22770 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
22780 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f  .active) {....co
22790 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
227a0 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63  f (slot_idx >= c
227b0 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
227c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
227d0 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
227e0 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
227f0 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20 74  s, but we just t
22800 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ried to write to
22810 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d   the %lu index -
22820 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75  - ignoring", cou
22830 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a  nt, slot_idx);..
22840 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
22850 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c  ....pSlotList[sl
22860 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c  ot_idx] = currsl
22870 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b  ot;...slot_idx++
22880 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
22890 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
228a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
228b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
228c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
228d0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
228e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
228f0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
22900 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
22910 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22920 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  RROR);..}...*pul
22930 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
22940 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  nt;...CACKEY_DEB
22950 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22960 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
22970 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
22980 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20  ders.", CKR_OK, 
22990 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
229a0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72  slot_count);...r
229b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a  eturn(CKR_OK);..
229c0 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20  .tokenPresent = 
229d0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a  tokenPresent; /*
229e0 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
229f0 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
22a00 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
22a10 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22a20 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28   C_GetSlotInfo)(
22a30 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
22a40 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f  D, CK_SLOT_INFO_
22a50 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
22a60 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
22a70 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
22a80 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f  [] = "CACKey Slo
22a90 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  t";..int mutex_r
22aa0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65  etval;..int byte
22ab0 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43  s_to_copy;...CAC
22ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22ad0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
22ae0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
22af0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22b00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22b10 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
22b20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22b30 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
22b40 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
22b50 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22b60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22b70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22b80 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22b90 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22ba0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22bb0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22bc0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
22bd0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
22be0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
22bf0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
22c00 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
22c10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22c20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22c30 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
22c40 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
22c50 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
22c60 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
22c70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22c80 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
22c90 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
22ca0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
22cb0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
22cc0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
22cd0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22ce0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22cf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22d00 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
22d10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22d20 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22d30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
22d40 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
22d50 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
22d60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22d70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
22d80 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
22d90 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
22da0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
22db0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
22dc0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22dd0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22de0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
22df0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
22e00 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
22e10 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
22e20 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21  HW_SLOT;...if (!
22e30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22e40 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  tID].internal) {
22e50 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
22e60 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45  |= CKF_REMOVABLE
22e70 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66  _DEVICE;..}...if
22e80 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
22e90 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
22ea0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
22eb0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
22ec0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
22ed0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
22ee0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
22ef0 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74  NT;..}...bytes_t
22f00 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28  o_copy = strlen(
22f10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22f20 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
22f30 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70  );..if (sizeof(p
22f40 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
22f50 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f  erID) < bytes_to
22f60 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73  _copy) {...bytes
22f70 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f  _to_copy = sizeo
22f80 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
22f90 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65  turerID);..}..me
22fa0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
22fb0 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b  facturerID, cack
22fc0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22fd0 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79  .pcsc_reader, by
22fe0 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09  tes_to_copy);...
22ff0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
23000 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23010 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23020 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
23030 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
23040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23050 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
23060 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23070 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23080 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23090 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
230a0 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69  o->slotDescripti
230b0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
230c0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
230d0 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70  iption));..memcp
230e0 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  y(pInfo->slotDes
230f0 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65  cription, slotDe
23100 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f  scription, sizeo
23110 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  f(slotDescriptio
23120 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  n) - 1);...memse
23130 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
23140 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
23150 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
23160 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09  facturerID));...
23170 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
23180 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
23190 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
231a0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
231b0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
231c0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
231d0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
231e0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
231f0 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
23200 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
23210 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
23220 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
23230 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
23240 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
23250 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23260 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
23270 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
23280 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
23290 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
232a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54  ON(CK_RV, C_GetT
232b0 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  okenInfo)(CK_SLO
232c0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
232d0 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  TOKEN_INFO_PTR p
232e0 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
232f0 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
23300 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
23310 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
23320 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
23330 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62  8CHAR defaultLab
23340 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20  el[] = "Unknown 
23350 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20  Token";..static 
23360 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65  CK_UTF8CHAR mode
23370 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e  l[] = "CAC Token
23380 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ";..struct cacke
23390 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
233a0 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
233b0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
233c0 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69   num_certs;..ssi
233d0 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a  ze_t label_ret;.
233e0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
233f0 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61  l;..int use_defa
23400 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43  ult_label;...CAC
23410 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23420 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23430 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
23440 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23450 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23460 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
23470 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23480 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
23490 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
234a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
234b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
234c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
234d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
234e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
234f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23500 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23510 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
23520 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
23530 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23540 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
23550 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
23560 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23570 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23580 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
23590 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
235a0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
235b0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
235c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
235d0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
235e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
235f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
23600 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
23610 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
23620 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
23630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23650 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
23660 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
23670 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
23680 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
23690 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
236a0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
236b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
236c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
236d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
236e0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
236f0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
23700 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
23710 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23720 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23730 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
23740 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
23750 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
23760 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
23770 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
23780 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
23790 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
237a0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
237b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
237c0 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73  NTF("No token is
237d0 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74   present in slot
237e0 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49  ID = %lu", slotI
237f0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
23800 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23810 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
23820 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
23830 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d  NOT_PRESENT);..}
23840 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
23850 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
23860 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
23870 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
23880 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
23890 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
238a0 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
238b0 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20  label = 1;...if 
238c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
238d0 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e  otID].label == N
238e0 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64  ULL) {...pcsc_id
238f0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
23900 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
23910 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23920 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
23930 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
23940 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
23950 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e  NULL) {....if (n
23960 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
23970 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
23980 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
23990 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
239a0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
239b0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
239c0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
239d0 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65  ));.....if (labe
239e0 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
239f0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
23a00 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63  bel = 0;.......c
23a10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23a20 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c  ID].label = mall
23a30 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  oc(sizeof(pInfo-
23a40 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09  >label));.......
23a50 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c  memcpy(cackey_sl
23a60 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
23a70 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  l, pInfo->label,
23a80 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
23a90 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09  abel));.....}...
23aa0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
23ab0 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
23ac0 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
23ad0 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20  rts, 1);...}..} 
23ae0 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
23af0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61  pInfo->label, ca
23b00 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23b10 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  D].label, sizeof
23b20 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
23b30 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
23b40 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  label = 0;..}...
23b50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
23b60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23b70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23b80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
23b90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
23ba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23bb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
23bc0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23bd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23be0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23bf0 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66  .}...if (use_def
23c00 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09  ault_label) {...
23c10 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
23c20 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65  bel, defaultLabe
23c30 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c  l, sizeof(defaul
23c40 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d  tLabel) - 1);..}
23c50 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
23c60 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
23c70 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
23c80 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
23c90 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
23ca0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
23cb0 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
23cc0 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
23cd0 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
23ce0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
23cf0 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69  ->model, ' ', si
23d00 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65  zeof(pInfo->mode
23d10 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  l));..memcpy(pIn
23d20 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c  fo->model, model
23d30 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20  , sizeof(model) 
23d40 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
23d50 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62  Info->serialNumb
23d60 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  er, ' ', sizeof(
23d70 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
23d80 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28  ber));...memset(
23d90 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20  pInfo->utcTime, 
23da0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
23db0 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09  o->utcTime));...
23dc0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
23dd0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
23de0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
23df0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
23e00 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
23e10 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
23e20 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
23e30 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
23e40 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
23e50 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
23e60 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
23e70 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
23e80 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
23e90 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  0;...pInfo->flag
23ea0 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52  s = CKF_WRITE_PR
23eb0 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53  OTECTED | CKF_US
23ec0 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a  ER_PIN_INITIALIZ
23ed0 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49  ED | CKF_TOKEN_I
23ee0 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63  NITIALIZED | cac
23ef0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23f00 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a  ].token_flags;..
23f10 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
23f20 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29  command != NULL)
23f30 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
23f40 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43 54  s |= CKF_PROTECT
23f50 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ED_AUTHENTICATIO
23f60 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49 6e  N_PATH;..}...pIn
23f70 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e  fo->ulMaxSession
23f80 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28  Count = (sizeof(
23f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
23fa0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
23fb0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d  _sessions[0])) -
23fc0 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65   1;..pInfo->ulSe
23fd0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f  ssionCount = CK_
23fe0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
23ff0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
24000 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43  >ulMaxRwSessionC
24010 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  ount = 0;..pInfo
24020 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75  ->ulRwSessionCou
24030 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  nt = CK_UNAVAILA
24040 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
24050 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69  ..pInfo->ulMaxPi
24060 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e  nLen = 128;..pIn
24070 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20  fo->ulMinPinLen 
24080 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  = 0;..pInfo->ulT
24090 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79  otalPublicMemory
240a0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
240b0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
240c0 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62  pInfo->ulFreePub
240d0 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
240e0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
240f0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
24100 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65  ulTotalPrivateMe
24110 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
24120 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
24130 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
24140 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  ePrivateMemory =
24150 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
24160 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43  INFORMATION;...C
24170 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24180 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
24190 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
241a0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
241b0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
241c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
241d0 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  RV, C_WaitForSlo
241e0 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53  tEvent)(CK_FLAGS
241f0 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f   flags, CK_SLOT_
24200 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20  ID_PTR pSlotID, 
24210 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
24220 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59  erved) {..CACKEY
24230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24240 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24250 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
24260 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
24270 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24280 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
24290 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
242a0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
242b0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
242c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
242d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
242e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
242f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24300 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24310 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24320 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24330 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58  IZED);..}.../* X
24340 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d  XX: TODO: Implem
24350 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09  ent this... */..
24360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24370 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24380 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24390 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
243a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
243b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
243c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
243d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
243e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
243f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24400 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c   C_GetMechanismL
24410 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ist)(CK_SLOT_ID 
24420 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
24430 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d  NISM_TYPE_PTR pM
24440 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b  echanismList, CK
24450 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
24460 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  unt) {..CACKEY_D
24470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24480 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
24490 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
244a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
244b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
244c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
244d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
244e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
244f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24500 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75  ..}...if (pulCou
24510 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
24520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24530 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
24540 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29  Count is NULL.")
24550 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24560 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
24570 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
24580 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ismList == NULL)
24590 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d   {...*pulCount =
245a0 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   1;....CACKEY_DE
245b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
245c0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
245d0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
245e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
245f0 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75  .}...if (*pulCou
24600 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b  nt < 1) {...CACK
24610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24620 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20  "Error.  Buffer 
24630 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09  too small.");...
24640 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
24650 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09  ER_TOO_SMALL);..
24660 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69  }...pMechanismLi
24670 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f  st[0] = CKM_RSA_
24680 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74  PKCS;..*pulCount
24690 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 1;...CACKEY_D
246a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
246b0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
246c0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
246d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
246e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
246f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
24700 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29  etMechanismInfo)
24710 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
24720 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
24730 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d  _TYPE type, CK_M
24740 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54  ECHANISM_INFO_PT
24750 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
24760 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
24770 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24780 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
24790 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
247a0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
247b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
247c0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
247d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
247e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
247f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
24800 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
24810 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
24820 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24830 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24840 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24850 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24860 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24870 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
24880 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
24890 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
248a0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
248b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
248c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
248d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
248e0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
248f0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
24900 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
24910 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
24920 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
24930 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
24940 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
24950 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
24960 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
24970 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
24980 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
24990 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
249a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
249b0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
249c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
249d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
249e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
249f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
24a00 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
24a10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24a20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24a30 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
24a40 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
24a50 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
24a60 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
24a70 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
24a80 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24a90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
24aa0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
24ab0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
24ac0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
24ad0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24ae0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24af0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
24b00 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
24b10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24b20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
24b30 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
24b40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24b50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
24b60 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70  .}...switch (typ
24b70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  e) {...case CKM_
24b80 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e  RSA_PKCS:....pIn
24b90 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
24ba0 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
24bb0 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
24bc0 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
24bd0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
24be0 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
24bf0 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
24c00 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
24c10 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
24c20 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24c30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24c40 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
24c50 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
24c60 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
24c70 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
24c80 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
24c90 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
24ca0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
24cb0 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f  nitToken)(CK_SLO
24cc0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
24cd0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
24ce0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
24cf0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
24d00 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a  R_PTR pLabel) {.
24d10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24d20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24d30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24d40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24d60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
24d70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
24d80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
24d90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
24da0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
24db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24dc0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
24dd0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
24de0 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
24df0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
24e00 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
24e10 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
24e20 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
24e30 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
24e40 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
24e50 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
24e60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24e70 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53   C_InitPIN)(CK_S
24e80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24e90 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
24ea0 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
24eb0 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
24ec0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24ed0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24ee0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
24ef0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
24f00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24f10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24f20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
24f30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24f40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
24f50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
24f60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24f70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24f80 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
24f90 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
24fa0 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
24fb0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
24fc0 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
24fd0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
24fe0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
24ff0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
25000 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53  C_SetPIN)(CK_SES
25010 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
25020 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
25030 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43  R_PTR pOldPin, C
25040 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e  K_ULONG ulOldPin
25050 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
25060 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b  _PTR pNewPin, CK
25070 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c  _ULONG ulNewPinL
25080 65 6e 29 20 7b 0a 09 63 68 61 72 20 6f 6c 64 70  en) {..char oldp
25090 69 6e 62 75 66 5b 36 34 5d 2c 20 6e 65 77 70 69  inbuf[64], newpi
250a0 6e 62 75 66 5b 36 34 5d 3b 0a 09 63 61 63 6b 65  nbuf[64];..cacke
250b0 79 5f 72 65 74 20 73 65 74 5f 70 69 6e 5f 72 65  y_ret set_pin_re
250c0 74 2c 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a  t, get_pin_ret;.
250d0 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
250e0 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ID;..int mutex_r
250f0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
25100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
25110 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
25120 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
25130 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
25140 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25150 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
25160 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
25170 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
25180 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25190 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
251a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
251b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
251c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
251d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
251e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
251f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25200 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
25210 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25220 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25230 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
25240 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25250 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
25260 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25270 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25280 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
25290 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
252a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
252b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
252c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
252d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
252e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
252f0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
25300 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25310 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
25320 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
25330 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
25340 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
25350 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
25360 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25370 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25380 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
25390 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
253a0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
253b0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
253c0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
253d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
253e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
253f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25400 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25410 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
25420 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
25430 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
25440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25450 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
25460 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
25470 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
25480 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
25490 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
254a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
254b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
254c0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
254d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
254e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
254f0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
25500 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 47 65   NULL) {.../* Ge
25510 74 20 6f 6c 64 20 50 49 4e 20 2a 2f 0a 09 09 67  t old PIN */...g
25520 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63  et_pin_ret = cac
25530 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6f 6c 64 70  key_get_pin(oldp
25540 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67  inbuf);....if (g
25550 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
25560 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
25570 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
25580 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20  G_PRINTF("Error 
25590 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4f 6c  while getting Ol
255a0 64 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67  d PIN, returning
255b0 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
255c0 43 54 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  CT.");.....cacke
255d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
255e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
255f0 09 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
25600 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
25610 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c 64 50 69 6e  ;...}....pOldPin
25620 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f   = (CK_UTF8CHAR_
25630 50 54 52 29 20 6f 6c 64 70 69 6e 62 75 66 3b 0a  PTR) oldpinbuf;.
25640 09 09 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 20  ..ulOldPinLen = 
25650 73 74 72 6c 65 6e 28 6f 6c 64 70 69 6e 62 75 66  strlen(oldpinbuf
25660 29 3b 0a 0a 09 09 2f 2a 20 47 65 74 20 6e 65 77  );..../* Get new
25670 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70 69   PIN */...get_pi
25680 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67  n_ret = cackey_g
25690 65 74 5f 70 69 6e 28 6e 65 77 70 69 6e 62 75 66  et_pin(newpinbuf
256a0 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70 69  );....if (get_pi
256b0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
256c0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
256d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
256e0 4e 54 46 28 22 45 72 72 6f 72 20 77 68 69 6c 65  NTF("Error while
256f0 20 67 65 74 74 69 6e 67 20 4e 65 77 20 50 49 4e   getting New PIN
25700 2c 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  , returning CKR_
25710 50 49 4e 5f 49 4e 56 41 4c 49 44 2e 22 29 3b 0a  PIN_INVALID.");.
25720 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
25730 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25740 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09 09  iglock);........
25750 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
25760 4e 56 41 4c 49 44 29 3b 0a 09 09 7d 0a 0a 09 09  NVALID);...}....
25770 70 4e 65 77 50 69 6e 20 3d 20 28 43 4b 5f 55 54  pNewPin = (CK_UT
25780 46 38 43 48 41 52 5f 50 54 52 29 20 6e 65 77 70  F8CHAR_PTR) newp
25790 69 6e 62 75 66 3b 0a 09 09 75 6c 4e 65 77 50 69  inbuf;...ulNewPi
257a0 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6e 65  nLen = strlen(ne
257b0 77 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 69  wpinbuf);..}...i
257c0 66 20 28 70 4f 6c 64 50 69 6e 20 3d 3d 20 4e 55  f (pOldPin == NU
257d0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
257e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64  EBUG_PRINTF("Old
257f0 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20 77 72   PIN value is wr
25800 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22 29 3b 0a 0a  ong (null).");..
25810 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25820 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25830 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
25840 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
25850 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  CT);..}...if (ul
25860 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d 20 30 20 7c  OldPinLen == 0 |
25870 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3e 20  | ulOldPinLen > 
25880 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  8) {...CACKEY_DE
25890 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64 20  BUG_PRINTF("Old 
258a0 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72  PIN length is wr
258b0 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20 28 75 6e 73  ong: %lu.", (uns
258c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4f 6c  igned long) ulOl
258d0 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61 63  dPinLen);....cac
258e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
258f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25900 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25910 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
25920 09 7d 0a 0a 09 69 66 20 28 70 4e 65 77 50 69 6e  .}...if (pNewPin
25930 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
25940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25950 46 28 22 4e 65 77 20 50 49 4e 20 76 61 6c 75 65  F("New PIN value
25960 20 69 73 20 77 72 6f 6e 67 20 28 65 69 74 68 65   is wrong (eithe
25970 72 20 4e 55 4c 4c 2c 20 6f 72 20 74 6f 6f 20 6c  r NULL, or too l
25980 6f 6e 67 2f 73 68 6f 72 74 29 2e 22 29 3b 0a 0a  ong/short).");..
25990 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
259a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
259b0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
259c0 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44  (CKR_PIN_INVALID
259d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4e 65  );..}...if (ulNe
259e0 77 50 69 6e 4c 65 6e 20 3c 20 35 20 7c 7c 20 75  wPinLen < 5 || u
259f0 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e 20 38 29 20  lNewPinLen > 8) 
25a00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25a10 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e  _PRINTF("New PIN
25a20 20 6c 65 6e 67 74 68 20 69 73 20 77 72 6f 6e 67   length is wrong
25a30 3a 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61  : %lu, must be a
25a40 74 6c 65 61 73 74 20 35 20 61 6e 64 20 6e 6f 20  tleast 5 and no 
25a50 6d 6f 72 65 20 74 68 61 6e 20 38 2e 22 2c 20 28  more than 8.", (
25a60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
25a70 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09  lNewPinLen);....
25a80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25a90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25aa0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
25ab0 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52 41 4e 47 45  KR_PIN_LEN_RANGE
25ac0 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f 70 69 6e 5f  );..}...set_pin_
25ad0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 74  ret = cackey_set
25ae0 5f 70 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  _pin(&cackey_slo
25af0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 4f 6c 64  ts[slotID], pOld
25b00 50 69 6e 2c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e  Pin, ulOldPinLen
25b10 2c 20 70 4e 65 77 50 69 6e 2c 20 75 6c 4e 65 77  , pNewPin, ulNew
25b20 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 73  PinLen);...if (s
25b30 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
25b40 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
25b50 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  {...if (cackey_p
25b60 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55  in_command == NU
25b70 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  LL) {....cackey_
25b80 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
25b90 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
25ba0 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
25bb0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 74 5f  ...}....if (set_
25bc0 70 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  pin_ret == CACKE
25bd0 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
25be0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f   {....cackey_slo
25bf0 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
25c00 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
25c10 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 09  ER_PIN_LOCKED;..
25c20 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
25c30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
25c40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25c50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
25c60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
25c70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
25c80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25c90 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
25ca0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
25cb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25cc0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
25cd0 74 63 68 20 28 73 65 74 5f 70 69 6e 5f 72 65 74  tch (set_pin_ret
25ce0 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ) {...case CACKE
25cf0 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a 0a 09 09 09  Y_PCSC_S_OK:....
25d00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25d10 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c  NTF("Successfull
25d20 79 20 73 65 74 20 50 49 4e 2e 22 29 3b 0a 0a 09  y set PIN.");...
25d30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
25d40 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
25d50 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 3a 0a 09  PCSC_E_BADPIN:..
25d60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25d70 52 49 4e 54 46 28 22 50 49 4e 20 77 61 73 20 69  RINTF("PIN was i
25d80 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a 09 09 09 72  nvalid.");.....r
25d90 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
25da0 56 41 4c 49 44 29 3b 0a 09 09 63 61 73 65 20 43  VALID);...case C
25db0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
25dc0 4b 45 44 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  KED:....CACKEY_D
25dd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
25de0 65 6e 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72 20  en is locked or 
25df0 74 68 69 73 20 63 68 61 6e 67 65 20 69 73 20 6e  this change is n
25e00 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 22 29 3b  ot permitted.");
25e10 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
25e20 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 64  PIN_LOCKED);...d
25e30 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
25e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25e50 53 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 20 77  Something else w
25e60 65 6e 74 20 77 72 6f 6e 67 20 63 68 61 6e 67 69  ent wrong changi
25e70 6e 67 20 74 68 65 20 50 49 4e 3a 20 25 69 22 2c  ng the PIN: %i",
25e80 20 73 65 74 5f 70 69 6e 5f 72 65 74 29 3b 0a 0a   set_pin_ret);..
25e90 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25ea0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
25eb0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
25ec0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  NERAL_ERROR);.}.
25ed0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25ee0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65  ION(CK_RV, C_Ope
25ef0 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f  nSession)(CK_SLO
25f00 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
25f10 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f  FLAGS flags, CK_
25f20 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63  VOID_PTR pApplic
25f30 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59  ation, CK_NOTIFY
25f40 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53   notify, CK_SESS
25f50 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ION_HANDLE_PTR p
25f60 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73  hSession) {..uns
25f70 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a  igned long idx;.
25f80 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
25f90 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65  l;..int found_se
25fa0 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43  ssion = 0;...CAC
25fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25fc0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25fd0 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f  f ((flags & CKF_
25fe0 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20  SERIAL_SESSION) 
25ff0 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45  != CKF_SERIAL_SE
26000 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72  SSION) {...retur
26010 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41  n(CKR_SESSION_PA
26020 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f  RALLEL_NOT_SUPPO
26030 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RTED);..}...if (
26040 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
26050 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26070 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26080 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26090 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
260a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
260b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
260c0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
260d0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
260e0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
260f0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
26100 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
26110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26120 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
26130 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
26140 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
26150 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
26160 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
26170 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
26180 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
26190 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
261a0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
261b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
261c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
261d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
261e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
261f0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
26200 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
26210 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
26220 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
26230 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
26240 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
26250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26270 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
26280 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
26290 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
262a0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
262b0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
262c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
262d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
262e0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
262f0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
26300 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
26310 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63 74   the card is act
26320 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f  ually in the slo
26330 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43  t. */../* XXX: C
26340 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
26350 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68 65  e this is in the
26360 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66 69   PKCS#11 specifi
26370 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63  cation */..if (c
26380 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
26390 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ent(&cackey_slot
263a0 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41  s[slotID]) != CA
263b0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
263c0 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41  NPRESENT) {...CA
263d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
263e0 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20  F("Error.  Card 
263f0 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65  not present.  Re
26400 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49  turning CKR_DEVI
26410 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09  CE_REMOVED");...
26420 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
26430 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26440 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
26450 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
26460 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  ED);..}...for (i
26470 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73  dx = 1; idx < (s
26480 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
26490 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
264a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
264b0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
264c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
264d0 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
264e0 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65  e) {....found_se
264f0 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a  ssion = 1;.....*
26500 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b  phSession = idx;
26510 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
26520 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
26530 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 1;....cackey_
26540 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c  sessions[idx].sl
26550 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09  otID = slotID;..
26560 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26570 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43  s[idx].state = C
26580 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53  KS_RO_PUBLIC_SES
26590 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f  SION;....cackey_
265a0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c  sessions[idx].fl
265b0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09  ags = flags;....
265c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
265d0 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72  idx].ulDeviceErr
265e0 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65  or = 0;....cacke
265f0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
26600 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70  pApplication = p
26610 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09  Application;....
26620 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26630 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f  idx].Notify = no
26640 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79  tify;.....cackey
26650 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
26660 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
26670 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26680 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
26690 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ties_count = 0;.
266a0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
266b0 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f  ons[idx].search_
266c0 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
266d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
266e0 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  idx].sign_active
266f0 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
26700 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64  _sessions[idx].d
26710 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
26720 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
26730 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
26740 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
26750 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
26760 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
26770 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
26780 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
26790 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
267a0 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
267b0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
267c0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
267d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
267e0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
267f0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
26800 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26810 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26820 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
26830 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26840 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26850 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66  OR);..}...if (!f
26860 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a  ound_session) {.
26870 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26880 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26890 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55   CKR_SESSION_COU
268a0 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45  NT (%i)", CKR_SE
268b0 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09  SSION_COUNT);...
268c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
268d0 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a  ION_COUNT);..}..
268e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
268f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
26900 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
26910 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
26920 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
26930 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
26940 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73  K_RV, C_CloseSes
26950 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  sion)(CK_SESSION
26960 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26970 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
26980 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
26990 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
269a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
269b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
269c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
269d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
269e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
269f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
26a00 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
26a10 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26a20 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
26a30 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
26a40 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
26a50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
26a60 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
26a70 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
26a80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26a90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26aa0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
26ab0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
26ac0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
26ad0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
26ae0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
26af0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
26b00 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
26b10 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
26b20 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
26b30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26b40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26b50 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
26b60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26b70 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26b80 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
26b90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26ba0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
26bb0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
26bc0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26bd0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
26be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26bf0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
26c00 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
26c10 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
26c20 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
26c30 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
26c40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26c50 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d  ession].active =
26c60 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65   0;..cackey_free
26c70 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b  _identities(cack
26c80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26c90 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
26ca0 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
26cb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
26cc0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
26cd0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
26ce0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26cf0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26d00 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
26d10 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
26d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26d30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
26d40 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
26d50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26d60 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
26d70 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26d80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26d90 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
26da0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
26db0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
26dc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26dd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
26de0 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43  seAllSessions)(C
26df0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
26e00 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
26e10 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
26e20 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
26e30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26e40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
26e50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26e60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
26e70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26e80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
26e90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
26ea0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
26eb0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
26ec0 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
26ed0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
26ee0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
26ef0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
26f00 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
26f10 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
26f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26f30 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
26f40 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
26f50 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
26f60 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
26f70 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
26f80 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
26f90 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
26fa0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
26fb0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
26fc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
26fd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
26fe0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26ff0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27000 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
27010 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27020 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27030 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
27040 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
27050 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
27060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27080 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
27090 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
270a0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
270b0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
270c0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
270d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
270e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
270f0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
27100 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
27110 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
27120 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
27130 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
27140 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27150 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
27160 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
27170 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
27180 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20  active) {....if 
27190 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
271a0 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20  [idx].slotID != 
271b0 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f  slotID) {.....co
271c0 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
271d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
271e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
271f0 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65  ock);....C_Close
27200 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09  Session(idx);...
27210 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f  .cackey_mutex_lo
27220 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27230 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  k);...}..}...mut
27240 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
27250 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27260 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27270 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
27280 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
27290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
272a0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
272b0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
272c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
272d0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
272e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
272f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
27300 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
27310 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
27320 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
27330 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
27340 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73  CK_RV, C_GetSess
27350 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53  ionInfo)(CK_SESS
27360 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27370 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion, CK_SESSION_
27380 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
27390 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
273a0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
273b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
273c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
273d0 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
273e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
273f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
27400 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
27410 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
27420 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
27430 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
27440 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
27450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27460 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
27470 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
27480 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
27490 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
274a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
274b0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
274c0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
274d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
274e0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
274f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27500 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
27510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27520 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
27530 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
27540 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
27550 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
27560 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
27570 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27580 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
27590 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
275a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
275b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
275c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
275d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
275e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
275f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
27600 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
27610 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27620 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
27630 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
27640 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
27650 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
27660 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27670 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27680 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
27690 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
276a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
276b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
276c0 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49  }...pInfo->slotI
276d0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
276e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
276f0 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74  otID;..pInfo->st
27700 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ate = cackey_ses
27710 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27720 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66  state;..pInfo->f
27730 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65  lags = cackey_se
27740 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27750 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e  .flags;..pInfo->
27760 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20  ulDeviceError = 
27770 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27780 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69  hSession].ulDevi
27790 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78  ceError;...mutex
277a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
277b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
277c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
277d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
277e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
277f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27800 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
27810 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
27820 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
27830 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
27840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27850 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27860 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
27870 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
27880 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
27890 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
278a0 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74  _RV, C_GetOperat
278b0 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53  ionState)(CK_SES
278c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
278d0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
278e0 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  R pOperationStat
278f0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
27900 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  pulOperationStat
27910 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
27920 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27930 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27940 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27950 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27970 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27980 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27990 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
279a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
279b0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
279c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
279d0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
279e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
279f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
27a00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27a10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
27a20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27a30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
27a40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27a50 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65  (CK_RV, C_SetOpe
27a60 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f  rationState)(CK_
27a70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27a80 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
27a90 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53  _PTR pOperationS
27aa0 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  tate, CK_ULONG u
27ab0 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
27ac0 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  en, CK_OBJECT_HA
27ad0 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e  NDLE hEncryption
27ae0 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
27af0 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63  ANDLE hAuthentic
27b00 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43  ationKey) {..CAC
27b10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27b20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27b30 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27b40 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27b50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27b60 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27b70 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27b80 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27b90 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27ba0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
27bb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27bc0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
27bd0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27be0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
27bf0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27c00 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
27c10 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
27c20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
27c30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27c40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
27c50 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43 4b 5f  ginMutexArg)(CK_
27c60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
27c70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
27c80 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
27c90 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
27ca0 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
27cb0 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f 63  lPinLen, int loc
27cc0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f 53  k_mutex) {..CK_S
27cd0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
27ce0 63 61 63 6b 65 79 5f 72 65 74 20 67 65 74 5f 70  cackey_ret get_p
27cf0 69 6e 5f 72 65 74 3b 0a 09 63 68 61 72 20 70 69  in_ret;..char pi
27d00 6e 62 75 66 5b 36 34 5d 3b 0a 09 69 6e 74 20 6d  nbuf[64];..int m
27d10 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
27d20 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
27d30 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65  g;..int login_re
27d40 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
27d50 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
27d60 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
27d70 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
27d80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27d90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27da0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
27db0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27dc0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
27dd0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
27de0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
27df0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
27e00 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
27e10 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
27e20 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27e30 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
27e40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27e50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
27e60 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
27e70 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
27e80 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
27e90 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
27ea0 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65  }...if (userType
27eb0 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a   != CKU_USER) {.
27ec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27ed0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57  RINTF("Error.  W
27ee0 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55  e only support U
27ef0 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20  SER mode, asked 
27f00 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20  for %lu mode.", 
27f10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
27f20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74  userType)....ret
27f30 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50  urn(CKR_USER_TYP
27f40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27f50 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29  .if (lock_mutex)
27f60 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76 61   {...mutex_retva
27f70 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
27f80 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
27f90 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75 74  lock);...if (mut
27fa0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27fb0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
27fc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27fd0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
27fe0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
27ff0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
28000 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  R);...}..}...if 
28010 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
28020 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
28030 76 65 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63 6b  ve) {...if (lock
28040 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63  _mutex) {....cac
28050 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28060 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28070 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
28080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28090 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
280a0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
280b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
280c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
280d0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  LID);..}...slotI
280e0 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
280f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
28100 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
28110 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
28120 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
28130 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
28140 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
28150 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
28160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28170 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
28180 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
28190 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
281a0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
281b0 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63  tID);....if (loc
281c0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
281d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
281e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
281f0 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
28200 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28210 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
28220 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
28230 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
28240 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28250 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28260 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
28270 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
28280 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
28290 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
282a0 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d  );....if (lock_m
282b0 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65  utex) {....cacke
282c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
282d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
282e0 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ..}....return(CK
282f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
28300 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
28310 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
28320 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 70   NULL) {...if (p
28330 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Pin != NULL) {..
28340 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28350 52 49 4e 54 46 28 22 50 72 6f 74 65 63 74 65 64  RINTF("Protected
28360 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
28370 70 61 74 68 20 69 6e 20 65 66 66 65 63 74 20 61  path in effect a
28380 6e 64 20 50 49 4e 20 70 72 6f 76 69 64 65 64 20  nd PIN provided 
28390 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09 67 65 74  !?");...}....get
283a0 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  _pin_ret = cacke
283b0 79 5f 67 65 74 5f 70 69 6e 28 70 69 6e 62 75 66  y_get_pin(pinbuf
283c0 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70 69  );....if (get_pi
283d0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
283e0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
283f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28400 4e 54 46 28 22 63 61 63 6b 65 79 5f 67 65 74 5f  NTF("cackey_get_
28410 70 69 6e 28 29 20 72 65 74 75 72 6e 65 64 20 69  pin() returned i
28420 6e 20 66 61 69 6c 75 72 65 2c 20 61 73 73 75 6d  n failure, assum
28430 69 6e 67 20 74 68 65 20 50 49 4e 20 77 61 73 20  ing the PIN was 
28440 69 6e 63 6f 72 72 65 63 74 2e 22 29 3b 0a 0a 09  incorrect.");...
28450 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
28460 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
28470 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28480 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
28490 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  }.....return(CKR
284a0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
284b0 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20 28  ...}....pPin = (
284c0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29  CK_UTF8CHAR_PTR)
284d0 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69 6e   pinbuf;...ulPin
284e0 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69 6e  Len = strlen(pin
284f0 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e  buf);..}...login
28500 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f  _ret = cackey_lo
28510 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  gin(&cackey_slot
28520 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c  s[slotID], pPin,
28530 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65   ulPinLen, &trie
28540 73 5f 72 65 6d 61 69 6e 69 6e 67 2c 20 33 29 3b  s_remaining, 3);
28550 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  ..if (login_ret 
28560 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
28570 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63  _OK) {...if (loc
28580 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
28590 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
285a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
285b0 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6c 6f  );...}....if (lo
285c0 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
285d0 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
285e0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
285f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28600 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b  .  Token is lock
28610 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ed.");.....cacke
28620 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
28630 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
28640 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b  KF_USER_PIN_LOCK
28650 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ED;.....CACKEY_D
28660 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28670 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 4c  urning CKR_PIN_L
28680 4f 43 4b 45 44 20 28 25 69 29 22 2c 20 28 69 6e  OCKED (%i)", (in
28690 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  t) CKR_PIN_LOCKE
286a0 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  D);.....return(C
286b0 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a  KR_PIN_LOCKED);.
286c0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67  ..} else if (log
286d0 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  in_ret == CACKEY
286e0 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20  _PCSC_E_BADPIN) 
286f0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
28700 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28710 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29    Invalid PIN.")
28720 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
28730 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
28740 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
28750 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57  ER_PIN_COUNT_LOW
28760 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f  ;.....if (tries_
28770 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20  remaining == 1) 
28780 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  {.....cackey_slo
28790 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
287a0 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
287b0 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59  ER_PIN_FINAL_TRY
287c0 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
287d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
287e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49  Returning CKR_PI
287f0 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25 69 29  N_INCORRECT (%i)
28800 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e  ", (int) CKR_PIN
28810 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09  _INCORRECT);....
28820 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
28830 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a  INCORRECT);...}.
28840 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28850 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28860 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65  Unknown error re
28870 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b  turned from cack
28880 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22  ey_login() (%i)"
28890 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09  , login_ret);...
288a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
288b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
288c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
288d0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
288e0 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f  s &= ~(CKF_USER_
288f0 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46  PIN_LOCKED | CKF
28900 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f  _USER_PIN_COUNT_
28910 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f  LOW | CKF_LOGIN_
28920 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55  REQUIRED | CKF_U
28930 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
28940 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  Y);...cackey_ses
28950 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28960 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55  state = CKS_RO_U
28970 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a  SER_FUNCTIONS;..
28980 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29  .if (lock_mutex)
28990 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76 61   {...mutex_retva
289a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
289b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
289c0 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d  iglock);...if (m
289d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
289e0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
289f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28a00 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
28a10 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
28a20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28a30 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  ERROR);...}..}..
28a40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28a50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28a60 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
28a70 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
28a80 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
28a90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
28aa0 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43  K_RV, C_Login)(C
28ab0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28ac0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53   hSession, CK_US
28ad0 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65  ER_TYPE userType
28ae0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
28af0 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
28b00 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 72 65   ulPinLen) {..re
28b10 74 75 72 6e 28 43 5f 4c 6f 67 69 6e 4d 75 74 65  turn(C_LoginMute
28b20 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 75  xArg(hSession, u
28b30 73 65 72 54 79 70 65 2c 20 70 50 69 6e 2c 20 75  serType, pPin, u
28b40 6c 50 69 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d 0a  lPinLen, 1));.}.
28b50 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
28b60 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67  ION(CK_RV, C_Log
28b70 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  out)(CK_SESSION_
28b80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
28b90 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73   {..CK_SLOT_ID s
28ba0 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65  lotID;..int mute
28bb0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
28bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28bd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
28be0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
28bf0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
28c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28c10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
28c20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
28c30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
28c40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
28c50 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
28c60 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
28c70 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
28c80 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
28c90 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
28ca0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
28cb0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
28cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28cd0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
28ce0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
28cf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
28d00 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
28d10 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
28d20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28d30 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
28d40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28d50 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28d60 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28d70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28d80 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
28d90 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
28da0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28db0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28dc0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28dd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
28de0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28df0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28e00 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28e10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28e20 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
28e30 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
28e40 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
28e50 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
28e60 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
28e70 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
28e80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28e90 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
28ea0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
28eb0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
28ec0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
28ed0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
28ee0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
28ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28f00 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
28f10 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
28f20 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
28f30 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
28f40 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
28f50 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28f60 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
28f70 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
28f80 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
28f90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28fa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28fb0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
28fc0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
28fd0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
28fe0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
28ff0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
29000 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29010 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29020 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
29030 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29040 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29050 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61  ns[hSession].sta
29060 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
29070 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69 66  IC_SESSION;...if
29080 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d   (cackey_pin_com
29090 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  mand == NULL) {.
290a0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
290b0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
290c0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
290d0 45 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73 65  EQUIRED;..} else
290e0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
290f0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
29100 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
29110 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
29120 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29130 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29140 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
29150 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
29160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29170 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
29180 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
29190 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
291a0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
291b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
291c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
291d0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
291e0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
291f0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
29200 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29210 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61  ON(CK_RV, C_Crea
29220 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  teObject)(CK_SES
29230 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29240 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  sion, CK_ATTRIBU
29250 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
29260 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
29270 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
29280 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63  NDLE_PTR phObjec
29290 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
292a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
292b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
292c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
292d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
292e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
292f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29300 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29310 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29320 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29330 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
29340 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
29350 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
29360 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
29370 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
29380 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29390 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
293a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
293b0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
293c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
293d0 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63  _RV, C_CopyObjec
293e0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(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 41 54 54 52  hObject, CK_ATTR
29420 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
29430 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
29440 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
29450 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65  _HANDLE_PTR phNe
29460 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  wObject) {..CACK
29470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29480 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29490 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
294a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
294b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
294c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
294d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
294e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
294f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29500 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29520 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29530 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29540 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29550 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29560 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29570 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29580 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
29590 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
295a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73  ION(CK_RV, C_Des
295b0 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  troyObject)(CK_S
295c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
295d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
295e0 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
295f0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
29600 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29610 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29620 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29650 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29660 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29670 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29680 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29690 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
296a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
296b0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
296c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
296d0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
296e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
296f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
29700 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29710 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29720 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29730 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53  RV, C_GetObjectS
29740 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ize)(CK_SESSION_
29750 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
29760 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
29770 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c  E hObject, CK_UL
29780 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29  ONG_PTR pulSize)
29790 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
297a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
297b0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
297c0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
297d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
297e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
297f0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
29800 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29810 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
29820 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
29830 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29840 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
29850 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29860 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
29870 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
29880 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29890 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
298a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
298b0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
298c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
298d0 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75 74  V, C_GetAttribut
298e0 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49  eValue)(CK_SESSI
298f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29900 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
29910 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
29920 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
29930 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
29940 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
29950 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
29960 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20  r_attr;..struct 
29970 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
29980 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69  *identity;..unsi
29990 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
299a0 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  ty_idx, attr_idx
299b0 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c  , sess_attr_idx,
299c0 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d   num_ids;..int m
299d0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  utex_retval;..CK
299e0 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52  _RV retval = CKR
299f0 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  _OK;..CK_VOID_PT
29a00 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c  R pValue;..CK_UL
29a10 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  ONG ulValueLen;.
29a20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29a30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29a40 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
29a50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
29a60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29a70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29a80 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29a90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29aa0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29ab0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29ac0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
29ad0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
29ae0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
29af0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
29b00 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
29b10 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
29b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29b30 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
29b40 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
29b50 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
29b60 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
29b70 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29b80 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20  .if (hObject == 
29b90 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
29ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29bb0 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
29bc0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  e out of range."
29bd0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
29be0 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  KR_OBJECT_HANDLE
29bf0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
29c00 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30  if (ulCount == 0
29c10 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
29c20 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20  ircuit, if zero 
29c30 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65  objects were spe
29c40 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65  cified return ze
29c50 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61  ro items immedia
29c60 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59  tely */...CACKEY
29c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29c80 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
29c90 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
29ca0 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
29cb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
29cc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d  );..}...if (pTem
29cd0 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  plate == NULL) {
29ce0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29cf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29d00 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c  pTemplate is NUL
29d10 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
29d20 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
29d30 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
29d40 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20  y_idx = hObject 
29d50 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  - 1;...mutex_ret
29d60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
29d70 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
29d80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
29d90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
29da0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29db0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29dc0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
29dd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29de0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
29df0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
29e00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29e10 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
29e20 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
29e30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
29e40 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
29e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29e60 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
29e70 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
29e80 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
29e90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
29ea0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d  VALID);..}...num
29eb0 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ids = cackey_se
29ec0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29ed0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
29ee0 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  t;...if (identit
29ef0 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73  y_idx >= num_ids
29f00 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
29f10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29f20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
29f30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29f40 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
29f50 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
29f60 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79  range.  identity
29f70 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f  _idx = %lu, num_
29f80 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e  ids = %lu.", (un
29f90 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
29fa0 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69  ntity_idx, (unsi
29fb0 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69  gned long) num_i
29fc0 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ds);....return(C
29fd0 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  KR_OBJECT_HANDLE
29fe0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
29ff0 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
2a000 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a010 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2a020 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a  [identity_idx];.
2a030 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20  ..for (attr_idx 
2a040 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20  = 0; attr_idx < 
2a050 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64  ulCount; attr_id
2a060 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74  x++) {...curr_at
2a070 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b  tr = &pTemplate[
2a080 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56  attr_idx];....pV
2a090 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
2a0a0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
2a0b0 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43  LONG) -1;....CAC
2a0c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a0d0 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74  ("Looking for at
2a0e0 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20  tribute 0x%08lx 
2a0f0 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e  (identity:%lu) .
2a100 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
2a110 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e  ong) curr_attr->
2a120 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  type, (unsigned 
2a130 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
2a140 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73  dx);....for (ses
2a150 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  s_attr_idx = 0; 
2a160 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20  sess_attr_idx < 
2a170 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
2a180 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
2a190 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
2a1a0 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
2a1b0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
2a1c0 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d  attr_idx].type =
2a1d0 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  = curr_attr->typ
2a1e0 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  e) {.....CACKEY_
2a1f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
2a200 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61  .. found it, pVa
2a210 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75  lue = %p, ulValu
2a220 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65  eLen = %lu", ide
2a230 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
2a240 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
2a250 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74  .pValue, identit
2a260 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
2a270 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
2a280 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09  alueLen);.......
2a290 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e  ...pValue = iden
2a2a0 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
2a2b0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
2a2c0 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61  pValue;.....ulVa
2a2d0 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74  lueLen = identit
2a2e0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
2a2f0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
2a300 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09  alueLen;....}...
2a310 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74  }....if (curr_at
2a320 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56  tr->pValue && pV
2a330 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63  alue) {....if (c
2a340 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
2a350 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c  eLen >= ulValueL
2a360 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79  en) {.....memcpy
2a370 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
2a380 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61  ue, pValue, ulVa
2a390 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c  lueLen);....} el
2a3a0 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65  se {.....ulValue
2a3b0 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
2a3c0 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  -1;......retval 
2a3d0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2a3e0 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d  _SMALL;....}...}
2a3f0 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75  ....curr_attr->u
2a400 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61  lValueLen = ulVa
2a410 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74  lueLen;..}...mut
2a420 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2a430 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2a440 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2a450 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2a460 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2a470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a480 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2a490 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2a4a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2a4b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2a4c0 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  ..if (retval == 
2a4d0 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
2a4e0 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09  PE_INVALID) {...
2a4f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a500 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2a510 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  KR_ATTRIBUTE_TYP
2a520 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c  E_INVALID (%i)",
2a530 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
2a540 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76  .} else if (retv
2a550 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  al == CKR_BUFFER
2a560 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
2a570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a580 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2a590 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2a5a0 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29  ALL (%i)", (int)
2a5b0 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73   retval);..} els
2a5c0 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  e if (retval == 
2a5d0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
2a5e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a5f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2a600 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  K (%i)", (int) r
2a610 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
2a620 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a630 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2a640 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
2a650 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tval);..}...retu
2a660 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
2a670 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a680 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74  N(CK_RV, C_SetAt
2a690 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b  tributeValue)(CK
2a6a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a6b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
2a6c0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
2a6d0 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
2a6e0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
2a6f0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
2a700 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2a710 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2a720 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2a730 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2a740 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a750 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a760 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2a770 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2a780 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2a790 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2a7a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a7b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2a7c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2a7d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2a7e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2a7f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2a800 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2a810 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a820 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2a830 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a840 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
2a850 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  sInit)(CK_SESSIO
2a860 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2a870 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
2a880 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
2a890 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
2a8a0 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73   {..CK_SLOT_ID s
2a8b0 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  lotID;..CK_ULONG
2a8c0 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
2a8d0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
2a8e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a8f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2a900 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2a910 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2a920 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a930 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2a940 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2a950 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2a960 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2a970 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2a980 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2a990 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2a9a0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2a9b0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2a9c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2a9d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a9e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a9f0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2aa00 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2aa10 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2aa20 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2aa30 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
2aa40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2aa50 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2aa60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2aa70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2aa80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2aa90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2aaa0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2aab0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2aac0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2aad0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2aae0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2aaf0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2ab00 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2ab10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2ab20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2ab30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ab40 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2ab50 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2ab60 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2ab70 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ab80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2ab90 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2aba0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2abb0 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
2abc0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2abd0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2abe0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2abf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ac00 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72  ror.  Search alr
2ac10 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a  eady active.");.
2ac20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2ac30 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
2ac40 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
2ac50 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2ac60 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
2ac70 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
2ac80 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
2ac90 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2aca0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
2acb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
2acc0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2acd0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ace0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
2acf0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
2ad00 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
2ad10 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
2ad20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ad30 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2ad40 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2ad50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
2ad60 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
2ad70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ad80 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
2ad90 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
2ada0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
2adb0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
2adc0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
2add0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2ade0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2adf0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
2ae00 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2ae10 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2ae20 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2ae30 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  D].slot_reset) {
2ae40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ae50 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74  PRINTF("The slot
2ae60 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 20   has been reset 
2ae70 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f  since we last lo
2ae80 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74  oked for identit
2ae90 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e  ies -- rescannin
2aea0 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  g");....if (cack
2aeb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2aec0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2aed0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63   != NULL) {....c
2aee0 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
2aef0 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73  ities(cackey_ses
2af00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2af10 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b  identities, cack
2af20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2af30 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2af40 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63  _count);.....cac
2af50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2af60 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2af70 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63  s = NULL;....cac
2af80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2af90 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2afa0 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d  s_count = 0;...}
2afb0 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
2afc0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
2afd0 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el != NULL) {...
2afe0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
2aff0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
2b000 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  );....cackey_slo
2b010 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
2b020 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
2b030 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
2b040 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73  _reset(&cackey_s
2b050 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09  lots[slotID]);..
2b060 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
2b070 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
2b080 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63   = 0;..}...if (c
2b090 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b0a0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2b0b0 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies == NULL) {..
2b0c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2b0d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2b0e0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
2b0f0 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
2b100 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2b110 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
2b120 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b130 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
2b140 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  t);..}...if (pTe
2b150 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20  mplate != NULL) 
2b160 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
2b170 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
2b180 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b190 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2b1a0 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e  y_count = ulCoun
2b1b0 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  t;....cackey_ses
2b1c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b1d0 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d  search_query = m
2b1e0 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20  alloc(ulCount * 
2b1f0 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74  sizeof(*pTemplat
2b200 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  e));.....memcpy(
2b210 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b220 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b230 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74  _query, pTemplat
2b240 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  e, ulCount * siz
2b250 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
2b260 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20  ;....for (idx = 
2b270 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  0; idx < ulCount
2b280 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69  ; idx++) {.....i
2b290 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  f (pTemplate[idx
2b2a0 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ].ulValueLen == 
2b2b0 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79  0) {......cackey
2b2c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b2d0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2b2e0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e  [idx].pValue = N
2b2f0 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69  ULL;.......conti
2b300 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
2b310 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b320 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b330 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
2b340 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d  ue = malloc(pTem
2b350 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
2b360 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20  ueLen);......if 
2b370 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b380 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2b390 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
2b3a0 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  lue) {......memc
2b3b0 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
2b3c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b3d0 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
2b3e0 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65  Value, pTemplate
2b3f0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54  [idx].pValue, pT
2b400 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56  emplate[idx].ulV
2b410 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a  alueLen);.....}.
2b420 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
2b430 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b440 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b450 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
2b460 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 0;....cackey_s
2b470 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b480 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d  ].search_query =
2b490 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c   NULL;...}..} el
2b4a0 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75  se {...if (ulCou
2b4b0 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61  nt != 0) {....ca
2b4c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b4d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b4e0 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
2b4f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b500 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72 79  r.  Search query
2b510 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
2b520 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f  LL, but number o
2b530 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f  f query terms no
2b540 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  t specified as 0
2b550 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
2b560 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2b570 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  D);...}....cacke
2b580 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b590 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2b5a0 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63  y_count = 0;...c
2b5b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b5c0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b5d0 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  query = NULL;..}
2b5e0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b5f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b600 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  rch_active = 1;.
2b610 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2b620 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2b630 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a  h_curr_id = 0;..
2b640 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2b650 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2b660 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b670 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2b680 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2b690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b6a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2b6b0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2b6c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b6d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2b6e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2b6f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2b700 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2b710 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2b720 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2b730 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
2b740 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
2b750 65 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f  e_attributes(CK_
2b760 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b  ATTRIBUTE *a, CK
2b770 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b  _ATTRIBUTE *b) {
2b780 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
2b790 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67  *smallbuf, *larg
2b7a0 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d  ebuf;..size_t sm
2b7b0 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67  allbuf_len, larg
2b7c0 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  ebuf_len;...if (
2b7d0 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79  a->type != b->ty
2b7e0 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30  pe) {...return(0
2b7f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b800 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
2b810 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68   ... found match
2b820 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a  ing type ...");.
2b830 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b840 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e  RINTBUF("    ...
2b850 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d   our value:", a-
2b860 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61  >pValue, a->ulVa
2b870 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62  lueLen);...if (b
2b880 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c  ->pValue == NULL
2b890 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b8a0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
2b8b0 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64    ... found wild
2b8c0 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09  card match");...
2b8d0 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
2b8e0 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d  .if (a->pValue =
2b8f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
2b900 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20  rn(0);..}.. .if 
2b910 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  (b->ulValueLen =
2b920 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  = a->ulValueLen 
2b930 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61  && memcmp(a->pVa
2b940 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20  lue, b->pValue, 
2b950 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d  b->ulValueLen) =
2b960 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2b970 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
2b980 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65       ... found e
2b990 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09  xact match");...
2b9a0 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
2b9b0 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65  .switch (a->type
2b9c0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ) {...case CKA_M
2b9d0 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61  ODULUS:....if (a
2b9e0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ->ulValueLen == 
2b9f0 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  b->ulValueLen) {
2ba00 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
2ba10 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61  .....if (a->ulVa
2ba20 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61  lueLen > b->ulVa
2ba30 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d  lueLen) {.....sm
2ba40 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c  allbuf = b->pVal
2ba50 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  ue;.....smallbuf
2ba60 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75  _len = b->ulValu
2ba70 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65  eLen;......large
2ba80 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
2ba90 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65  .....largebuf_le
2baa0 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
2bab0 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  n;....} else {..
2bac0 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d  ...smallbuf = a-
2bad0 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61  >pValue;.....sma
2bae0 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  llbuf_len = a->u
2baf0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
2bb00 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56  largebuf = b->pV
2bb10 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62  alue;.....largeb
2bb20 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61  uf_len = b->ulVa
2bb30 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09  lueLen;....}....
2bb40 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66  .for (; largebuf
2bb50 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66  _len != smallbuf
2bb60 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b  _len; largebuf++
2bb70 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29  ,largebuf_len--)
2bb80 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65   {.....if (large
2bb90 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09  buf[0] != 0) {..
2bba0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
2bbb0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61  ....}.....if (la
2bbc0 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d  rgebuf_len != sm
2bbd0 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09  allbuf_len) {...
2bbe0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
2bbf0 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72  ..if (memcmp(lar
2bc00 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c  gebuf, smallbuf,
2bc10 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d   smallbuf_len) =
2bc20 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2bc30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bc40 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
2bc50 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74   approximate mat
2bc60 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  ch");......retur
2bc70 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  n(1);....}.....b
2bc80 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  reak;..}...retur
2bc90 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  n(0);.}..CK_DEFI
2bca0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2bcb0 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
2bcc0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2bcd0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2bce0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
2bcf0 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  TR phObject, CK_
2bd00 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63  ULONG ulMaxObjec
2bd10 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47  tCount, CK_ULONG
2bd20 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f  _PTR pulObjectCo
2bd30 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  unt) {..struct c
2bd40 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
2bd50 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54  curr_id;..CK_ATT
2bd60 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
2bd70 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72  r;..CK_ULONG cur
2bd80 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f  r_id_idx, curr_o
2bd90 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  ut_id_idx, curr_
2bda0 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
2bdb0 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f  ttr_idx;..CK_ULO
2bdc0 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  NG matched_count
2bdd0 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63  , prev_matched_c
2bde0 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  ount;..int mutex
2bdf0 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20  _retval;.#ifdef 
2be00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
2be10 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73  RCH_SPEEDTEST..s
2be20 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74  truct timeval st
2be30 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36  art, end;..uint6
2be40 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65  4_t start_int, e
2be50 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a  nd_int;.#endif..
2be60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2be70 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2be80 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2be90 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2bea0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2beb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2bec0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2bed0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2bee0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2bef0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2bf00 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  f (pulObjectCoun
2bf10 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
2bf20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bf30 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f  TF("Error.  pulO
2bf40 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55  bjectCount is NU
2bf50 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2bf60 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2bf70 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  AD);..}...if (ph
2bf80 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26  Object == NULL &
2bf90 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
2bfa0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
2bfb0 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
2bfc0 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
2bfd0 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
2bfe0 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
2bff0 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
2c000 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  .*pulObjectCount
2c010 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   = 0;....CACKEY_
2c020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2c030 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2c040 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
2c050 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
2c060 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2c070 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a  ;..}...if (phObj
2c080 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ect == NULL) {..
2c090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c0a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68  INTF("Error.  ph
2c0b0 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22  Object is NULL."
2c0c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c0d0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2c0e0 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f  ..}...if (ulMaxO
2c0f0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
2c100 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c110 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c120 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72    Maximum number
2c130 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63   of objects spec
2c140 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29  ified as zero.")
2c150 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c160 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2c170 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2c180 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2c190 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2c1a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2c1b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2c1c0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2c1d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c1e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2c1f0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2c200 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2c210 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2c220 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2c230 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2c240 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2c250 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2c260 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2c270 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2c280 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c290 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c2a0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2c2b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c2c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2c2d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2c2e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c2f0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2c300 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2c310 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2c320 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2c330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c340 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2c350 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2c360 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2c370 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2c380 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2c390 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2c3a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2c3b0 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
2c3c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2c3d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c3e0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2c3f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c400 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63  .  Search not ac
2c410 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2c420 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2c430 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2c440 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ED);..}..#ifdef 
2c450 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
2c460 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67  RCH_SPEEDTEST..g
2c470 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61  ettimeofday(&sta
2c480 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  rt, NULL);.#endi
2c490 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f  f...curr_out_id_
2c4a0 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63  idx = 0;..for (c
2c4b0 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63  urr_id_idx = cac
2c4c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c4d0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
2c4e0 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69  rr_id; curr_id_i
2c4f0 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
2c500 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2c510 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
2c520 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  && ulMaxObjectCo
2c530 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78  unt; curr_id_idx
2c540 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20  ++) {...curr_id 
2c550 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
2c560 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2c570 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f  ntities[curr_id_
2c580 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  idx];....CACKEY_
2c590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72  DEBUG_PRINTF("Pr
2c5a0 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74  ocessing identit
2c5b0 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  y:%lu", (unsigne
2c5c0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f  d long) curr_id_
2c5d0 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64  idx);....matched
2c5e0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66  _count = 0;....f
2c5f0 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64  or (curr_attr_id
2c600 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72  x = 0; curr_attr
2c610 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65  _idx < cackey_se
2c620 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c630 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
2c640 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  unt; curr_attr_i
2c650 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f  dx++) {....prev_
2c660 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20  matched_count = 
2c670 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a  matched_count;..
2c680 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26  ...curr_attr = &
2c690 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c6a0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2c6b0 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72  _query[curr_attr
2c6c0 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45  _idx];.....CACKE
2c6d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c6e0 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61    Checking for a
2c6f0 74 74 72 69 62 75 74 65 20 25 73 20 28 30 78 25  ttribute %s (0x%
2c700 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74  08lx) in identit
2c710 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  y:%i...", CACKEY
2c720 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52  _DEBUG_FUNC_ATTR
2c730 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72  IBUTE_TO_STR(cur
2c740 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28  r_attr->type), (
2c750 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
2c760 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20  urr_attr->type, 
2c770 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
2c780 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  x);....CACKEY_DE
2c790 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
2c7a0 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20    Value looking 
2c7b0 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72  for:", curr_attr
2c7c0 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61  ->pValue, curr_a
2c7d0 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  ttr->ulValueLen)
2c7e0 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f  ;.....for (sess_
2c7f0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
2c800 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75  ss_attr_idx < cu
2c810 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
2c820 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
2c830 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
2c840 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31  if (cackey_pkcs1
2c850 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
2c860 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61  utes(&curr_id->a
2c870 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
2c880 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61  ttr_idx], curr_a
2c890 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74  ttr)) {......mat
2c8a0 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09  ched_count++;...
2c8b0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
2c8c0 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20  ....}...../* If 
2c8d0 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f  the attribute co
2c8e0 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68  uld not be match
2c8f0 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74  ed, do not try t
2c900 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e  o match addition
2c910 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f  al attributes */
2c920 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74  ....if (prev_mat
2c930 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61  ched_count == ma
2c940 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  tched_count) {..
2c950 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
2c960 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65  .}....if (matche
2c970 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65  d_count == cacke
2c980 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c990 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2c9a0 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  y_count) {....CA
2c9b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c9c0 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20  F("  ... All %i 
2c9d0 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
2c9e0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64  ed for found, ad
2c9f0 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69  ding identity:%i
2ca00 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73   to returned lis
2ca10 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  t", (int) cackey
2ca20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ca30 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2ca40 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
2ca50 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09  rr_id_idx);.....
2ca60 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75  phObject[curr_ou
2ca70 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72  t_id_idx] = curr
2ca80 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09  _id_idx + 1;....
2ca90 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  .ulMaxObjectCoun
2caa0 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75  t--;.....curr_ou
2cab0 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20  t_id_idx++;...} 
2cac0 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
2cad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
2cae0 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20   ... Not all %i 
2caf0 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20  (only found %i) 
2cb00 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
2cb10 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f  ed for found, no
2cb20 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  t adding identit
2cb30 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63  y:%i", (int) cac
2cb40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cb50 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2cb60 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
2cb70 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
2cb80 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
2cb90 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b  x);...}..}..cack
2cba0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2cbb0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
2cbc0 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69  r_id = curr_id_i
2cbd0 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43  dx;..*pulObjectC
2cbe0 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f  ount = curr_out_
2cbf0 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20  id_idx;..#ifdef 
2cc00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
2cc10 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67  RCH_SPEEDTEST..g
2cc20 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64  ettimeofday(&end
2cc30 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f  , NULL);..start_
2cc40 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f  int = (start.tv_
2cc50 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b  sec * 1000000) +
2cc60 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a   start.tv_usec;.
2cc70 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e  .end_int = (end.
2cc80 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30  tv_sec * 1000000
2cc90 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b  ) + end.tv_usec;
2cca0 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
2ccb0 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25  , "Search took %
2ccc0 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c  lu microseconds\
2ccd0 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  n", (unsigned lo
2cce0 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73  ng) (end_int - s
2ccf0 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64  tart_int));.#end
2cd00 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  if...mutex_retva
2cd10 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2cd20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2cd30 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2cd40 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2cd50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2cd60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2cd70 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2cd80 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2cd90 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2cda0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2cdb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2cdc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2cdd0 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74  (%i), num object
2cde0 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b  s = %lu", CKR_OK
2cdf0 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  , *pulObjectCoun
2ce00 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
2ce10 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2ce20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2ce30 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
2ce40 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2ce50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2ce60 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69  n) {..CK_ULONG i
2ce70 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
2ce80 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
2ce90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2cea0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2ceb0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2cec0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2ced0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2cee0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2cef0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2cf00 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2cf10 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2cf20 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2cf30 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2cf40 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2cf50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2cf60 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2cf70 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2cf80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2cf90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cfa0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2cfb0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2cfc0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2cfd0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2cfe0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2cff0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2d000 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2d010 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2d020 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2d030 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d040 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d050 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2d060 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d070 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2d080 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2d090 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d0a0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2d0b0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2d0c0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d0d0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2d0e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d0f0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2d100 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2d110 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2d120 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2d130 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2d140 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d150 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2d160 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
2d170 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2d180 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2d190 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2d1a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d1b0 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20  or.  Search not 
2d1c0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2d1d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2d1e0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2d1f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  IZED);..}...cack
2d200 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d210 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
2d220 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28  ive = 0;...for (
2d230 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
2d240 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d250 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2d260 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78  query_count; idx
2d270 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
2d280 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d290 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2d2a0 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20  ry[idx].pValue) 
2d2b0 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
2d2c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d2d0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2d2e0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09  [idx].pValue);..
2d2f0 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  .}..}...if (cack
2d300 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d310 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2d320 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63  ry) {...free(cac
2d330 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d340 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2d350 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ery);..}...mutex
2d360 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2d370 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2d380 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2d390 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2d3a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2d3b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d3c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2d3d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2d3e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2d3f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2d400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d410 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d420 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2d430 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2d440 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2d450 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d460 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e  _RV, C_EncryptIn
2d470 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2d480 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2d490 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2d4a0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2d4b0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2d4c0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2d4d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2d4e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2d4f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2d500 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d510 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d520 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2d530 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2d540 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2d550 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2d560 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2d570 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2d580 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2d590 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2d5a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2d5b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d5c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2d5d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d5e0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2d5f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2d600 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29  K_RV, C_Encrypt)
2d610 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2d620 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2d630 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2d640 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
2d650 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2d660 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
2d670 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2d680 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
2d690 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2d6a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d6b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d6c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d6d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d6e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d6f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d700 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d710 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d720 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d730 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d740 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d750 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2d760 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2d770 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2d780 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d790 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(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 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2d7c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d7d0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64  RV, C_EncryptUpd
2d7e0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2d7f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2d800 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2d810 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2d820 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2d830 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2d840 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2d850 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2d860 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2d870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d880 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d890 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d8a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d8b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d8c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d8d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d8e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d8f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d900 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d910 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d920 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d930 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d940 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d950 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d960 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d970 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d980 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d990 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d9a0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
2d9b0 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
2d9c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2d9d0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2d9e0 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  pLastEncryptedPa
2d9f0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2da00 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65   pulLastEncrypte
2da10 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
2da20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2da30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2da40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2da50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2da60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2da70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2da80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2da90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2daa0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2dab0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2dac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dad0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2dae0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2daf0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2db00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2db10 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2db20 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2db30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2db40 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2db50 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2db60 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
2db70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2db80 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2db90 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2dba0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2dbb0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
2dbc0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2dbd0 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
2dbe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dbf0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2dc00 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2dc10 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2dc20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dc30 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2dc40 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2dc50 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2dc60 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2dc70 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
2dc80 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
2dc90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2dca0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2dcb0 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
2dcc0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2dcd0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2dce0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2dcf0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
2dd00 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
2dd10 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
2dd20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dd30 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
2dd40 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
2dd50 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
2dd60 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  M_RSA_PKCS");...
2dd70 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
2dd80 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
2dd90 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
2dda0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2ddb0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2ddc0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2ddd0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2dde0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2ddf0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2de00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2de10 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2de20 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2de30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2de40 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2de50 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2de60 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2de70 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2de80 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2de90 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2dea0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2deb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dec0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2ded0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2dee0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2def0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2df00 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2df10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2df20 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2df30 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2df40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2df50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2df60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2df70 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2df80 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2df90 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2dfa0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2dfb0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
2dfc0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2dfd0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
2dfe0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2dff0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e000 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2e010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e020 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
2e030 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
2e040 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
2e050 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2e060 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
2e070 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
2e080 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e090 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2e0a0 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
2e0b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2e0c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2e0d0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2e0e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e0f0 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
2e100 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65   of range (reque
2e110 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e  sted key %lu, on
2e120 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65  ly %lu identitie
2e130 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20  s available).", 
2e140 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2e150 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  hKey, (unsigned 
2e160 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73  long) cackey_ses
2e170 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e180 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2e190 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e1a0 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
2e1b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
2e1c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e1d0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2e1e0 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
2e1f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e200 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
2e210 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
2e220 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
2e230 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2e240 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2e250 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70  pt_mech_parm = p
2e260 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61  Mechanism->pPara
2e270 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73  meter;..cackey_s
2e280 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e290 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
2e2a0 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e  armlen = pMechan
2e2b0 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72  ism->ulParameter
2e2c0 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  Len;..cackey_ses
2e2d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e2e0 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
2e2f0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
2e300 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2e310 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a  entities[hKey];.
2e320 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2e330 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2e340 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2e350 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2e360 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2e370 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e380 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2e390 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2e3a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2e3b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2e3c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2e3d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2e3e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2e3f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2e400 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2e410 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2e420 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2e430 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
2e440 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2e450 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e460 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
2e470 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
2e480 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42  tedDataLen, CK_B
2e490 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2e4a0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
2e4b0 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ataLen) {..CK_UL
2e4c0 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  ONG datalen_upda
2e4d0 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  te, datalen_fina
2e4e0 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70  l;..CK_RV decryp
2e4f0 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  t_ret;..int mute
2e500 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2e510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e520 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2e530 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2e540 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2e550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e560 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e570 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e580 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e590 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e5a0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
2e5b0 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lDataLen == NULL
2e5c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e5d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e5e0 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20  . pulDataLen is 
2e5f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2e600 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2e610 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61  _BAD);..}...data
2e620 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75  len_update = *pu
2e630 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72  lDataLen;...decr
2e640 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
2e650 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69  yptUpdate(hSessi
2e660 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61  on, pEncryptedDa
2e670 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44  ta, ulEncryptedD
2e680 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26  ataLen, pData, &
2e690 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b  datalen_update);
2e6a0 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
2e6b0 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
2e6c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e6d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2e6e0 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65  cryptUpdate() re
2e6f0 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
2e700 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
2e710 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
2e720 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66  rypt_ret);....if
2e730 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
2e740 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
2e750 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54  SMALL) {..../* T
2e760 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74  erminate decrypt
2e770 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
2e780 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  .....mutex_retva
2e790 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2e7a0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2e7b0 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2e7c0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2e7d0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2e7e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e7f0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2e800 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
2e810 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2e820 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
2e830 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2e840 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2e850 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
2e860 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2e870 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2e880 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
2e890 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e8a0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2e8b0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2e8c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2e8d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2e8e0 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  LID);....}.....i
2e8f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2e900 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2e910 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
2e920 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2e930 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2e940 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
2e950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e960 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
2e970 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
2e980 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
2e990 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
2e9a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2e9b0 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
2e9c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e9d0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2e9e0 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78  e = 0;.....mutex
2e9f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2ea00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2ea10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2ea20 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2ea30 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
2ea40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ea50 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2ea60 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2ea70 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2ea80 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2ea90 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
2eaa0 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
2eab0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61  ;..}...if (pData
2eac0 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64  ) {...pData += d
2ead0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09  atalen_update;..
2eae0 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  }..datalen_final
2eaf0 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d   = *pulDataLen -
2eb00 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
2eb10 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
2eb20 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28   C_DecryptFinal(
2eb30 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c  hSession, pData,
2eb40 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29   &datalen_final)
2eb50 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
2eb60 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
2eb70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2eb80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2eb90 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65  ecryptFinal() re
2eba0 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
2ebb0 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
2ebc0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
2ebd0 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65  rypt_ret);....re
2ebe0 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
2ebf0 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61  );..}...*pulData
2ec00 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70  Len = datalen_up
2ec10 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66  date + datalen_f
2ec20 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  inal;...CACKEY_D
2ec30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2ec40 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2ec50 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2ec60 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2ec70 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2ec80 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2ec90 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ecryptUpdate)(CK
2eca0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2ecb0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2ecc0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2ecd0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2ece0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2ecf0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2ed00 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
2ed10 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
2ed20 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
2ed30 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73   buf[16384];..ss
2ed40 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43  ize_t buflen;..C
2ed50 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
2ed60 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
2ed70 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
2ed80 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ROR;..int mutex_
2ed90 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2eda0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2edb0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2edc0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2edd0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2ede0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2edf0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2ee00 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2ee10 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2ee20 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2ee30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2ee40 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2ee50 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2ee60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2ee70 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2ee80 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2ee90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2eea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2eeb0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2eec0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2eed0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2eee0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2eef0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  D);..}...if (pEn
2ef00 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
2ef10 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74  ULL && ulEncrypt
2ef20 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
2ef30 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
2ef40 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
2ef50 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20  sked to decrypt 
2ef60 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
2ef70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ef80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ef90 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
2efa0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
2efb0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
2efc0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
2efd0 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
2efe0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2eff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f000 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79  F("Error. pEncry
2f010 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c  ptedPart is NULL
2f020 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65  , but ulEncrypte
2f030 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  dPartLen is not 
2f040 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
2f050 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2f060 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45  D);..}...if (ulE
2f070 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2f080 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2f090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f0a0 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65  rror. ulEncrypte
2f0b0 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  dPartLen is 0, b
2f0c0 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
2f0d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2f0e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2f0f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2f100 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  pulPartLen == NU
2f110 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2f120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f130 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69  or. pulPartLen i
2f140 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2f150 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2f160 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
2f170 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2f180 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2f190 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2f1a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2f1b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2f1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f1d0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2f1e0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2f1f0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2f200 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2f210 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2f220 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2f230 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2f240 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2f250 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2f260 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f270 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2f280 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2f290 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2f2a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2f2b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2f2c0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2f2d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f2e0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2f2f0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2f300 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2f310 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2f320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f330 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2f340 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
2f350 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2f360 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2f370 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2f380 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
2f390 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2f3a0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
2f3b0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
2f3c0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
2f3d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
2f3e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2f3f0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
2f400 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f410 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
2f420 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
2f430 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
2f440 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
2f450 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
2f460 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2f470 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2f480 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
2f490 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
2f4a0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
2f4b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f4c0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
2f4d0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
2f4e0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
2f4f0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
2f500 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
2f510 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2f520 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2f530 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2f540 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2f550 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
2f560 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f570 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2f580 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
2f590 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
2f5a0 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
2f5b0 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09   to decrypt */..
2f5c0 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  ..buflen = cacke
2f5d0 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
2f5e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2f5f0 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
2f600 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2f610 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c  ecrypt_identity,
2f620 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
2f630 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
2f640 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  Len, buf, sizeof
2f650 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09  (buf), 0, 1);...
2f660 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  ..if (buflen == 
2f670 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
2f680 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b 65  EDLOGIN && cacke
2f690 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
2f6a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66 20   NULL) {.....if 
2f6b0 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67  (C_LoginMutexArg
2f6c0 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55  (hSession, CKU_U
2f6d0 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29  SER, NULL, 0, 0)
2f6e0 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
2f6f0 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  ...buflen = cack
2f700 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
2f710 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2f720 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
2f730 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2f740 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
2f750 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  , pEncryptedPart
2f760 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  , ulEncryptedPar
2f770 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f  tLen, buf, sizeo
2f780 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 09  f(buf), 0, 1);..
2f790 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
2f7a0 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a   (buflen < 0) {.
2f7b0 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f  ..../* Decryptio
2f7c0 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09  n failed. */....
2f7d0 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43  .if (buflen == C
2f7e0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
2f7f0 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72  DLOGIN) {......r
2f800 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52  etval = CKR_USER
2f810 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a  _NOT_LOGGED_IN;.
2f820 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62  ....} else if (b
2f830 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2f840 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
2f850 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
2f860 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
2f870 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
2f880 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  se {......CACKEY
2f890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
2f8a0 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
2f8b0 44 55 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69 22  DU, error = %li"
2f8c0 2c 20 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75 66  , (long int) buf
2f8d0 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74 76  len);.......retv
2f8e0 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
2f8f0 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09  _ERROR;.....}...
2f900 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e  .} else if (((un
2f910 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
2f920 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c  len) > *pulPartL
2f930 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09  en && pPart) {..
2f940 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20  .../* Decrypted 
2f950 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a  data too large *
2f960 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  /.....retval = C
2f970 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2f980 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ALL;....} else {
2f990 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20  .....if (pPart) 
2f9a0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50  {......memcpy(pP
2f9b0 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  art, buf, buflen
2f9c0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  );.....}......*p
2f9d0 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c  ulPartLen = bufl
2f9e0 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
2f9f0 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
2fa00 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
2fa10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2fa20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2fa30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2fa40 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2fa50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2fa60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fa70 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2fa80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2fa90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2faa0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2fab0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2fac0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2fad0 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
2fae0 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
2faf0 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
2fb00 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2fb10 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46  K_RV, C_DecryptF
2fb20 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2fb30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2fb40 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
2fb50 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  astPart, CK_ULON
2fb60 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72  G_PTR pulLastPar
2fb70 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
2fb80 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
2fb90 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
2fba0 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
2fbb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2fbc0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2fbd0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2fbe0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2fbf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fc00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2fc10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2fc20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2fc30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2fc40 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2fc50 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2fc60 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2fc70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2fc80 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2fc90 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2fca0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2fcb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2fcc0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2fcd0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2fce0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2fcf0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2fd00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c  );..}...if (pulL
2fd10 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  astPartLen == NU
2fd20 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2fd30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fd40 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c  or. pulLastPartL
2fd50 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
2fd60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2fd70 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2fd80 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2fd90 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2fda0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2fdb0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2fdc0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2fdd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fde0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2fdf0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2fe00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2fe10 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2fe20 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2fe30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2fe40 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
2fe50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2fe60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2fe70 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2fe80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2fe90 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2fea0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2feb0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2fec0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2fed0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2fee0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2fef0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
2ff00 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2ff10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ff20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ff30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ff40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ff50 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
2ff60 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2ff70 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2ff80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2ff90 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74  );..}...*pulLast
2ffa0 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69  PartLen = 0;...i
2ffb0 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20  f (pLastPart == 
2ffc0 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e  NULL) {...termin
2ffd0 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b  ate_decrypt = 0;
2ffe0 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
2fff0 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09  ate_decrypt) {..
30000 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
30010 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
30020 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  pt_active = 0;..
30030 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
30040 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
30050 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
30060 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
30070 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
30080 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
300a0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
300b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
300c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
300d0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
300e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
300f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
30100 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
30110 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
30120 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
30130 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
30140 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53  DigestInit)(CK_S
30150 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
30160 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
30170 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
30180 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ism) {..CACKEY_D
30190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
301a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
301b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
301c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
301d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
301e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
301f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
30200 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
30210 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
30220 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
30230 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
30240 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
30250 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
30260 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
30270 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30280 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
30290 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
302a0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
302b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
302c0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29  CK_RV, C_Digest)
302d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
302e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
302f0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
30300 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
30310 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
30320 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e  pDigest, CK_ULON
30330 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c  G_PTR pulDigestL
30340 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
30350 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
30360 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
30370 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
30380 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30390 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
303a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
303b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
303c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
303d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
303e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
303f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30400 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
30410 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
30420 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
30430 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30440 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
30450 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30460 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
30470 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
30480 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70  K_RV, C_DigestUp
30490 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
304a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
304b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
304c0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
304d0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
304e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
304f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30500 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30510 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
30520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30530 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
30540 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
30550 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
30560 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
30570 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
30580 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
30590 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
305a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
305b0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
305c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
305d0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
305e0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
305f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
30600 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30610 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
30620 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  estKey)(CK_SESSI
30630 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
30640 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
30650 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
30660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30670 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30680 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
30690 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
306a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
306b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
306c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
306d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
306e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
306f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
30700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
30720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30730 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
30740 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30750 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
30760 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
30770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
30780 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
30790 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
307a0 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53  igestFinal)(CK_S
307b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
307c0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
307d0 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
307e0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
307f0 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
30800 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30810 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
30820 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
30830 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
30840 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30850 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
30860 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
30870 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
30880 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
30890 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
308a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
308b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
308c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
308d0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
308e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
308f0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
30900 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30910 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
30920 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30930 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
30940 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
30950 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
30960 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
30970 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
30980 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
30990 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74  hKey) {..int mut
309a0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65  ex_retval;...hKe
309b0 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  y--;...CACKEY_DE
309c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
309d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
309e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
309f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30a00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30a10 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
30a20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
30a30 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
30a40 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
30a50 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
30a60 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ism == NULL) {..
30a70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30a80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
30a90 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e  chanism is NULL.
30aa0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
30ab0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
30ac0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
30ad0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
30ae0 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   != CKM_RSA_PKCS
30af0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30b00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30b10 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  . pMechanism->me
30b20 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63  chanism not spec
30b30 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41  ified as CKM_RSA
30b40 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75  _PKCS");....retu
30b50 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d  rn(CKR_MECHANISM
30b60 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b  _PARAM_INVALID);
30b70 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
30b80 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
30b90 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
30ba0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
30bb0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
30bc0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
30bd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30be0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30bf0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
30c00 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
30c10 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
30c20 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
30c30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
30c40 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
30c50 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
30c60 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
30c70 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
30c80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
30c90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30ca0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
30cb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
30cc0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
30cd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
30ce0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30cf0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
30d00 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
30d10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
30d20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
30d30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30d40 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
30d50 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
30d60 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
30d70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
30d80 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
30d90 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
30da0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30db0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
30dc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
30dd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
30de0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
30df0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30e00 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e   Sign already in
30e10 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
30e20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
30e30 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
30e40 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
30e50 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
30e60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
30e70 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
30e80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
30e90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
30ea0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
30eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30ec0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
30ed0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
30ee0 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
30ef0 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
30f00 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
30f10 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
30f20 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
30f30 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
30f40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30f50 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
30f60 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
30f70 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
30f80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
30f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30fa0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
30fb0 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
30fc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
30fd0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
30fe0 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
30ff0 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a  sm->mechanism;..
31000 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
31010 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31020 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63  buflen = 128;..c
31030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31040 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
31050 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b  fused = 0;..cack
31060 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31070 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
31080 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
31090 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
310a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
310b0 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73  uf) * cackey_ses
310c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
310d0 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09  sign_buflen);...
310e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
310f0 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75  NTF("Session %lu
31100 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69   sign_identity i
31110 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23  s %p (identity #
31120 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
31130 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c   long) hSession,
31140 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65   (void *) &cacke
31150 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
31160 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
31170 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64  hKey], (unsigned
31180 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63   long) hKey);..c
31190 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
311a0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
311b0 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
311c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
311d0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
311e0 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
311f0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
31200 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
31210 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
31220 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
31230 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
31240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31250 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
31260 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
31270 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
31280 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
31290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
312a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
312b0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
312c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
312d0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
312e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
312f0 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53  , C_Sign)(CK_SES
31300 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
31310 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
31320 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
31330 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
31340 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
31350 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
31360 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
31370 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
31380 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62  ong start_sign_b
31390 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73  ufused;..CK_RV s
313a0 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  ign_ret;..int mu
313b0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
313c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
313d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
313e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
313f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
31400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31410 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
31420 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
31430 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
31440 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
31450 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
31460 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
31470 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
31480 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
31490 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
314a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
314b0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
314c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
314d0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
314e0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
314f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
31500 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
31510 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61  VALID);..}...sta
31520 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20  rt_sign_bufused 
31530 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
31540 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31550 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e  _bufused;...sign
31560 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64  _ret = C_SignUpd
31570 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  ate(hSession, pD
31580 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b  ata, ulDataLen);
31590 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
315a0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
315b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
315c0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55  F("Error.  SignU
315d0 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64  pdate() returned
315e0 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
315f0 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
31600 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
31610 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65  ;....if (sign_re
31620 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t != CKR_BUFFER_
31630 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
31640 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
31650 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
31660 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
31670 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
31680 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
31690 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
316a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
316b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
316c0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
316d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
316e0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
316f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31700 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
31710 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
31720 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
31730 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
31740 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31750 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
31760 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
31770 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
31780 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
31790 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
317a0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
317b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
317c0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
317d0 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
317e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
317f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
31800 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
31810 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31820 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
31830 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
31840 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
31850 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
31860 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ED);....}.....ca
31870 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31880 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
31890 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74  ive = 0;.....mut
318a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
318b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
318c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
318d0 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
318e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
318f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31900 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
31910 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
31920 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
31930 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
31940 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  );....}...}....r
31950 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
31960 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d  ..}...sign_ret =
31970 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65   C_SignFinal(hSe
31980 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72  ssion, pSignatur
31990 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  e, pulSignatureL
319a0 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
319b0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
319c0 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d  ..if (sign_ret =
319d0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
319e0 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43  _SMALL) {....CAC
319f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31a00 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65  ("SignFinal() re
31a10 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45  turned CKR_BUFFE
31a20 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20  R_TOO_SMALL (rv 
31a30 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20  = %lu), undoing 
31a40 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c  C_SignUpdate()",
31a50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
31a60 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09   sign_ret);.....
31a70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31a80 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
31a90 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73  ufused = start_s
31aa0 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09  ign_bufused;....
31ab0 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
31ac0 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
31ad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31ae0 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c  rror.  SignFinal
31af0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
31b00 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
31b10 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
31b20 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
31b30 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
31b40 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e  ;..}...if (pSign
31b50 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ature == NULL) {
31b60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31b70 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75  PRINTF("pSignatu
31b80 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  re specified as 
31b90 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f  NULL, undoing C_
31ba0 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a  SignUpdate()");.
31bb0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
31bc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31bd0 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72  n_bufused = star
31be0 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  t_sign_bufused;.
31bf0 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
31c00 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  et);..}...CACKEY
31c10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
31c20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
31c30 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
31c40 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
31c50 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
31c60 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
31c70 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f  _SignUpdate)(CK_
31c80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
31c90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
31ca0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
31cb0 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
31cc0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
31cd0 76 61 6c 3b 0a 09 69 6e 74 20 72 65 73 69 7a 65  val;..int resize
31ce0 52 65 74 72 79 3b 0a 09 69 6e 74 20 6e 65 65 64  Retry;..int need
31cf0 52 65 73 69 7a 65 3b 0a 0a 09 43 41 43 4b 45 59  Resize;...CACKEY
31d00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
31d10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
31d20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
31d30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
31d40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31d50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
31d60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
31d70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
31d80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
31d90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
31da0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
31db0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
31dc0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
31dd0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
31de0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
31df0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
31e00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31e10 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
31e20 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
31e30 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
31e40 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
31e50 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  D);..}...if (pPa
31e60 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
31e70 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
31e80 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
31e90 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
31ea0 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69  ed to sign nothi
31eb0 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45  ng... */...CACKE
31ec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31ed0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
31ee0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
31ef0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
31f00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
31f10 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  K);..}...if (pPa
31f20 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
31f30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31f40 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72  NTF("Error. pPar
31f50 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75  t is NULL, but u
31f60 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  lPartLen is not 
31f70 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
31f80 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
31f90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50  D);..}...if (ulP
31fa0 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
31fb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31fc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50  INTF("Error. ulP
31fd0 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
31fe0 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
31ff0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
32000 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
32010 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
32020 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
32030 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
32040 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
32050 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
32060 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
32070 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32080 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
32090 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
320a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
320b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
320c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
320d0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
320e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
320f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
32100 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
32110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32120 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
32130 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
32140 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
32150 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
32160 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
32170 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
32180 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32190 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
321a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
321b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
321c0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
321d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
321e0 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
321f0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
32200 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
32210 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
32220 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  ED);..}...switch
32230 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
32240 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
32250 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
32260 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
32270 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c  S:..../* Accumul
32280 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ate directly */.
32290 09 09 09 66 6f 72 20 28 72 65 73 69 7a 65 52 65  ...for (resizeRe
322a0 74 72 79 20 3d 20 30 3b 20 72 65 73 69 7a 65 52  try = 0; resizeR
322b0 65 74 72 79 20 3c 20 31 31 3b 20 72 65 73 69 7a  etry < 11; resiz
322c0 65 52 65 74 72 79 2b 2b 29 20 7b 0a 09 09 09 09  eRetry++) {.....
322d0 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 30 3b 0a  needResize = 0;.
322e0 09 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
322f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32300 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
32310 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
32320 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32330 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
32340 66 6c 65 6e 29 20 7b 0a 09 09 09 09 09 6e 65 65  flen) {......nee
32350 64 52 65 73 69 7a 65 20 3d 20 31 3b 0a 09 09 09  dResize = 1;....
32360 09 7d 0a 0a 09 09 09 09 69 66 20 28 21 6e 65 65  .}......if (!nee
32370 64 52 65 73 69 7a 65 29 20 7b 0a 09 09 09 09 09  dResize) {......
32380 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
32390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
323a0 52 49 4e 54 46 28 22 52 65 73 69 7a 69 6e 67 20  RINTF("Resizing 
323b0 73 69 67 6e 69 6e 67 20 62 75 66 66 65 72 20 28  signing buffer (
323c0 74 72 79 20 23 25 69 20 6f 66 20 31 30 20 2d 2d  try #%i of 10 --
323d0 20 31 31 74 68 20 69 73 20 66 61 74 61 6c 29 22   11th is fatal)"
323e0 2c 20 72 65 73 69 7a 65 52 65 74 72 79 29 3b 0a  , resizeRetry);.
323f0 0a 09 09 09 09 69 66 20 28 72 65 73 69 7a 65 52  .....if (resizeR
32400 65 74 72 79 20 3d 3d 20 31 30 29 20 7b 0a 09 09  etry == 10) {...
32410 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
32420 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32430 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 0a 09 09  ].sign_buf);....
32440 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
32450 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
32460 6e 5f 62 75 66 6c 65 6e 20 3d 20 30 3b 0a 09 09  n_buflen = 0;...
32470 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
32480 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
32490 6e 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  n_buf = NULL;...
324a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
324b0 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ......cackey_ses
324c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
324d0 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32  sign_buflen *= 2
324e0 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  ;......cackey_se
324f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32500 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c  .sign_buf = real
32510 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69  loc(cackey_sessi
32520 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32530 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a  gn_buf, sizeof(*
32540 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32550 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
32560 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73  uf) * cackey_ses
32570 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
32580 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09  sign_buflen);...
32590 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65  .}.....if (cacke
325a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
325b0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 3d  ion].sign_buf ==
325c0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 61 63   NULL) {.....cac
325d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
325e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
325f0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
32600 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32610 72 2e 20 20 53 69 67 6e 69 6e 67 20 62 75 66 66  r.  Signing buff
32620 65 72 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  er is NULL.");..
32630 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
32640 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
32650 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ..}.....memcpy(c
32660 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32670 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
32680 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69  f + cackey_sessi
32690 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
326a0 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72  gn_bufused, pPar
326b0 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a  t, ulPartLen);..
326c0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
326d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
326e0 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50  n_bufused += ulP
326f0 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61  artLen;.....brea
32700 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
32710 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
32720 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
32730 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
32740 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
32750 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
32760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32770 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
32780 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
32790 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
327a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
327b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
327c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
327d0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
327e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
327f0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
32800 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
32810 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43  , C_SignFinal)(C
32820 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
32830 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
32840 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
32850 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
32860 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
32870 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
32880 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b  TE sigbuf[1024];
32890 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66  ..ssize_t sigbuf
328a0 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
328b0 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
328c0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
328d0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
328e0 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20   terminate_sign 
328f0 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  = 1;..int mutex_
32900 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
32910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
32920 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
32930 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
32940 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
32950 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32960 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
32970 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
32980 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
32990 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
329a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53  );..}...if (pulS
329b0 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e  ignatureLen == N
329c0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
329d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
329e0 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72  ror. pulSignatur
329f0 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  eLen is NULL.");
32a00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
32a10 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
32a20 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
32a30 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
32a40 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
32a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
32a60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
32a70 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
32a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32a90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
32aa0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
32ab0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
32ac0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
32ad0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
32ae0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
32af0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
32b00 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
32b10 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
32b20 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
32b30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32b40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
32b50 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
32b60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
32b70 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
32b80 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
32b90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32ba0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
32bb0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
32bc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
32bd0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
32be0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32bf0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
32c00 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
32c10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
32c20 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
32c30 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
32c40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32c50 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
32c60 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
32c70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
32c80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
32c90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32ca0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
32cb0 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
32cc0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
32cd0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
32ce0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
32cf0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
32d00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
32d10 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
32d20 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
32d30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
32d40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
32d50 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
32d60 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
32d70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
32d80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
32d90 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
32da0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
32db0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
32dc0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
32dd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
32de0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
32df0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
32e00 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
32e10 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
32e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32e30 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
32e40 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
32e50 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
32e60 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
32e70 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
32e80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
32e90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
32ea0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
32eb0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
32ec0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
32ed0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32ee0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
32ef0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
32f00 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
32f10 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
32f20 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43  o sign */....CAC
32f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32f40 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e  ("Asking to sign
32f50 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25   from identity %
32f60 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75  p in session %lu
32f70 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63 6b  ", (void *) cack
32f80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32f90 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
32fa0 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ity, (unsigned l
32fb0 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a  ong) hSession);.
32fc0 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63  ...sigbuflen = c
32fd0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
32fe0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
32ff0 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
33000 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
33010 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
33020 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
33030 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
33040 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73  _buf, cackey_ses
33050 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
33060 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69  sign_bufused, si
33070 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67  gbuf, sizeof(sig
33080 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09  buf), 1, 0);....
33090 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d  .if (sigbuflen =
330a0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
330b0 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63  NEEDLOGIN && cac
330c0 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
330d0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69  != NULL) {.....i
330e0 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41  f (C_LoginMutexA
330f0 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55  rg(hSession, CKU
33100 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20  _USER, NULL, 0, 
33110 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  0) == CKR_OK) {.
33120 09 09 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d  .....sigbuflen =
33130 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
33140 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
33150 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
33160 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
33170 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
33180 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ty, cackey_sessi
33190 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
331a0 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73  gn_buf, cackey_s
331b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
331c0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
331d0 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73  sigbuf, sizeof(s
331e0 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 09  igbuf), 1, 0);..
331f0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
33200 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29   (sigbuflen < 0)
33210 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e   {...../* Signin
33220 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09  g failed. */....
33230 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d  .if (sigbuflen =
33240 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
33250 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
33260 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
33270 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
33280 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
33290 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43   (sigbuflen == C
332a0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
332b0 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
332c0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45  .retval = CKR_DE
332d0 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09  VICE_REMOVED;...
332e0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
332f0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
33300 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
33310 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
33320 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
33330 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70   sigbuflen) > *p
33340 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26  ulSignatureLen &
33350 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a  & pSignature) {.
33360 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61  ..../* Signed da
33370 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ta too large */.
33380 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
33390 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20  _PRINTF("retval 
333a0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
333b0 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c  _SMALL;  sigbufl
333c0 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67  en = %lu, pulSig
333d0 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22  natureLen = %lu"
333e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
333f0 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e  ) sigbuflen, (un
33400 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75  signed long) *pu
33410 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a  lSignatureLen);.
33420 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
33430 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
33440 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61  LL;......termina
33450 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09  te_sign = 0;....
33460 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72  } else {.....ter
33470 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
33480 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e 61  ......if (pSigna
33490 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  ture) {......mem
334a0 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20  cpy(pSignature, 
334b0 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65  sigbuf, sigbufle
334c0 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e  n);.......termin
334d0 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09  ate_sign = 1;...
334e0 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67  ..}......*pulSig
334f0 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62  natureLen = sigb
33500 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76  uflen;......retv
33510 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09  al = CKR_OK;....
33520 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
33530 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f  ..if (terminate_
33540 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61  sign) {...if (ca
33550 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
33560 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
33570 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
33580 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
33590 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b  sion].sign_buf);
335a0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
335b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
335c0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
335d0 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
335e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
335f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
33600 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
33610 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
33620 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
33630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
33640 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
33650 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
33660 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
33670 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
33680 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33690 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
336a0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
336b0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
336c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
336d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
336e0 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
336f0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
33700 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
33710 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
33720 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
33730 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
33740 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
33750 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
33760 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
33770 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
33780 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
33790 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
337a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
337b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
337c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
337d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
337e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
337f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
33800 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
33810 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
33820 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
33830 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33840 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
33850 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33860 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
33870 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
33880 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
33890 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
338a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
338b0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
338c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
338d0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
338e0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
338f0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
33900 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
33910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33920 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
33930 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
33940 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
33950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33960 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
33970 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
33980 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
33990 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
339a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
339b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
339c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
339d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
339e0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
339f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33a00 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
33a10 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
33a20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33a30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
33a40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
33a50 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53  VerifyInit)(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 4d 45 43 48 41  ession, CK_MECHA
33a80 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
33a90 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
33aa0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
33ab0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33ac0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
33ad0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
33ae0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
33af0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33b00 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
33b10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
33b20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
33b30 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
33b40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
33b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33b60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
33b70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33b80 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
33b90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33ba0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
33bb0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
33bc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33bd0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
33be0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
33bf0 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49  Verify)(CK_SESSI
33c00 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
33c10 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
33c20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
33c30 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
33c40 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
33c50 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
33c60 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
33c70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33c80 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
33c90 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
33ca0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
33cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33cc0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
33cd0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
33ce0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
33cf0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
33d00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
33d10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33d20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
33d30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33d40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
33d50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33d60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
33d70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
33d80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33d90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
33da0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
33db0 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
33dc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
33dd0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
33de0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
33df0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
33e00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
33e10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
33e20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33e30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
33e40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33e50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
33e60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
33e70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
33e80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
33e90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
33ea0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33eb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33ec0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33ed0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
33ee0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
33ef0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33f00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
33f10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33f20 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33f30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33f40 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c  V, C_VerifyFinal
33f50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
33f60 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
33f70 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
33f80 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
33f90 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
33fa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33fb0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33fc0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33fd0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33fe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33ff0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
34000 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
34010 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
34020 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
34030 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
34040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34050 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
34060 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34070 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
34080 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34090 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
340a0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
340b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
340c0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
340d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
340e0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
340f0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
34100 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
34110 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
34120 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
34130 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
34140 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
34150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
34160 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
34170 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
34180 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
34190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
341a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
341b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
341c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
341d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
341e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
341f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
34200 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
34210 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34220 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
34230 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34240 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
34250 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34260 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
34270 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
34280 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
34290 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
342a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
342b0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
342c0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
342d0 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
342e0 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  eLen, CK_BYTE_PT
342f0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
34300 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e  G_PTR pulDataLen
34310 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
34320 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
34330 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
34340 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
34350 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
34360 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
34370 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
34380 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
34390 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
343a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
343b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
343c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
343d0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
343e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
343f0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
34400 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
34410 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
34420 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34430 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
34440 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
34450 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72  RV, C_DigestEncr
34460 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
34470 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
34480 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
34490 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
344a0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
344b0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
344c0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
344d0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
344e0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
344f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34500 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
34510 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
34520 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
34530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34540 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
34550 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
34560 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
34570 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
34580 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
34590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
345a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
345b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
345c0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
345d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
345e0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
345f0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
34600 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
34610 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
34620 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
34630 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
34640 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
34650 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
34660 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
34670 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
34680 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
34690 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
346a0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
346b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
346c0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
346d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
346e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
346f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
34700 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
34710 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
34720 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
34730 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
34740 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
34750 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
34760 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
34770 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
34780 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
34790 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
347a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
347b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
347c0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
347d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
347e0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
347f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
34800 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e  (CK_RV, C_SignEn
34810 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
34820 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
34830 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
34840 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
34850 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
34860 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
34870 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
34880 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
34890 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
348a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
348b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
348c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
348d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
348e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
348f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
34900 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
34910 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
34920 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
34930 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
34940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34950 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
34960 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34970 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
34980 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34990 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
349a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
349b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
349c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
349d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
349e0 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
349f0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
34a00 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
34a10 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
34a20 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
34a30 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
34a40 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
34a50 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
34a60 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
34a70 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
34a80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34a90 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
34aa0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
34ab0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
34ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
34ad0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
34ae0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
34af0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
34b00 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
34b10 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
34b20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
34b30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
34b40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34b50 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
34b60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34b70 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
34b80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34b90 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
34ba0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
34bb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
34bc0 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  rateKey)(CK_SESS
34bd0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
34be0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
34bf0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
34c00 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
34c10 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
34c20 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
34c30 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
34c40 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
34c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34c60 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
34c70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
34c80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
34c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34ca0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
34cb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
34cc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
34cd0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
34ce0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
34cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34d00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
34d10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34d20 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
34d30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34d40 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
34d50 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
34d60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
34d70 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
34d80 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
34d90 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29  GenerateKeyPair)
34da0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
34db0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
34dc0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
34dd0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
34de0 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c  RIBUTE_PTR pPubl
34df0 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  icKeyTemplate, C
34e00 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63  K_ULONG ulPublic
34e10 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
34e20 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
34e30 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54  PTR pPrivateKeyT
34e40 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
34e50 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74  G ulPrivateKeyAt
34e60 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
34e70 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
34e80 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20  TR phPublicKey, 
34e90 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
34ea0 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65  _PTR phPrivateKe
34eb0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
34ec0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
34ed0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
34ee0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
34ef0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
34f00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
34f10 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
34f20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
34f30 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
34f40 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
34f50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
34f60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
34f70 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
34f80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
34f90 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
34fa0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
34fb0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
34fc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34fd0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
34fe0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
34ff0 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28  _RV, C_WrapKey)(
35000 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
35010 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
35020 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
35030 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
35040 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70  CT_HANDLE hWrapp
35050 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ingKey, CK_OBJEC
35060 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43  T_HANDLE hKey, C
35070 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70  K_BYTE_PTR pWrap
35080 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47  pedKey, CK_ULONG
35090 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b  _PTR pulWrappedK
350a0 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  eyLen) {..CACKEY
350b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
350c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
350d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
350e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
350f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
35100 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
35110 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
35120 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
35130 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
35140 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
35150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
35160 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
35170 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
35180 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
35190 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
351a0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
351b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
351c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
351d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
351e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61  N(CK_RV, C_Unwra
351f0 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
35200 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
35210 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
35220 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
35230 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
35240 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20  hUnwrappingKey, 
35250 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
35260 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
35270 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65  G ulWrappedKeyLe
35280 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
35290 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
352a0 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
352b0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
352c0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
352d0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
352e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
352f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
35300 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
35310 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
35320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
35330 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
35340 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
35350 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
35360 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
35370 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
35380 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
35390 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
353a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
353b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
353c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
353d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
353e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
353f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
35400 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
35410 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65  (CK_RV, C_Derive
35420 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
35430 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
35440 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
35450 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
35460 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
35470 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52  BaseKey, CK_ATTR
35480 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
35490 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
354a0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
354b0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
354c0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
354d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
354e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
354f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
35500 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
35510 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
35520 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
35530 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
35540 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
35550 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
35560 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
35570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
35580 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
35590 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
355a0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
355b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
355c0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
355d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
355e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
355f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
35600 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
35610 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  SeedRandom)(CK_S
35620 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
35630 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
35640 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c  PTR pSeed, CK_UL
35650 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b  ONG ulSeedLen) {
35660 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35670 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
35680 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
35690 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
356a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
356b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
356c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
356d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
356e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
356f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
35700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35710 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
35720 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
35730 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
35740 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35750 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
35760 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
35770 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
35780 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
35790 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
357a0 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
357b0 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
357c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
357d0 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64  K_BYTE_PTR pRand
357e0 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  omData, CK_ULONG
357f0 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a   ulRandomLen) {.
35800 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35810 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
35820 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
35830 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
35840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35850 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
35860 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
35870 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
35880 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
35890 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
358a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
358b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
358c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
358d0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
358e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
358f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
35900 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
35910 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
35920 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  );.}../* Depreca
35930 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
35940 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
35950 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
35960 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43  unctionStatus)(C
35970 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
35980 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
35990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
359a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
359b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
359c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
359d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
359e0 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
359f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35a00 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
35a10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
35a20 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
35a30 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
35a40 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
35a50 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
35a60 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
35a70 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46  ./* Deprecated F
35a80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45  unction */.CK_DE
35a90 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
35aa0 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e  _RV, C_CancelFun
35ab0 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ction)(CK_SESSIO
35ac0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
35ad0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
35ae0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
35af0 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
35b00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
35b10 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
35b20 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
35b30 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
35b40 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
35b50 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
35b60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
35b70 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
35b80 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
35b90 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
35ba0 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
35bb0 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
35bc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
35bd0 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
35be0 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f  List)(CK_FUNCTIO
35bf0 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70  N_LIST_PTR_PTR p
35c00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b  pFunctionList) {
35c10 0a 09 73 74 61 74 69 63 20 43 4b 5f 46 55 4e 43  ..static CK_FUNC
35c20 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 73 70  TION_LIST_PTR sp
35c30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 4e  FunctionList = N
35c40 55 4c 4c 3b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f  ULL;..CK_FUNCTIO
35c50 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63  N_LIST_PTR pFunc
35c60 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b  tionList;...CACK
35c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
35c80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
35c90 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74   (ppFunctionList
35ca0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
35cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
35cc0 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63  F("Error. ppFunc
35cd0 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c  tionList is NULL
35ce0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
35cf0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
35d00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 70 46 75  );..}...if (spFu
35d10 6e 63 74 69 6f 6e 4c 69 73 74 20 21 3d 20 4e 55  nctionList != NU
35d20 4c 4c 29 20 7b 0a 09 09 2a 70 70 46 75 6e 63 74  LL) {...*ppFunct
35d30 69 6f 6e 4c 69 73 74 20 3d 20 73 70 46 75 6e 63  ionList = spFunc
35d40 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 09 43 41 43  tionList;....CAC
35d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
35d60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
35d70 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
35d80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
35d90 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63  _OK);..}...pFunc
35da0 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f  tionList = mallo
35db0 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74  c(sizeof(*pFunct
35dc0 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75  ionList));...pFu
35dd0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
35de0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
35df0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
35e00 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
35e10 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e  6) & 0xff;..pFun
35e20 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
35e30 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
35e40 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
35e50 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
35e60 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63   & 0xff;...pFunc
35e70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
35e80 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69  ialize = C_Initi
35e90 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
35ea0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a  nList->C_Finaliz
35eb0 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a  e = C_Finalize;.
35ec0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35ed0 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65  C_GetInfo = C_Ge
35ee0 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
35ef0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
35f00 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74  List = C_GetSlot
35f10 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  List;..pFunction
35f20 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49  List->C_GetSlotI
35f30 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49  nfo = C_GetSlotI
35f40 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
35f50 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49  ist->C_GetTokenI
35f60 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e  nfo = C_GetToken
35f70 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
35f80 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53  List->C_WaitForS
35f90 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69  lotEvent = C_Wai
35fa0 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09  tForSlotEvent;..
35fb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35fc0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
35fd0 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  t = C_GetMechani
35fe0 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  smList;..pFuncti
35ff0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
36000 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47  hanismInfo = C_G
36010 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b  etMechanismInfo;
36020 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
36030 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43  >C_InitToken = C
36040 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75  _InitToken;..pFu
36050 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
36060 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49  itPIN = C_InitPI
36070 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  N;..pFunctionLis
36080 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f  t->C_SetPIN = C_
36090 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  SetPIN;..pFuncti
360a0 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65  onList->C_OpenSe
360b0 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65  ssion = C_OpenSe
360c0 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
360d0 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65  nList->C_CloseSe
360e0 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53  ssion = C_CloseS
360f0 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
36100 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41  onList->C_CloseA
36110 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43  llSessions = C_C
36120 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b  loseAllSessions;
36130 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
36140 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66  >C_GetSessionInf
3