Hex Artifact Content

Artifact 36cd71f6eaff735c5359515ce9c625463fa29f8a:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f  .#ifndef CACKEY_
0530: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
0540: 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20  _CODE.#  define 
0550: 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
0560: 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30  VERSION_CODE 0x0
0570: 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  21e00.#endif../*
0580: 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66   GSC-IS v2.1 Def
0590: 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20  initions */./** 
05a0: 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66  Classes **/.#def
05b0: 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ine GSCIS_CLASS_
05c0: 49 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20  ISO7816         
05d0: 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47    0x00.#define G
05e0: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
05f0: 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38  L_PLATFORM   0x8
0600: 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69  0../** Instructi
0610: 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20  ons **/.#define 
0620: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
0630: 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78  RESPONSE      0x
0640: 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  C0.#define GSCIS
0650: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41  _INSTR_READ_BINA
0660: 52 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64  RY       0xB0.#d
0670: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0680: 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20  R_UPDATE_BINARY 
0690: 20 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65      0xD6.#define
06a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
06b0: 45 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30  ECT            0
06c0: 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xA4.#define GSCI
06d0: 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c  S_INSTR_EXTERNAL
06e0: 5f 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23  _AUTH     0x82.#
06f0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0700: 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45  TR_GET_CHALLENGE
0710: 20 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e       0x84.#defin
0720: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e  e GSCIS_INSTR_IN
0730: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
0740: 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x88.#define GSC
0750: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
0760: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0770: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0780: 53 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52  STR_CHANGE_REFER
0790: 45 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69  ENCE  0x24.#defi
07a0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07b0: 49 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  IGN             
07c0: 20 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53   0x2A.#define GS
07d0: 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52  CIS_INSTR_GET_PR
07e0: 4f 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36  OP          0x56
07f0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0800: 4e 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20  NSTR_GET_ACR    
0810: 20 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66         0x4C.#def
0820: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0830: 52 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20  READ_BUFFER     
0840: 20 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47    0x52.#define G
0850: 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
0860: 45 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34  ECRYPT       0x4
0870: 32 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  2..#define GSCIS
0880: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
0890: 50 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f  PLET     0x04../
08a0: 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a  ** Tags **/./***
08b0: 20 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23   CCC Tags ***/.#
08c0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08d0: 5f 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20  _CARDID         
08e0: 20 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e       0xF0.#defin
08f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
0900: 56 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  VER             
0910: 30 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF1.#define GSC
0920: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20  IS_TAG_CCG_VER  
0930: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a             0xF2.
0940: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0950: 47 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20  G_CARDURL       
0960: 20 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69        0xF3.#defi
0970: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  ne GSCIS_TAG_PKC
0980: 53 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20  S15             
0990: 20 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53   0xF4.#define GS
09a0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
09b0: 5f 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35  _MODEL      0xF5
09c0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09d0: 41 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20  AG_ACR_TABLE    
09e0: 20 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66         0xF6.#def
09f0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
0a00: 52 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20  RD_APDU         
0a10: 20 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47    0xF7.#define G
0a20: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
0a30: 54 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46  TION         0xF
0a40: 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  A.#define GSCIS_
0a50: 54 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20  TAG_CT          
0a60: 20 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65          0xFB.#de
0a70: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0a80: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0a90: 20 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20     0xFC.#define 
0aa0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
0ab0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78  C             0x
0ac0: 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c  FD../*** General
0ad0: 20 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a   - EF 2200 ***/.
0ae0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0af0: 47 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20  G_FNAME         
0b00: 20 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69        0x01.#defi
0b10: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  ne GSCIS_TAG_MNA
0b20: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0b30: 20 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53   0x02.#define GS
0b40: 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20  CIS_TAG_LNAME   
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33              0x03
0b60: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b70: 41 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20  AG_SUFFIX       
0b80: 20 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66         0x04.#def
0b90: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ine GSCIS_TAG_GO
0ba0: 56 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20  VT_AGENCY       
0bb0: 20 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47    0x05.#define G
0bc0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20  SCIS_TAG_BUREAU 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0be0: 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  6.#define GSCIS_
0bf0: 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20  TAG_BUREAU_CODE 
0c00: 20 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65          0x07.#de
0c10: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0c20: 45 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20  EPT_CODE        
0c30: 20 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20     0x08.#define 
0c40: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20  GSCIS_TAG_TITLE 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0c60: 30 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  09.#define GSCIS
0c70: 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20  _TAG_BUILDING   
0c80: 20 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64           0x10.#d
0c90: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0ca0: 4f 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20  OFFICE_ADDR1    
0cb0: 20 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65      0x11.#define
0cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cd0: 45 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30  E_ADDR2        0
0ce0: 78 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x12.#define GSCI
0cf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
0d00: 59 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23  Y         0x13.#
0d10: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d20: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20  _OFFICE_STATE   
0d30: 20 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e       0x14.#defin
0d40: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d50: 43 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20  CE_ZIP          
0d60: 30 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0x15.#define GSC
0d70: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
0d80: 55 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a  UNTRY      0x16.
0d90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0da0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20  G_OFFICE_PHONE  
0db0: 20 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69        0x17.#defi
0dc0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0dd0: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20  ICE_PHONE_EXT   
0de0: 20 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53   0x18.#define GS
0df0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46  CIS_TAG_OFFICE_F
0e00: 41 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39  AX          0x19
0e10: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0e20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20  AG_OFFICE_EMAIL 
0e30: 20 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66         0x1A.#def
0e40: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0e50: 46 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20  FICE_ROOM       
0e60: 20 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47    0x1B.#define G
0e70: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
0e80: 41 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31  AGENCY       0x1
0e90: 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  C.#define GSCIS_
0ea0: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
0eb0: 4f 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a  OR      0x1D../*
0ec0: 2a 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30  ** PII - EF 2100
0ed0: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0ee0: 43 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20  CIS_TAG_SSN     
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30              0x20
0f00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f10: 41 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20  AG_DOB          
0f20: 20 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66         0x21.#def
0f30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45  ine GSCIS_TAG_GE
0f40: 4e 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  NDER            
0f50: 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67    0x22../*** Log
0f60: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  in Information -
0f70: 20 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 4000 ***/.#d
0f80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0f90: 55 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20  USERID          
0fa0: 20 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65      0x40.#define
0fb0: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
0fc0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  N              0
0fd0: 78 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x41.#define GSCI
0fe0: 53 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20  S_TAG_PASSWORD  
0ff0: 20 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a            0x42..
1000: 2f 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d  /*** Card Inform
1010: 61 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20  ation - EF 5000 
1020: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
1030: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20  IS_TAG_ISSUERID 
1040: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a             0x50.
1050: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1060: 47 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20  G_SERNO         
1070: 20 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69        0x51.#defi
1080: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  ne GSCIS_TAG_ISS
1090: 55 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  UE_DATE         
10a0: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
10b0: 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44  CIS_TAG_EXPIRE_D
10c0: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33  ATE         0x53
10d0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
10e0: 41 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20  AG_CARD_TYPE    
10f0: 20 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66         0x54.#def
1100: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ine GSCIS_TAG_SE
1110: 43 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20  CURITY_CODE     
1120: 20 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47    0x57.#define G
1130: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
1140: 41 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35  AID          0x5
1150: 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65  8../*** PIV Code
1160: 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  s ***/.#define N
1170: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
1180: 53 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43  STR_GET_DATA 0xC
1190: 42 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  B.#define NISTSP
11a0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11b0: 45 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a  ENAUTH  0x87../*
11c0: 2a 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69  ** PKI Informati
11d0: 6f 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a  on - EF 7000 ***
11e0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
11f0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20  TAG_CERTIFICATE 
1200: 20 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65          0x70.#de
1210: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
1220: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20  ERT_ISSUE_DATE  
1230: 20 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20     0x71.#define 
1240: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
1250: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78  XPIRE_DATE    0x
1260: 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49  72../** Applet I
1270: 44 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  Ds **/.#define G
1280: 53 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20  SCIS_AID_CCC    
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41               0xA
12a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
12b0: 78 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c  x01, 0x16, 0xDB,
12c0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49   0x00.#define NI
12d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
12e0: 5f 41 49 44 20 20 20 20 20 20 20 20 30 78 41 30  _AID        0xA0
12f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1300: 30 33 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20  03, 0x08, 0x00, 
1310: 30 78 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30  0x00, 0x10, 0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a  , 0x01, 0x00../*
1330: 20 50 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20   PIV IDs */./** 
1340: 4b 65 79 20 49 64 65 6e 74 69 66 69 65 72 73 20  Key Identifiers 
1350: 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d  (NIST SP 800-78-
1360: 33 2c 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f  3, Table 6-1 **/
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
1390: 55 54 48 20 20 20 30 78 39 41 0a 23 64 65 66 69  UTH   0x9A.#defi
13a0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  ne NISTSP800_78_
13b0: 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20  3_KEY_SIGNATURE 
13c0: 30 78 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x9C.#define NIS
13d0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13e0: 4b 45 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23  KEYMGT    0x9D.#
13f0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1400: 5f 37 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55  _78_3_KEY_CARDAU
1410: 54 48 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c  TH  0x9E../** Al
1420: 67 6f 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69  gorithm Identifi
1430: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
1440: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32  -78-3, Table 6-2
1450: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
1460: 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
1470: 5f 52 53 41 31 30 32 34 20 20 30 78 30 36 0a 23  _RSA1024  0x06.#
1480: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1490: 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
14a0: 34 38 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62  48  0x07../** Ob
14b0: 6a 65 63 74 20 49 64 65 6e 74 69 66 69 65 72 73  ject Identifiers
14c0: 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33   (NIST SP 800-73
14d0: 2d 33 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65  -3 Part 1, Table
14e0: 20 32 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20   2) **/.#define 
14f0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
1500: 49 44 5f 50 49 56 41 55 54 48 20 20 20 30 78 35  ID_PIVAUTH   0x5
1510: 46 2c 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64  F, 0xC1, 0x05.#d
1520: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1530: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
1540: 52 45 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  RE 0x5F, 0xC1, 0
1550: 78 30 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x0A.#define NIST
1560: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
1570: 45 59 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30  EYMGT    0x5F, 0
1580: 78 43 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e  xC1, 0x0B.#defin
1590: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
15a0: 5f 4f 49 44 5f 43 41 52 44 41 55 54 48 20 20 30  _OID_CARDAUTH  0
15b0: 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a  x5F, 0xC1, 0x01.
15c0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  ./* Maximum size
15d0: 20 6f 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e   of data portion
15e0: 20 6f 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a   of APDUs */./**
15f0: 20 44 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73   Do not set this
1600: 20 61 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23   above 250 **/.#
1610: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50  define CACKEY_AP
1620: 44 55 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20  DU_MTU          
1630: 20 20 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52       250../* ATR
1640: 20 49 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   If not availabl
1650: 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  e */.#ifndef MAX
1660: 5f 41 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e  _ATR_SIZE.#defin
1670: 65 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31  e MAX_ATR_SIZE 1
1680: 30 32 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  024.#endif..#ifd
1690: 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a  ef CACKEY_DEBUG.
16a0: 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 54 49  #  ifdef HAVE_TI
16b0: 4d 45 5f 48 0a 23 20 20 20 20 69 6e 63 6c 75 64  ME_H.#    includ
16c0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 61 74 69  e <time.h>.stati
16d0: 63 20 74 69 6d 65 5f 74 20 63 61 63 6b 65 79 5f  c time_t cackey_
16e0: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
16f0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 75 6e 73   = 0;.static uns
1700: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1710: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1720: 76 6f 69 64 29 20 7b 0a 09 69 66 20 28 63 61 63  void) {..if (cac
1730: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1740: 74 69 6d 65 20 3d 3d 20 30 29 20 7b 0a 09 09 63  time == 0) {...c
1750: 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72  ackey_debug_star
1760: 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28 4e 55  t_time = time(NU
1770: 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  LL);..}...return
1780: 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20 63 61  (time(NULL) - ca
1790: 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74  ckey_debug_start
17a0: 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20 20 65 6c 73  _time);.}.#  els
17b0: 65 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  e.static unsigne
17c0: 64 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45  d long CACKEY_DE
17d0: 42 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64  BUG_GETTIME(void
17e0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  ) {..return(0);.
17f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64  }.#  endif..#  d
1800: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1810: 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20  UG_PRINTF(x...) 
1820: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1830: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1840: 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e 70 72 69 6e  = {0}; \..snprin
1850: 74 66 28 62 75 66 5f 75 73 65 72 2c 20 73 69 7a  tf(buf_user, siz
1860: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 2c 20 78  eof(buf_user), x
1870: 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73  ); \..buf_user[s
1880: 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20  izeof(buf_user) 
1890: 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09  - 1] = '\0'; \..
18a0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
18b0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
18c0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 5c 6e  ]: %s():%i: %s\n
18d0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
18e0: 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66 75 6e  GETTIME(), __fun
18f0: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 62  c__, __LINE__, b
1900: 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 66 6c  uf_user); \..ffl
1910: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
1920: 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20 20 64  _fd()); \.}.#  d
1930: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1940: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
1950: 2c 20 79 29 20 7b 20 5c 0a 09 73 74 61 74 69 63  , y) { \..static
1960: 20 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34   char buf_user[4
1970: 30 39 36 5d 20 3d 20 7b 30 7d 2c 20 2a 62 75 66  096] = {0}, *buf
1980: 5f 75 73 65 72 5f 70 2c 20 2a 62 75 66 5f 75 73  _user_p, *buf_us
1990: 65 72 5f 70 72 69 6e 74 3b 20 5c 0a 09 75 6e 73  er_print; \..uns
19a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75 66 5f 75  igned long buf_u
19b0: 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09 75 6e 73  ser_size; \..uns
19c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42  igned char *TMPB
19d0: 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20  UF; \..unsigned 
19e0: 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09 69 6e 74  long idx; \..int
19f0: 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c   snprintf_ret; \
1a00: 0a 09 54 4d 50 42 55 46 20 3d 20 28 75 6e 73 69  ..TMPBUF = (unsi
1a10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29  gned char *) (x)
1a20: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 30 5d  ; \..buf_user[0]
1a30: 20 3d 20 30 3b 20 5c 0a 09 62 75 66 5f 75 73 65   = 0; \..buf_use
1a40: 72 5b 32 5d 20 3d 20 30 3b 20 5c 0a 09 62 75 66  r[2] = 0; \..buf
1a50: 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f 75 73  _user_p = buf_us
1a60: 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f  er; \..buf_user_
1a70: 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 62 75  size = sizeof(bu
1a80: 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f 72 20  f_user); \..for 
1a90: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1aa0: 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20 5c 0a  (y); idx++) { \.
1ab0: 09 09 69 66 20 28 62 75 66 5f 75 73 65 72 5f 73  ..if (buf_user_s
1ac0: 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09  ize <= 0) { \...
1ad0: 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c  .break; \...}; \
1ae0: 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65 74 20  ...snprintf_ret 
1af0: 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75  = snprintf(buf_u
1b00: 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65 72 5f  ser_p, buf_user_
1b10: 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22 2c 20  size, ", %02x", 
1b20: 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20 5c 0a  TMPBUF[idx]); \.
1b30: 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66 5f 72  ..if (snprintf_r
1b40: 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09 09 09  et <= 0) { \....
1b50: 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a  break; \...}; \.
1b60: 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b 3d 20  ..buf_user_p += 
1b70: 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a  snprintf_ret; \.
1b80: 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1b90: 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b  -= snprintf_ret;
1ba0: 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f 75 73   \..}; \..buf_us
1bb0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
1bc0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1bd0: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 72 69   \..buf_user_pri
1be0: 6e 74 20 3d 20 62 75 66 5f 75 73 65 72 20 2b 20  nt = buf_user + 
1bf0: 32 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61  2; \..fprintf(ca
1c00: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1c10: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69   "[%lu]: %s():%i
1c20: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1c30: 7b 25 73 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59  {%s})\n", CACKEY
1c40: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
1c50: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
1c60: 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e  NE__, f, #x, (un
1c70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29  signed long) (y)
1c80: 2c 20 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74  , buf_user_print
1c90: 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63  ); \..fflush(cac
1ca0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b  key_debug_fd());
1cb0: 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 66   \.}.#  define f
1cc0: 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f  ree(x) { CACKEY_
1cd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52  DEBUG_PRINTF("FR
1ce0: 45 45 28 25 70 29 20 28 25 73 29 22 2c 20 28 76  EE(%p) (%s)", (v
1cf0: 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b 20 66  oid *) x, #x); f
1d00: 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61 74 69  ree(x); }..stati
1d10: 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79 5f 64  c FILE *cackey_d
1d20: 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20 7b 0a  ebug_fd(void) {.
1d30: 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a 66 64  .static FILE *fd
1d40: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
1d50: 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20 28 66  logfile;...if (f
1d60: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  d != NULL) {...r
1d70: 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a 0a 09  eturn(fd);..}...
1d80: 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20 73 74  /*.. * Log to st
1d90: 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  derr initially s
1da0: 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64 65 62  o we can use deb
1db0: 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a 09 20  ugging within.. 
1dc0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1dd0: 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e 67 20  without getting 
1de0: 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69 74 65  into an infinite
1df0: 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64 20 3d   loop.. */..fd =
1e00: 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67 66 69   stderr;...logfi
1e10: 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43  le = getenv("CAC
1e20: 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c  KEY_DEBUG_LOGFIL
1e30: 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66 69 6c  E");..if (logfil
1e40: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e != NULL) {...C
1e50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e60: 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69 72 6f  TF("Found enviro
1e70: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 3a 20  nment variable: 
1e80: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e90: 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74 72 63  ..logfile = strc
1ea0: 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d 27 29  hr(logfile, '=')
1eb0: 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c 65 20  ;...if (logfile 
1ec0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 6c 6f  == NULL) {....lo
1ed0: 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22  gfile = getenv("
1ee0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1ef0: 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c 73 65  FILE");...} else
1f00: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b 2b 3b   {....logfile++;
1f10: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
1f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47  CACKEY_DEBUG_LOG
1f30: 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66 69 6c  FILE..if (logfil
1f40: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c  e == NULL) {...l
1f50: 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45 59 5f  ogfile = CACKEY_
1f60: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b 0a 09  DEBUG_LOGFILE;..
1f70: 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 6c  }.#endif...if (l
1f80: 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  ogfile != NULL) 
1f90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fa0: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6c  _PRINTF("Found l
1fb0: 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c 6f  og file: %s", lo
1fc0: 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d 20  gfile);....fd = 
1fd0: 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20 22  fopen(logfile, "
1fe0: 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64  a");..}...if (fd
1ff0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 64   == NULL) {...fd
2000: 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a 09   = stderr;..}...
2010: 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72 72  if (fd == stderr
2020: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2030: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2040: 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a 09  ning stderr");..
2050: 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
2060: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2070: 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20 28  Returning %p", (
2080: 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d 0a  void *) fd);..}.
2090: 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d 0a  ..return(fd);.}.
20a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41  .static void *CA
20b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
20c0: 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69  MALLOC(size_t si
20d0: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ze, const char *
20e0: 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20  func, int line) 
20f0: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b  {..void *retval;
2100: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c  ...retval = mall
2110: 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72 69  oc(size);...fpri
2120: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2130: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2140: 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28 29  s():%i: MALLOC()
2150: 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59   = %p\n", CACKEY
2160: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
2170: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72 65  , func, line, re
2180: 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28 63  tval);..fflush(c
2190: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
21a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
21b0: 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
21c0: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
21d0: 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 76  G_FUNC_REALLOC(v
21e0: 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74  oid *ptr, size_t
21f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61   size, const cha
2200: 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e  r *func, int lin
2210: 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76  e) {..void *retv
2220: 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72  al;...retval = r
2230: 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65  ealloc(ptr, size
2240: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
2250: 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72 69  != ptr) {...fpri
2260: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
2270: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25  _fd(), "[%lu]: %
2280: 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43 28  s():%i: REALLOC(
2290: 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43  %p) = %p\n", CAC
22a0: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d  KEY_DEBUG_GETTIM
22b0: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c  E(), func, line,
22c0: 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09   ptr, retval);..
22d0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
22e0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a 0a  ebug_fd());..}..
22f0: 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 4e  .if (retval == N
2300: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2a  DEBUG_PRINTF(" *
2320: 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65 61  ** ERROR *** rea
2330: 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e 55  lloc returned NU
2340: 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29 22  LL (size = %lu)"
2350: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2360: 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72 65  ) size);..}...re
2370: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2380: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43 41  .static char *CA
2390: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
23a0: 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68 61  STRDUP(const cha
23b0: 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63 68  r *ptr, const ch
23c0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69  ar *func, int li
23d0: 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74  ne) {..char *ret
23e0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
23f0: 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09 66  strdup(ptr);...f
2400: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
2410: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
2420: 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44 55  : %s():%i: STRDU
2430: 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c  P_MALLOC() = %p\
2440: 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  n", CACKEY_DEBUG
2450: 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63  _GETTIME(), func
2460: 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b  , line, retval);
2470: 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
2480: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72  debug_fd());...r
2490: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
24a0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
24b0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
24c0: 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54  G_FUNC_TAG_TO_ST
24d0: 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  R(unsigned char 
24e0: 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28  tag) {..switch (
24f0: 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53  tag) {...case GS
2500: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a  CIS_TAG_CARDID:.
2510: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2520: 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09  _TAG_CARDID");..
2530: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2540: 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75  CCC_VER:....retu
2550: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43  rn("GSCIS_TAG_CC
2560: 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20  C_VER");...case 
2570: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
2580: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
2590: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22  CIS_TAG_CCG_VER"
25a0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
25b0: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
25c0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
25d0: 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63  G_CARDURL");...c
25e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
25f0: 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28  CS15:....return(
2600: 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31  "GSCIS_TAG_PKCS1
2610: 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  5");...case GSCI
2620: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d  S_TAG_REG_DATA_M
2630: 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ODEL:....return(
2640: 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44  "GSCIS_TAG_REG_D
2650: 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63  ATA_MODEL");...c
2660: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
2670: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  R_TABLE:....retu
2680: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43  rn("GSCIS_TAG_AC
2690: 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  R_TABLE");...cas
26a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
26b0: 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e  _APDU:....return
26c0: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  ("GSCIS_TAG_CARD
26d0: 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20  _APDU");...case 
26e0: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
26f0: 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  CTION:....return
2700: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  ("GSCIS_TAG_REDI
2710: 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  RECTION");...cas
2720: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a  e GSCIS_TAG_CT:.
2730: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2740: 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73  _TAG_CT");...cas
2750: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a  e GSCIS_TAG_ST:.
2760: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2770: 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73  _TAG_ST");...cas
2780: 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  e GSCIS_TAG_NEXT
2790: 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  CCC:....return("
27a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
27b0: 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  C");...case GSCI
27c0: 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09  S_TAG_FNAME:....
27d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
27e0: 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73  G_FNAME");...cas
27f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
2800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
2810: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b  CIS_TAG_MNAME");
2820: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2830: 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_LNAME:....retu
2840: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e  rn("GSCIS_TAG_LN
2850: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
2860: 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a  CIS_TAG_SUFFIX:.
2870: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2880: 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09  _TAG_SUFFIX");..
2890: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
28a0: 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09  GOVT_AGENCY:....
28b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
28c0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b  G_GOVT_AGENCY");
28d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
28e0: 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74  G_BUREAU:....ret
28f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
2900: 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20  UREAU");...case 
2910: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2920: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2930: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  ("GSCIS_TAG_BURE
2940: 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  AU_CODE");...cas
2950: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  e GSCIS_TAG_DEPT
2960: 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e  _CODE:....return
2970: 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54  ("GSCIS_TAG_DEPT
2980: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2990: 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a  GSCIS_TAG_TITLE:
29a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
29b0: 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09  S_TAG_TITLE");..
29c0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
29d0: 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74  BUILDING:....ret
29e0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42  urn("GSCIS_TAG_B
29f0: 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73  UILDING");...cas
2a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2a10: 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74  CE_ADDR1:....ret
2a20: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2a30: 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09  FFICE_ADDR1");..
2a40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2a50: 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09  OFFICE_ADDR2:...
2a60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2a70: 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22  AG_OFFICE_ADDR2"
2a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2a90: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a  TAG_OFFICE_CITY:
2aa0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2ab0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2ac0: 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  Y");...case GSCI
2ad0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
2ae0: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
2af0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2b00: 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  STATE");...case 
2b10: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b20: 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28  _ZIP:....return(
2b30: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b40: 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20  E_ZIP");...case 
2b50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2b60: 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74  _COUNTRY:....ret
2b70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2b80: 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b  FFICE_COUNTRY");
2b90: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2ba0: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a  G_OFFICE_PHONE:.
2bb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2bc0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e  _TAG_OFFICE_PHON
2bd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2be0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2bf0: 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72  NE_EXT:....retur
2c00: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2c10: 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b  ICE_PHONE_EXT");
2c20: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c30: 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09  G_OFFICE_FAX:...
2c40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2c50: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b  AG_OFFICE_FAX");
2c60: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2c70: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a  G_OFFICE_EMAIL:.
2c80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c90: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49  _TAG_OFFICE_EMAI
2ca0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  L");...case GSCI
2cb0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2cc0: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  M:....return("GS
2cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2ce0: 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53  OOM");...case GS
2cf0: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
2d00: 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e  GENCY:....return
2d10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47  ("GSCIS_TAG_NONG
2d20: 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  OV_AGENCY");...c
2d30: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53  ase GSCIS_TAG_SS
2d40: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09  N_DESIGNATOR:...
2d50: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d60: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
2d70: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
2d80: 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65  S_TAG_SSN:....re
2d90: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2da0: 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  SSN");...case GS
2db0: 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09  CIS_TAG_DOB:....
2dc0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2dd0: 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20  G_DOB");...case 
2de0: 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52  GSCIS_TAG_GENDER
2df0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e00: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b  IS_TAG_GENDER");
2e10: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e20: 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74  G_USERID:....ret
2e30: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55  urn("GSCIS_TAG_U
2e40: 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  SERID");...case 
2e50: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
2e60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2e70: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b  IS_TAG_DOMAIN");
2e80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2e90: 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72  G_PASSWORD:....r
2ea0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2eb0: 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63  _PASSWORD");...c
2ec0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2ed0: 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  SUERID:....retur
2ee0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2ef0: 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20  UERID");...case 
2f00: 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a  GSCIS_TAG_SERNO:
2f10: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2f20: 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09  S_TAG_SERNO");..
2f30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f40: 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72  ISSUE_DATE:....r
2f50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2f60: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
2f70: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2f80: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
2f90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fa0: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b  G_EXPIRE_DATE");
2fb0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2fc0: 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09  G_CARD_TYPE:....
2fd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2fe0: 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09  G_CARD_TYPE");..
2ff0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3000: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09  SECURITY_CODE:..
3010: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
3020: 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44  TAG_SECURITY_COD
3030: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
3040: 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44  S_TAG_CARDID_AID
3050: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3060: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
3070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
3080: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
3090: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
30a0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
30b0: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
30c0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
30d0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  UE_DATE:....retu
30e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45  rn("GSCIS_TAG_CE
30f0: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  RT_ISSUE_DATE");
3100: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3110: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
3120: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3130: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
3140: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a  PIRE_DATE");..}.
3150: 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57  ..return("UNKNOW
3160: 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  N");.}..static c
3170: 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45  onst char *CACKE
3180: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
3190: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e  RDERR_TO_STR(LON
31a0: 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77  G retcode) {..sw
31b0: 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b  itch (retcode) {
31c0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f  ...case SCARD_S_
31d0: 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75  SUCCESS:....retu
31e0: 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43  rn("SCARD_S_SUCC
31f0: 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ESS");...case SC
3200: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a  ARD_E_CANCELLED:
3210: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3220: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  D_E_CANCELLED");
3230: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3240: 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09  CANT_DISPOSE:...
3250: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3260: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b  _CANT_DISPOSE");
3270: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3280: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46  INSUFFICIENT_BUF
3290: 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  FER:....return("
32a0: 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43  SCARD_E_INSUFFIC
32b0: 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09  IENT_BUFFER");..
32c0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
32d0: 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65  VALID_ATR:....re
32e0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
32f0: 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63  VALID_ATR");...c
3300: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3310: 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72  LID_HANDLE:....r
3320: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
3330: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b  NVALID_HANDLE");
3340: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3350: 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45  INVALID_PARAMETE
3360: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
3370: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41  ARD_E_INVALID_PA
3380: 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73  RAMETER");...cas
3390: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
33a0: 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74  D_TARGET:....ret
33b0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
33c0: 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09  ALID_TARGET");..
33d0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
33e0: 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09  VALID_VALUE:....
33f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3400: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b  INVALID_VALUE");
3410: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3420: 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65  NO_MEMORY:....re
3430: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3440: 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73  _MEMORY");...cas
3450: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
3460: 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74  N_READER:....ret
3470: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
3480: 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09  NOWN_READER");..
3490: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49  .case SCARD_E_TI
34a0: 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e  MEOUT:....return
34b0: 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  ("SCARD_E_TIMEOU
34c0: 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  T");...case SCAR
34d0: 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  D_E_SHARING_VIOL
34e0: 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e  ATION:....return
34f0: 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e  ("SCARD_E_SHARIN
3500: 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09  G_VIOLATION");..
3510: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3520: 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72  _SMARTCARD:....r
3530: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
3540: 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09  O_SMARTCARD");..
3550: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e  .case SCARD_E_UN
3560: 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72  KNOWN_CARD:....r
3570: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3580: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09  NKNOWN_CARD");..
3590: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52  .case SCARD_E_PR
35a0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09  OTO_MISMATCH:...
35b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
35c0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22  _PROTO_MISMATCH"
35d0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
35e0: 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09  E_NOT_READY:....
35f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3600: 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63  NOT_READY");...c
3610: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54  ase SCARD_E_SYST
3620: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09  EM_CANCELLED:...
3630: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3640: 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45  _SYSTEM_CANCELLE
3650: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3660: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54  D_E_NOT_TRANSACT
3670: 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ED:....return("S
3680: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
3690: 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20  ACTED");...case 
36a0: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
36b0: 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72  NAVAILABLE:....r
36c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
36d0: 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c  EADER_UNAVAILABL
36e0: 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  E");...case SCAR
36f0: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_W_UNSUPPORTED_
3700: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3710: 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f  "SCARD_W_UNSUPPO
3720: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  RTED_CARD");...c
3730: 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45  ase SCARD_W_UNRE
3740: 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09  SPONSIVE_CARD:..
3750: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3760: 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43  W_UNRESPONSIVE_C
3770: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3780: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
3790: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37a0: 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52  "SCARD_W_UNPOWER
37b0: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
37c0: 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  e SCARD_W_RESET_
37d0: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
37e0: 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43  "SCARD_W_RESET_C
37f0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3800: 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41  ARD_W_REMOVED_CA
3810: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3820: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
3830: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
3840: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3850: 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ALL:....return("
3860: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3870: 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20  SMALL");...case 
3880: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3890: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
38a0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52  eturn("SCARD_E_R
38b0: 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45  EADER_UNSUPPORTE
38c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
38d0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45  D_E_DUPLICATE_RE
38e0: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
38f0: 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41  "SCARD_E_DUPLICA
3900: 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  TE_READER");...c
3910: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44  ase SCARD_E_CARD
3920: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
3930: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3940: 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45  _CARD_UNSUPPORTE
3950: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3960: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a  D_E_NO_SERVICE:.
3970: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3980: 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b  _E_NO_SERVICE");
3990: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
39a0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a  SERVICE_STOPPED:
39b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
39c0: 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50  D_E_SERVICE_STOP
39d0: 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  PED");...case SC
39e0: 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_E_UNSUPPORTE
39f0: 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65  D_FEATURE:....re
3a00: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
3a10: 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52  SUPPORTED_FEATUR
3a20: 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52  E");.#ifdef SCAR
3a30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
3a40: 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  D...case SCARD_W
3a50: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a  _INSERTED_CARD:.
3a60: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3a70: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a80: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ");.#endif.#ifde
3a90: 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41  f SCARD_E_NO_REA
3aa0: 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09  DERS_AVAILABLE..
3ab0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3ac0: 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42  _READERS_AVAILAB
3ad0: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  LE:....return("S
3ae0: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3af0: 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23  S_AVAILABLE");.#
3b00: 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72  endif..}...retur
3b10: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
3b20: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3b30: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3b40: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
3b50: 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69  TR(uint16_t obji
3b60: 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62  d) {..switch (ob
3b70: 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78  jid) {...case 0x
3b80: 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  2000:....return(
3b90: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3ba0: 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b  D_GENERALINFO");
3bb0: 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a  ...case 0x2100:.
3bc0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3bd0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50  Y_TLV_OBJID_PROP
3be0: 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09  ERSONALINFO");..
3bf0: 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09  .case 0x3000:...
3c00: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c10: 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53  TLV_OBJID_ACCESS
3c20: 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73  CONTROL");...cas
3c30: 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74  e 0x4000:....ret
3c40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3c50: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09  OBJID_LOGIN");..
3c60: 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09  .case 0x5000:...
3c70: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3c80: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e  TLV_OBJID_CARDIN
3c90: 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36  FO");...case 0x6
3ca0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3cb0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3cc0: 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09  _BIOMETRICS");..
3cd0: 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09  .case 0x7000:...
3ce0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3cf0: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
3d00: 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61  LSIGCERT");...ca
3d10: 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65  se 0x0200:....re
3d20: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3d30: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3d40: 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  N");...case 0x02
3d50: 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  02:....return("C
3d60: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d70: 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a  CAC_BENEFITS");.
3d80: 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09  ..case 0x0203:..
3d90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3da0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
3db0: 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a  THERBENEFITS");.
3dc0: 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09  ..case 0x0201:..
3dd0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3de0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3df0: 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61  ERSONNEL");...ca
3e00: 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65  se 0x02FE:....re
3e10: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3e20: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
3e30: 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75  RT");..}....retu
3e40: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
3e50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3e60: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
3e70: 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54  G_FUNC_APPTYPE_T
3e80: 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70  O_STR(uint8_t ap
3e90: 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68  ptype) {..switch
3ea0: 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63   (apptype) {...c
3eb0: 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74  ase 0x00:....ret
3ec0: 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63  urn("NONE");...c
3ed0: 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74  ase 0x01:....ret
3ee0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3ef0: 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09  APP_GENERIC");..
3f00: 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72  .case 0x02:....r
3f10: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f20: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
3f30: 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74  ase 0x03:....ret
3f40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3f50: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
3f60: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
3f70: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a  ");...case 0x04:
3f80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3f90: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3fa0: 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09  ;...case 0x05:..
3fb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3fc0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
3fd0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
3fe0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
3ff0: 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x06:....return(
4000: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
4010: 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  SKI | CACKEY_TLV
4020: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
4030: 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75  se 0x07:....retu
4040: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
4050: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
4060: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
4070: 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  | CACKEY_TLV_APP
4080: 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  _PKI");..}...ret
4090: 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a  urn("INVALID");.
40a0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
40b0: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
40c0: 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54  UG_FUNC_ATTRIBUT
40d0: 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52  E_TO_STR(CK_ATTR
40e0: 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72 29  IBUTE_TYPE attr)
40f0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74 72   {..switch (attr
4100: 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ) {...case CKA_C
4110: 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  LASS:....return(
4120: 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09  "CKA_CLASS");...
4130: 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a  case CKA_TOKEN:.
4140: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54  ...return("CKA_T
4150: 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  OKEN");...case C
4160: 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72  KA_PRIVATE:....r
4170: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41  eturn("CKA_PRIVA
4180: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TE");...case CKA
4190: 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72  _LABEL:....retur
41a0: 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a  n("CKA_LABEL");.
41b0: 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49  ..case CKA_APPLI
41c0: 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  CATION:....retur
41d0: 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49  n("CKA_APPLICATI
41e0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ON");...case CKA
41f0: 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72  _VALUE:....retur
4200: 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a  n("CKA_VALUE");.
4210: 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43  ..case CKA_OBJEC
4220: 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  T_ID:....return(
4230: 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29  "CKA_OBJECT_ID")
4240: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ;...case CKA_CER
4250: 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
4260: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45  ..return("CKA_CE
4270: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22 29  RTIFICATE_TYPE")
4280: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ;...case CKA_ISS
4290: 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UER:....return("
42a0: 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09  CKA_ISSUER");...
42b0: 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  case CKA_SERIAL_
42c0: 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72  NUMBER:....retur
42d0: 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  n("CKA_SERIAL_NU
42e0: 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  MBER");...case C
42f0: 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09  KA_AC_ISSUER:...
4300: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f  .return("CKA_AC_
4310: 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65  ISSUER");...case
4320: 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72   CKA_OWNER:....r
4330: 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52  eturn("CKA_OWNER
4340: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4350: 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65  TTR_TYPES:....re
4360: 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54  turn("CKA_ATTR_T
4370: 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43  YPES");...case C
4380: 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72  KA_TRUSTED:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54  eturn("CKA_TRUST
43a0: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ED");...case CKA
43b0: 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65  _KEY_TYPE:....re
43c0: 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59  turn("CKA_KEY_TY
43d0: 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PE");...case CKA
43e0: 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74  _SUBJECT:....ret
43f0: 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54  urn("CKA_SUBJECT
4400: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
4410: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4420: 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43  A_ID");...case C
4430: 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09  KA_SENSITIVE:...
4440: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e  .return("CKA_SEN
4450: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4460: 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09   CKA_ENCRYPT:...
4470: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43  .return("CKA_ENC
4480: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
4490: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72  KA_DECRYPT:....r
44a0: 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59  eturn("CKA_DECRY
44b0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
44c0: 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e  _WRAP:....return
44d0: 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09  ("CKA_WRAP");...
44e0: 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a  case CKA_UNWRAP:
44f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4500: 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65  UNWRAP");...case
4510: 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65   CKA_SIGN:....re
4520: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29  turn("CKA_SIGN")
4530: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ;...case CKA_SIG
4540: 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65  N_RECOVER:....re
4550: 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52  turn("CKA_SIGN_R
4560: 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  ECOVER");...case
4570: 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09   CKA_VERIFY:....
4580: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49  return("CKA_VERI
4590: 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  FY");...case CKA
45a0: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a  _VERIFY_RECOVER:
45b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
45c0: 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29  VERIFY_RECOVER")
45d0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52  ;...case CKA_DER
45e0: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
45f0: 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09  CKA_DERIVE");...
4600: 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44  case CKA_START_D
4610: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4620: 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29  CKA_START_DATE")
4630: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44  ;...case CKA_END
4640: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
4650: 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29  ("CKA_END_DATE")
4660: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
4670: 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  ULUS:....return(
4680: 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a  "CKA_MODULUS");.
4690: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
46a0: 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  US_BITS:....retu
46b0: 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f  rn("CKA_MODULUS_
46c0: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
46d0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
46e0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
46f0: 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45  KA_PUBLIC_EXPONE
4700: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4710: 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e  _PRIVATE_EXPONEN
4720: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4730: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45  A_PRIVATE_EXPONE
4740: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4750: 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74  _PRIME_1:....ret
4760: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31  urn("CKA_PRIME_1
4770: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4780: 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72  RIME_2:....retur
4790: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29  n("CKA_PRIME_2")
47a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50  ;...case CKA_EXP
47b0: 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75  ONENT_1:....retu
47c0: 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  rn("CKA_EXPONENT
47d0: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
47e0: 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09  _EXPONENT_2:....
47f0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f  return("CKA_EXPO
4800: 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65  NENT_2");...case
4810: 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54   CKA_COEFFICIENT
4820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4830: 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a  _COEFFICIENT");.
4840: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
4850: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4860: 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  _PRIME");...case
4870: 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09   CKA_SUBPRIME:..
4880: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4890: 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65  BPRIME");...case
48a0: 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65   CKA_BASE:....re
48b0: 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29  turn("CKA_BASE")
48c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
48d0: 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  ME_BITS:....retu
48e0: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49  rn("CKA_PRIME_BI
48f0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4900: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a  _SUB_PRIME_BITS:
4910: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4920: 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29  SUB_PRIME_BITS")
4930: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ;...case CKA_VAL
4940: 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75  UE_BITS:....retu
4950: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49  rn("CKA_VALUE_BI
4960: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
4970: 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72  _VALUE_LEN:....r
4980: 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45  eturn("CKA_VALUE
4990: 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  _LEN");...case C
49a0: 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a  KA_EXTRACTABLE:.
49b0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
49c0: 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09  XTRACTABLE");...
49d0: 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a  case CKA_LOCAL:.
49e0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c  ...return("CKA_L
49f0: 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43  OCAL");...case C
4a00: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4a10: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
4a20: 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41  "CKA_NEVER_EXTRA
4a30: 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65  CTABLE");...case
4a40: 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53   CKA_ALWAYS_SENS
4a50: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ITIVE:....return
4a60: 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e  ("CKA_ALWAYS_SEN
4a70: 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65  SITIVE");...case
4a80: 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43   CKA_KEY_GEN_MEC
4a90: 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72  HANISM:....retur
4aa0: 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  n("CKA_KEY_GEN_M
4ab0: 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61  ECHANISM");...ca
4ac0: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  se CKA_MODIFIABL
4ad0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4ae0: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a  A_MODIFIABLE");.
4af0: 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41  ..case CKA_ECDSA
4b00: 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75  _PARAMS:....retu
4b10: 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41  rn("CKA_ECDSA_PA
4b20: 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43  RAMS");...case C
4b30: 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09  KA_EC_POINT:....
4b40: 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50  return("CKA_EC_P
4b50: 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  OINT");...case C
4b60: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54  KA_SECONDARY_AUT
4b70: 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  H:....return("CK
4b80: 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48  A_SECONDARY_AUTH
4b90: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41  ");...case CKA_A
4ba0: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09  UTH_PIN_FLAGS:..
4bb0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55  ..return("CKA_AU
4bc0: 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a  TH_PIN_FLAGS");.
4bd0: 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45  ..case CKA_HW_FE
4be0: 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72  ATURE_TYPE:....r
4bf0: 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45  eturn("CKA_HW_FE
4c00: 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09  ATURE_TYPE");...
4c10: 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f  case CKA_RESET_O
4c20: 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72  N_INIT:....retur
4c30: 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  n("CKA_RESET_ON_
4c40: 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43  INIT");...case C
4c50: 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09  KA_HAS_RESET:...
4c60: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53  .return("CKA_HAS
4c70: 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65  _RESET");...case
4c80: 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49   CKA_VENDOR_DEFI
4c90: 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NED:....return("
4ca0: 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e  CKA_VENDOR_DEFIN
4cb0: 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ED");..}...retur
4cc0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
4cd0: 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f  .#  define mallo
4ce0: 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  c(x) CACKEY_DEBU
4cf0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c  G_FUNC_MALLOC(x,
4d00: 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e   __func__, __LIN
4d10: 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72  E__).#  define r
4d20: 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43  ealloc(x, y) CAC
4d30: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52  KEY_DEBUG_FUNC_R
4d40: 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66  EALLOC(x, y, __f
4d50: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d60: 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75 70  .#  ifdef strdup
4d70: 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72 64  .#    undef strd
4d80: 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64  up.#  endif.#  d
4d90: 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29 20  efine strdup(x) 
4da0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4db0: 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75  C_STRDUP(x, __fu
4dc0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a  nc__, __LINE__).
4dd0: 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
4de0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4df0: 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23  NTF(x...) /**/.#
4e00: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e10: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66  DEBUG_PRINTBUF(f
4e20: 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20  , x, y) /**/.#  
4e30: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4e40: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
4e90: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4ea0: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4eb0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4ec0: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
4ed0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4ee0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4f00: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
4f10: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
4f20: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
4f30: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4f40: 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
4f50: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4f60: 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LED".#endif../*.
4f70: 20 2a 20 49 6e 63 6c 75 64 65 20 74 68 65 73 65   * Include these
4f80: 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 69 6e   source files in
4f90: 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69 6f   this translatio
4fa0: 6e 20 75 6e 69 74 20 73 6f 20 74 68 61 74 20 77  n unit so that w
4fb0: 65 20 63 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a  e can bind to. *
4fc0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
4fd0: 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 73  ot include any s
4fe0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75  ymbols in the ou
4ff0: 74 70 75 74 20 73 68 61 72 65 64 20 6f 62 6a 65  tput shared obje
5000: 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  ct.. */.#include
5010: 20 22 61 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23   "asn1-x509.c".#
5020: 69 6e 63 6c 75 64 65 20 22 73 68 61 31 2e 63 22  include "sha1.c"
5030: 0a 23 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63  .#include "md5.c
5040: 22 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  "..typedef enum 
5050: 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  {..CACKEY_ID_TYP
5060: 45 5f 45 52 52 4f 52 2c 0a 09 43 41 43 4b 45 59  E_ERROR,..CACKEY
5070: 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
5080: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
5090: 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49  E_CAC,..CACKEY_I
50a0: 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43  D_TYPE_PIV,..CAC
50b0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
50c0: 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70  _ONLY.} cackey_p
50d0: 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74  csc_id_type;..st
50e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
50f0: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63  _identity {..cac
5100: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
5110: 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65   id_type;...size
5120: 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  _t certificate_l
5130: 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  en;..unsigned ch
5140: 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  ar *certificate;
5150: 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69  ...ssize_t keysi
5160: 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09  ze;...union {...
5170: 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69  struct {....unsi
5180: 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65 74  gned char applet
5190: 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74  [7];....uint16_t
51a0: 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a   file;...} cac;.
51b0: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75  ...struct {....u
51c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79  nsigned char key
51d0: 5f 69 64 3b 0a 09 09 09 63 68 61 72 20 6c 61 62  _id;....char lab
51e0: 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70 69 76 3b  el[32];...} piv;
51f0: 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74  ..} card;.};..st
5200: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
5210: 74 69 74 79 20 7b 0a 09 73 74 72 75 63 74 20 63  tity {..struct c
5220: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
5230: 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
5240: 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52 49 42 55  ty;...CK_ATTRIBU
5250: 54 45 20 2a 61 74 74 72 69 62 75 74 65 73 3b 0a  TE *attributes;.
5260: 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74 72 69 62  .CK_ULONG attrib
5270: 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a  utes_count;.};..
5280: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65  struct cackey_se
5290: 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20 61 63 74  ssion {..int act
52a0: 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49  ive;...CK_SLOT_I
52b0: 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53  D slotID;...CK_S
52c0: 54 41 54 45 20 73 74 61 74 65 3b 0a 09 43 4b 5f  TATE state;..CK_
52d0: 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a 09 43 4b  FLAGS flags;..CK
52e0: 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69 63 65 45  _ULONG ulDeviceE
52f0: 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  rror;..CK_VOID_P
5300: 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b  TR pApplication;
5310: 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e 6f 74 69  ..CK_NOTIFY Noti
5320: 66 79 3b 0a 0a 09 73 74 72 75 63 74 20 63 61 63  fy;...struct cac
5330: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
5340: 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
5350: 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
5360: 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74  ies_count;...int
5370: 20 73 65 61 72 63 68 5f 61 63 74 69 76 65 3b 0a   search_active;.
5380: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54  .CK_ATTRIBUTE_PT
5390: 52 20 73 65 61 72 63 68 5f 71 75 65 72 79 3b 0a  R search_query;.
53a0: 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61 72 63 68  .CK_ULONG search
53b0: 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 0a 09 75  _query_count;..u
53c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 65 61  nsigned long sea
53d0: 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a 0a 09 69  rch_curr_id;...i
53e0: 6e 74 20 73 69 67 6e 5f 61 63 74 69 76 65 3b 0a  nt sign_active;.
53f0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
5400: 50 45 20 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  PE sign_mechanis
5410: 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50 54 52 20  m;..CK_BYTE_PTR 
5420: 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e 73 69 67  sign_buf;..unsig
5430: 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75  ned long sign_bu
5440: 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20  flen;..unsigned 
5450: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 75 73 65  long sign_bufuse
5460: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
5470: 79 5f 69 64 65 6e 74 69 74 79 20 2a 73 69 67 6e  y_identity *sign
5480: 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 69 6e 74  _identity;...int
5490: 20 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b   decrypt_active;
54a0: 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  ..CK_MECHANISM_T
54b0: 59 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68  YPE decrypt_mech
54c0: 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f  anism;..CK_VOID_
54d0: 50 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68  PTR decrypt_mech
54e0: 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _parm;..CK_ULONG
54f0: 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61   decrypt_mech_pa
5500: 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63 74 20 63  rmlen;..struct c
5510: 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
5520: 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
5530: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
5540: 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74 20  key_slot {..int 
5550: 61 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74  active;..int int
5560: 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70  ernal;...char *p
5570: 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e  csc_reader;...in
5580: 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  t pcsc_card_conn
5590: 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e  ected;..SCARDHAN
55a0: 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 0a  DLE pcsc_card;..
55b0: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
55c0: 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74 72 61  _depth;..int tra
55d0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
55e0: 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f  _lock;...int slo
55f0: 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c  t_reset;...CK_FL
5600: 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  AGS token_flags;
5610: 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ...unsigned char
5620: 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f 52 44   *label;...DWORD
5630: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73   protocol;...uns
5640: 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68 65 64  igned int cached
5650: 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 73  _certs_count;..s
5660: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5670: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 68  c_identity *cach
5680: 65 64 5f 63 65 72 74 73 3b 0a 0a 09 63 61 63 6b  ed_certs;...cack
5690: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
56a0: 69 64 5f 74 79 70 65 5f 68 69 6e 74 3b 0a 7d 3b  id_type_hint;.};
56b0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
56c0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
56d0: 5f 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c  _GENERIC = 0x01,
56e0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
56f0: 5f 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c  _SKI     = 0x02,
5700: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ..CACKEY_TLV_APP
5710: 5f 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a  _PKI     = 0x04.
5720: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70  } cackey_tlv_app
5730: 74 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65  type;..typedef e
5740: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
5750: 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49  V_OBJID_GENERALI
5760: 4e 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30  NFO       = 0x20
5770: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5780: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41  OBJID_PROPERSONA
5790: 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30  LINFO   = 0x2100
57a0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
57b0: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f  JID_ACCESSCONTRO
57c0: 4c 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a  L     = 0x3000,.
57d0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
57e0: 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20  D_LOGIN         
57f0: 20 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43      = 0x4000,..C
5800: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5810: 43 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20  CARDINFO        
5820: 20 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43    = 0x5000,..CAC
5830: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49  KEY_TLV_OBJID_BI
5840: 4f 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20  OMETRICS        
5850: 3d 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x6000,..CACKE
5860: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
5870: 54 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20  TALSIGCERT    = 
5880: 30 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x7000,..CACKEY_
5890: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45  TLV_OBJID_CAC_PE
58a0: 52 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78  RSON        = 0x
58b0: 30 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0200,..CACKEY_TL
58c0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45  V_OBJID_CAC_BENE
58d0: 46 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32  FITS      = 0x02
58e0: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
58f0: 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42  OBJID_CAC_OTHERB
5900: 45 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33  ENEFITS = 0x0203
5910: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5920: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
5930: 4c 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a  L     = 0x0201,.
5940: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5950: 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20  D_CAC_PKICERT   
5960: 20 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63      = 0x02FE.} c
5970: 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74  ackey_tlv_object
5980: 69 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  id;..typedef enu
5990: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  m {..CACKEY_PCSC
59a0: 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20  _S_TOKENPRESENT 
59b0: 20 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f     = 1,..CACKEY_
59c0: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
59d0: 20 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43         = 0,..CAC
59e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
59f0: 49 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c  IC         = -1,
5a00: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5a10: 42 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20  BADPIN          
5a20: 3d 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -2,..CACKEY_PC
5a30: 53 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  SC_E_LOCKED     
5a40: 20 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b       = -3,..CACK
5a50: 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
5a60: 47 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a  GIN       = -4,.
5a70: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  .CACKEY_PCSC_E_T
5a80: 4f 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d  OKENABSENT     =
5a90: 20 2d 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -6,..CACKEY_PCS
5aa0: 43 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 20  C_E_RETRY       
5ab0: 20 20 20 20 3d 20 2d 37 2c 0a 09 43 41 43 4b 45      = -7,..CACKE
5ac0: 59 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54 41 20  Y_PCSC_E_NODATA 
5ad0: 20 20 20 20 20 20 20 20 20 3d 20 2d 38 0a 7d 20           = -8.} 
5ae0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72  cackey_ret;..str
5af0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
5b00: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e  ardurl {..unsign
5b10: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72  ed char        r
5b20: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74  id[5];..cackey_t
5b30: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70  lv_apptype   app
5b40: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  type;..cackey_tl
5b50: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65  v_objectid  obje
5b60: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  ctid;..cackey_tl
5b70: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69  v_objectid  appi
5b80: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  d;..unsigned cha
5b90: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a  r        pinid;.
5ba0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
5bb0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74  y_tlv_entity;.st
5bc0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
5bd0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f  entity {..uint8_
5be0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  t tag;..size_t l
5bf0: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ength;...union {
5c00: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a  ...void *value;.
5c10: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5c20: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c  tlv_cardurl *val
5c30: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69  ue_cardurl;...ui
5c40: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65  nt8_t value_byte
5c50: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63  ;..};...struct c
5c60: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
5c70: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20   *_next;.};../* 
5c80: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61  CACKEY Global Ha
5c90: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
5ca0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67  void *cackey_big
5cb0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  lock = NULL;.sta
5cc0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
5cd0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79  y_session cackey
5ce0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a  _sessions[128];.
5cf0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5d00: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79  ckey_slot cackey
5d10: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61  _slots[128];.sta
5d20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69  tic int cackey_i
5d30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
5d40: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5d50: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
5d60: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   0;.CK_C_INITIAL
5d70: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f  IZE_ARGS cackey_
5d80: 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61  args;../** Extra
5d90: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f   certificates to
5da0: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65   include in toke
5db0: 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63  n **/.struct cac
5dc0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
5dd0: 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20  y extra_certs[] 
5de0: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61  = {.#include "ca
5df0: 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72  ckey_builtin_cer
5e00: 74 73 2e 68 22 0a 7d 3b 0a 0a 23 64 65 66 69 6e  ts.h".};..#defin
5e10: 65 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44  e CACKEY_MACRO_D
5e20: 45 46 41 55 4c 54 5f 58 53 54 52 28 73 74 72 29  EFAULT_XSTR(str)
5e30: 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45   CACKEY_MACRO_DE
5e40: 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29 0a 23  FAULT_STR(str).#
5e50: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 4d 41  define CACKEY_MA
5e60: 43 52 4f 5f 44 45 46 41 55 4c 54 5f 53 54 52 28  CRO_DEFAULT_STR(
5e70: 73 74 72 29 20 23 73 74 72 0a 0a 2f 2a 20 50 72  str) #str../* Pr
5e80: 6f 74 65 63 74 65 64 20 41 75 74 68 65 6e 74 69  otected Authenti
5e90: 63 61 74 69 6f 6e 20 50 61 74 68 20 63 6f 6d 6d  cation Path comm
5ea0: 61 6e 64 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  and */.static ch
5eb0: 61 72 20 2a 63 61 63 6b 65 79 5f 70 69 6e 5f 63  ar *cackey_pin_c
5ec0: 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 0a  ommand = NULL;..
5ed0: 2f 2a 20 52 65 61 64 65 72 20 45 78 63 6c 75 73  /* Reader Exclus
5ee0: 69 6f 6e 20 6f 72 20 49 6e 63 6c 75 64 65 2d 6f  ion or Include-o
5ef0: 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  nly */.static ch
5f00: 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 65  ar *cackey_reade
5f10: 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20  rs_include_only 
5f20: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 63  = NULL;.static c
5f30: 68 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  har *cackey_read
5f40: 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55  ers_exclude = NU
5f50: 4c 4c 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f  LL;../* PCSC Glo
5f60: 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73  bal Handles */.s
5f70: 74 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e  tatic LPSCARDCON
5f80: 54 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63  TEXT cackey_pcsc
5f90: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
5fa0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
5fb0: 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74   long cackey_get
5fc0: 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a  version(void) {.
5fd0: 09 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
5fe0: 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32   long retval = 2
5ff0: 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  55;..unsigned lo
6000: 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75  ng major = 0;..u
6010: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e  nsigned long min
6020: 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d  or = 0;..char *m
6030: 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  ajor_str = NULL;
6040: 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74  ..char *minor_st
6050: 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b  r = NULL;...CACK
6060: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6070: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
6080: 20 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29   (retval != 255)
6090: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
60a0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
60b0: 69 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65  ing 0x%lx (cache
60c0: 64 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  d).", retval);..
60d0: 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
60e0: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  ;..}...retval = 
60f0: 30 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41  0;..#ifdef PACKA
6100: 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20  GE_VERSION.     
6110: 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50     major_str = P
6120: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a  ACKAGE_VERSION;.
6130: 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20  .if (major_str) 
6140: 7b 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  {..        major
6150: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72   = strtoul(major
6160: 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72  _str, &minor_str
6170: 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69  , 10);....if (mi
6180: 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69  nor_str) {....mi
6190: 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69  nor = strtoul(mi
61a0: 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c  nor_str + 1, NUL
61b0: 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  L, 10);...}..}..
61c0: 09 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72  .retval = (major
61d0: 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72   << 16) | (minor
61e0: 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a   << 8);.#endif..
61f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6200: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
6210: 30 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b  0x%lx", retval);
6220: 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
6230: 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52  );.}../* PC/SC R
6240: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
6250: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
6260: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
6270: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6280: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75  onnect_all(int u
6290: 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65  nitialize_all_re
62a0: 61 64 65 72 73 29 3b 0a 20 2a 0a 20 2a 20 41 52  aders);. *. * AR
62b0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 69  GUMENTS. *     i
62c0: 6e 74 20 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c  nt unitialize_al
62d0: 6c 5f 72 65 61 64 65 72 73 20 20 20 20 20 20 46  l_readers      F
62e0: 72 65 65 20 74 68 65 20 22 70 63 73 63 5f 72 65  ree the "pcsc_re
62f0: 61 64 65 72 22 20 6f 62 6a 65 63 74 20 61 73 73  ader" object ass
6300: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 2a 20  ociated with. * 
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 20 20 20 20 20 65 61 63 68 20 73            each s
6330: 6c 6f 74 20 28 62 6f 6f 6c 65 61 6e 29 0a 20 2a  lot (boolean). *
6340: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
6350: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6360: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
6370: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
6380: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61  sconnects from a
6390: 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f  ll cards.. *. */
63a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
63b0: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
63c0: 6e 65 63 74 5f 61 6c 6c 28 69 6e 74 20 75 6e 69  nect_all(int uni
63d0: 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64  tialize_all_read
63e0: 65 72 73 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  ers) {..uint32_t
63f0: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
6400: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6410: 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69  led.");...for (i
6420: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
6430: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
6440: 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
6450: 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
6460: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
6470: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6480: 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09  .internal) {....
6490: 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c  /* Skip internal
64a0: 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e   slots */....con
64b0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
64c0: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
64d0: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  dx].pcsc_card_co
64e0: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41  nnected) {....CA
64f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6500: 46 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  F("SCardDisconne
6510: 63 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c  ct(%lu) called",
6520: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
6530: 20 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64   idx);.....SCard
6540: 44 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65  Disconnect(cacke
6550: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
6560: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
6570: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a  AVE_CARD);...}..
6580: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
6590: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b  ts[idx].label) {
65a0: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
65b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
65c0: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
65d0: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d  ots[idx].label =
65e0: 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 69 66   NULL;...}....if
65f0: 20 28 75 6e 69 74 69 61 6c 69 7a 65 5f 61 6c 6c   (unitialize_all
6600: 5f 72 65 61 64 65 72 73 20 7c 7c 20 21 63 61 63  _readers || !cac
6610: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
6620: 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28  ctive) {....if (
6630: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6640: 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
6650: 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
6660: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
6670: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 63  _reader);......c
6680: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6690: 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
66a0: 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ULL;....}.....ca
66b0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
66c0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
66d0: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
66e0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
66f0: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
6700: 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 63 61 63  epth = 0;....cac
6710: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
6720: 64 5f 74 79 70 65 5f 68 69 6e 74 20 3d 20 43 41  d_type_hint = CA
6730: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b  CKEY_ID_TYPE_UNK
6740: 4e 4f 57 4e 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  NOWN;...} else {
6750: 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6760: 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
6770: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
6780: 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
6790: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
67a0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
67b0: 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a  k = 1;....}...}.
67c0: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
67d0: 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63  idx].pcsc_card_c
67e0: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
67f0: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
6800: 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
6810: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6820: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
6830: 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75   active slot %lu
6840: 20 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22   as being reset"
6850: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
6860: 29 20 69 64 78 29 3b 0a 0a 09 09 09 63 61 63 6b  ) idx);.....cack
6870: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c  ey_slots[idx].sl
6880: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09  ot_reset = 1;...
6890: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
68a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
68b0: 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72  rning");...retur
68c0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
68d0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
68e0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
68f0: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
6900: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
6910: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
6920: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
6930: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
6940: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
6950: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
6960: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
6970: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
6980: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
6990: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
69a0: 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74  ction connects t
69b0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
69c0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61  ection Manager a
69d0: 6e 64 20 75 70 64 61 74 65 73 20 74 68 65 0a 20  nd updates the. 
69e0: 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e  *     global han
69f0: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
6a00: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
6a10: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
6a20: 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20  t(void) {..LONG 
6a30: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6a40: 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41  t_ret;.#ifdef HA
6a50: 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43  VE_SCARDISVALIDC
6a60: 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61  ONTEXT..LONG sca
6a70: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a  rd_isvalid_ret;.
6a80: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
6a90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6aa0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
6ab0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6ac0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  e == NULL) {...c
6ad0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6ae0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  e = malloc(sizeo
6af0: 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f(*cackey_pcsc_h
6b00: 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63  andle));...if (c
6b10: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6b20: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
6b30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6b40: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c  NTF("Call to mal
6b50: 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65  loc() failed, re
6b60: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6b70: 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  re");.....cackey
6b80: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6b90: 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09 09 72 65  t_all(0);.....re
6ba0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6bb0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
6bc0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6bd0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
6be0: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
6bf0: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
6c00: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6c10: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
6c20: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
6c30: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
6c40: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
6c50: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6c60: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
6c70: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
6c80: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
6c90: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
6ca0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
6cb0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
6cc0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
6cd0: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
6ce0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6cf0: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
6d00: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
6d10: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
6d20: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6d30: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
6d40: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6d50: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
6d60: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6d70: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6d80: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
6d90: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
6da0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 30 29  isconnect_all(0)
6db0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
6dc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6dd0: 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66  IC);...}..}..#if
6de0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
6df0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41  VALIDCONTEXT..CA
6e00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6e10: 46 28 22 53 43 61 72 64 49 73 56 61 6c 69 64 43  F("SCardIsValidC
6e20: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6e30: 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69  );..scard_isvali
6e40: 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49 73 56  d_ret = SCardIsV
6e50: 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63  alidContext(*cac
6e60: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6e70: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69 73 76  ;..if (scard_isv
6e80: 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52  alid_ret != SCAR
6e90: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
6ea0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6eb0: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73  INTF("Handle has
6ec0: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20   become invalid 
6ed0: 28 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e  (SCardIsValidCon
6ee0: 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20  text = %s/%li), 
6ef0: 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74  trying to re-est
6f00: 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b  ablish...", CACK
6f10: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
6f20: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
6f30: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29  ard_isvalid_ret)
6f40: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69  , (long) scard_i
6f50: 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09  svalid_ret);....
6f60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6f70: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c  NTF("SCardEstabl
6f80: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  ishContext() cal
6f90: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65  led");...scard_e
6fa0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  st_context_ret =
6fb0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
6fc0: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f  ontext(SCARD_SCO
6fd0: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c  PE_SYSTEM, NULL,
6fe0: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63   NULL, cackey_pc
6ff0: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66  sc_handle);...if
7000: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74   (scard_est_cont
7010: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
7020: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7030: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7040: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43  INTF("Call to SC
7050: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
7060: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75  ext failed (retu
7070: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65  rned %s/%li), re
7080: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7090: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  re", CACKEY_DEBU
70a0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
70b0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74  TO_STR(scard_est
70c0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28  _context_ret), (
70d0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f  long) scard_est_
70e0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09  context_ret);...
70f0: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
7100: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63  sc_handle);....c
7110: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
7120: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61  e = NULL;.....ca
7130: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
7140: 6e 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09  nnect_all(0);...
7150: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7160: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7170: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
7180: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
7190: 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 2d  dle has been re-
71a0: 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a 09  established");..
71b0: 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  }.#endif...CACKE
71c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
71d0: 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e  Sucessfully conn
71e0: 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c 20  ected to PC/SC, 
71f0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  returning in suc
7200: 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e  cess");...return
7210: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
7220: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
7230: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
7240: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
7250: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
7260: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
7270: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
7280: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
7290: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
72a0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
72b0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
72c0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
72d0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
72e0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
72f0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
7300: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
7310: 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20 50  nects from the P
7320: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
7330: 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  manager and upda
7340: 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20 67  tes. *     the g
7350: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
7360: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
7370: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
7380: 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f  sc_disconnect(vo
7390: 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72  id) {..LONG scar
73a0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
73b0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
73c0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
73d0: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
73e0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d  y_pcsc_handle ==
73f0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
7400: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
7410: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
7420: 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  rel_context_ret 
7430: 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43 6f  = SCardReleaseCo
7440: 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63  ntext(*cackey_pc
7450: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66  sc_handle);...if
7460: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
7470: 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28 63  ndle) {...free(c
7480: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
7490: 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70  e);.....cackey_p
74a0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
74b0: 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72  L;..}...if (scar
74c0: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
74d0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
74e0: 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72 6e  CESS) {...return
74f0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
7500: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 63 61  ENERIC);..}...ca
7510: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
7520: 6e 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09  nnect_all(0);...
7530: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7540: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
7550: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
7560: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d     void cackey_m
7570: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
7580: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7590: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
75a0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
75b0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
75c0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
75d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
75e0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
75f0: 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c  ction marks a sl
7600: 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65  ot has having be
7610: 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74  en reset, to lat
7620: 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  er be cleaned up
7630: 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70  .. *     Cleanup
7640: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
7650: 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69  en a PKCS#11 cli
7660: 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64  ent calls C_Find
7670: 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a  ObjectsInit.. *.
7680: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
7690: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
76a0: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61  _reset(struct ca
76b0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
76c0: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
76d0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
76e0: 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
76f0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
7700: 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 69 66   num_certs;...if
7710: 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
7720: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
7730: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7740: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
7750: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73  ...if (slot->pcs
7760: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
7770: 29 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f  ) {...SCardDisco
7780: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
7790: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
77a0: 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73  VE_CARD);..}...s
77b0: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20  lot->slot_reset 
77c0: 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63  = 1;..slot->pcsc
77d0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
77e0: 3d 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  = 0;..if (cackey
77f0: 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20  _pin_command == 
7800: 4e 55 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e  NULL) {...slot->
7810: 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
7820: 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
7830: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c  ;..} else {...sl
7840: 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot->token_flags 
7850: 3d 20 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  = 0;..}...return
7860: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7870: 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20  SIS. *     LONG 
7880: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
7890: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
78a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
78b0: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
78c0: 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41  otocol);. *. * A
78d0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
78e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
78f0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
7900: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
7910: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
7920: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7930: 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20  otocol. *       
7940: 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74    Protocol to at
7950: 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20  tempt first. *. 
7960: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7970: 2a 20 20 20 20 20 54 68 65 20 72 65 74 75 72 6e  *     The return
7980: 20 76 61 6c 75 65 20 66 72 6f 6d 20 53 43 61 72   value from SCar
7990: 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a  dReconnect(). *.
79a0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
79b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
79c0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
79d0: 64 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  d SCardReconnect
79e0: 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 68 65  (). *. *     The
79f0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7a00: 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  ) function call 
7a10: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66  will be called f
7a20: 69 72 73 74 20 77 69 74 68 20 74 68 65 0a 20 2a  irst with the. *
7a30: 20 20 20 20 20 64 77 50 72 65 66 65 72 72 65 64       dwPreferred
7a40: 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65  Protocols of "de
7a50: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e  fault_protocol".
7a60: 20 20 49 66 20 74 68 61 74 20 63 61 6c 6c 20 72    If that call r
7a70: 65 74 75 72 6e 73 0a 20 2a 20 20 20 20 20 53 43  eturns. *     SC
7a80: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7a90: 41 54 43 48 20 74 72 79 20 61 67 61 69 6e 20 77  ATCH try again w
7aa0: 69 74 68 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f  ith a protocol o
7ab0: 66 20 54 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69  f T=0, and faili
7ac0: 6e 67 0a 20 2a 20 20 20 20 20 74 68 61 74 20 54  ng. *     that T
7ad0: 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  =1.. *. */.stati
7ae0: 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65  c LONG cackey_re
7af0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
7b00: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7b10: 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66  *slot, DWORD def
7b20: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b  ault_protocol) {
7b30: 0a 09 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64  ..DWORD selected
7b40: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47  _protocol;..LONG
7b50: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7b60: 0a 0a 09 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  ...selected_prot
7b70: 6f 63 6f 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72  ocol = 0;...scar
7b80: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
7b90: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
7ba0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7bb0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7bc0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7bd0: 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  l, SCARD_RESET_C
7be0: 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70  ARD, &selected_p
7bf0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28  rotocol);...if (
7c00: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7c10: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7c20: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41  MISMATCH) {...CA
7c30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7c40: 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  F("SCardReconnec
7c50: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7c60: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7c70: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
7c80: 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63   just T=0")...sc
7c90: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7ca0: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7cb0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7cc0: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7cd0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7ce0: 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T0, SCARD_RESE
7cf0: 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74 65  T_CARD, &selecte
7d00: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09  d_protocol);....
7d10: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7d20: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7d30: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7d40: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7d50: 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65 63  PRINTF("SCardRec
7d60: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7d70: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7d80: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7d90: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7da0: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7db0: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7dc0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7dd0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
7de0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7df0: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52  ROTOCOL_T1, SCAR
7e00: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
7e10: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7e20: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
7e30: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7e40: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7e50: 53 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f  S) {...slot->pro
7e60: 74 6f 63 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64  tocol = selected
7e70: 5f 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09  _protocol;..}...
7e80: 72 65 74 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e  return(scard_con
7e90: 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  n_ret);.}../*. *
7ea0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7eb0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7ec0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7ed0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7ee0: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
7ef0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
7f00: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
7f10: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
7f20: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
7f30: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
7f40: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7f50: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
7f60: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
7f70: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
7f80: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7f90: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
7fa0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7fb0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
7fc0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
7fd0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7fe0: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7ff0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8000: 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
8010: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
8020: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
8030: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
8040: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8050: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8060: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
8070: 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ot) {...CACKEY_D
8080: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
8090: 61 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66  alid slot specif
80a0: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
80b0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
80c0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
80d0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
80e0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
80f0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
8100: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
8110: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
8120: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
8130: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
8140: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8150: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
8160: 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72 65  PC/SC failed, re
8170: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
8180: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
8190: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
81a0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
81b0: 43 6f 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65  Connect to reade
81c0: 72 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  r, if needed */.
81d0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63  .if (!slot->pcsc
81e0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
81f0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
8200: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
8210: 6f 6e 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65  onnect(%s) calle
8220: 64 20 66 6f 72 20 73 6c 6f 74 20 25 70 22 2c 20  d for slot %p", 
8230: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8240: 72 2c 20 73 6c 6f 74 29 3b 0a 09 09 73 63 61 72  r, slot);...scar
8250: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
8260: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
8270: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
8280: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8290: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
82a0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
82b0: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
82c0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
82d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
82e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66  protocol);....if
82f0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8300: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8310: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8320: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8330: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
8340: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
8350: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
8360: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
8370: 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09  h just T=0")....
8380: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8390: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
83a0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
83b0: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
83c0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
83d0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
83e0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c  PROTOCOL_T0, &sl
83f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
8400: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
8410: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8420: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8430: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8440: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8450: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8460: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8470: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8480: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
8490: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
84a0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
84b0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
84c0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
84d0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
84e0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
84f0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8500: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
8510: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8520: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
8530: 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  .}...}....if (sc
8540: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
8550: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
8560: 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  D_CARD) {....CAC
8570: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8580: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
8590: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
85a0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
85b0: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 63  , trying to re-c
85c0: 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a 09 09  onnect...");....
85d0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
85e0: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
85f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
8600: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8610: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8620: 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41 52 44  RE_DIRECT, SCARD
8630: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
8640: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
8650: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
8660: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
8670: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8680: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8690: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
86a0: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
86b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
86c0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
86d0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
86e0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
86f0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
8700: 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f  0").....scard_co
8710: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8720: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
8730: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
8740: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
8750: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
8760: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8770: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
8780: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8790: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
87a0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
87b0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
87c0: 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43 41 43  ATCH) {......CAC
87d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
87e0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
87f0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
8800: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8810: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
8820: 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09 73 63  st T=1")......sc
8830: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8840: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8850: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
8860: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8870: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
8880: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
8890: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
88a0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
88b0: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d 0a 09  otocol);.....}..
88c0: 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f  ..}.....scard_co
88d0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
88e0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
88f0: 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 29 3b 0a  lot, protocol);.
8900: 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
8910: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
8920: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 29  RD_E_NO_SERVICE)
8930: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8940: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
8950: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
8960: 65 64 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45  ed SCARD_E_NO_SE
8970: 52 56 49 43 45 20 2d 2d 20 77 68 69 63 68 20 63  RVICE -- which c
8980: 6f 75 6c 64 20 6d 65 61 6e 20 6f 75 72 20 68 61  ould mean our ha
8990: 6e 64 6c 65 20 69 73 20 69 6e 76 61 6c 69 64 2c  ndle is invalid,
89a0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 72 65 63   will try to rec
89b0: 6f 6e 6e 65 63 74 20 74 6f 20 50 43 2f 53 43 20  onnect to PC/SC 
89c0: 73 65 72 76 69 63 65 22 29 3b 0a 0a 09 09 09 63  service");.....c
89d0: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
89e0: 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63  nnect();.....cac
89f0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
8a00: 28 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d  ();.....cackey_m
8a10: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
8a20: 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  lot);.....return
8a30: 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f  (cackey_connect_
8a40: 63 61 72 64 28 73 6c 6f 74 29 29 3b 0a 09 09 7d  card(slot));...}
8a50: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8a60: 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  nn_ret != SCARD_
8a70: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
8a80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8a90: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
8aa0: 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20  to card failed, 
8ab0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
8ac0: 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65  lure (SCardConne
8ad0: 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c  ct() = %s/%li)",
8ae0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
8af0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
8b00: 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  TR(scard_conn_re
8b10: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
8b20: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09  _conn_ret);.....
8b30: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8b40: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8b50: 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63  .}....slot->pcsc
8b60: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
8b70: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 1;...slot->tra
8b80: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8b90: 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e   0;...slot->tran
8ba0: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
8bb0: 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74  lock = 0;...slot
8bc0: 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
8bd0: 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43 41 43 4b  tocol;..}...CACK
8be0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8bf0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
8c00: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72  ccess");...retur
8c10: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
8c20: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
8c30: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
8c40: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8c50: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8c60: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8c70: 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a  slot *slot);. *.
8c80: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
8c90: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
8ca0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
8cb0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
8cc0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
8cd0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
8ce0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
8cf0: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
8d00: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
8d10: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8d20: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
8d30: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
8d40: 20 20 20 20 54 68 65 20 74 72 61 6e 73 61 63 74      The transact
8d50: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65  ion should be te
8d60: 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22  rminated using "
8d70: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
8d80: 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73  action". *. */.s
8d90: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
8da0: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
8db0: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8dc0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8dd0: 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65  ot) {..cackey_re
8de0: 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65  t cackey_conn_re
8df0: 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74  t;..LONG scard_t
8e00: 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  rans_ret;...CACK
8e10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8e20: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61  "Called.");...ca
8e30: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  ckey_conn_ret = 
8e40: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
8e50: 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
8e60: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
8e70: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
8e80: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
8e90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
8ea0: 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20  able to connect 
8eb0: 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
8ec0: 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a  ng in error");..
8ed0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8ee0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8ef0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8f00: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b  saction_depth++;
8f10: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8f20: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
8f30: 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61   1 && !slot->tra
8f40: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8f50: 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45  _lock) {...CACKE
8f60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8f70: 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72 61  Already in a tra
8f80: 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72  nsaction, perfor
8f90: 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28  ming no action (
8fa0: 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29 22  new depth = %i)"
8fb0: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  , slot->transact
8fc0: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72  ion_depth);....r
8fd0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8fe0: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c  C_S_OK);..}...sl
8ff0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9000: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
9010: 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  ;...scard_trans_
9020: 72 65 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e  ret = SCardBegin
9030: 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  Transaction(slot
9040: 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69  ->pcsc_card);..i
9050: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
9060: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
9070: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
9080: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9090: 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20  Unable to begin 
90a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
90b0: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
90c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
90d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
90e0: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
90f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
9100: 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e  ucessfully began
9110: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
9120: 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74  slot (%s)", slot
9130: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ->pcsc_reader);.
9140: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9150: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
9160: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9170: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
9180: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
9190: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
91a0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
91b0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
91c0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
91d0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
91e0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
91f0: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
9200: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
9210: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
9220: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
9230: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
9240: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9250: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
9260: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
9270: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
9280: 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  nction requires 
9290: 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  "cackey_begin_tr
92a0: 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65  ansaction" to be
92b0: 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a   called first. *
92c0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
92d0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e  ey_ret cackey_en
92e0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  d_transaction(st
92f0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9300: 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20   *slot) {..LONG 
9310: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b  scard_trans_ret;
9320: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9330: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
9340: 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e  );...if (!slot->
9350: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
9360: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
9370: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
9380: 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63  rd is not connec
9390: 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65  ted, unable to e
93a0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  nd transaction o
93b0: 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69 66 20  n card");....if 
93c0: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
93d0: 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
93e0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
93f0: 50 52 49 4e 54 46 28 22 44 65 63 72 65 61 73 69  PRINTF("Decreasi
9400: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  ng transaction d
9410: 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e 67 20  epth and asking 
9420: 66 6f 72 20 61 20 68 61 72 64 77 61 72 65 20 6c  for a hardware l
9430: 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  ock on the next 
9440: 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f  begin transactio
9450: 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68  n (current depth
9460: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
9470: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9480: 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61  );.....slot->tra
9490: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
94a0: 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e  ;.....if (slot->
94b0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
94c0: 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f  h > 0) {.....slo
94d0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
94e0: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
94f0: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
9500: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9510: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
9520: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
9530: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20  action_depth == 
9540: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
9550: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d  BUG_PRINTF("Term
9560: 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61  inating a transa
9570: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ction that has n
9580: 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09  ot begun!");....
9590: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
95a0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
95b0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
95c0: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a  ction_depth--;..
95d0: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
95e0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
95f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9600: 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73  UG_PRINTF("Trans
9610: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e  actions still in
9620: 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74   progress, not t
9630: 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61  erminating on-ca
9640: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28  rd Transaction (
9650: 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20  current depth = 
9660: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
9670: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
9680: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9690: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
96a0: 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  ..scard_trans_re
96b0: 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e  t = SCardEndTran
96c0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63  saction(slot->pc
96d0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
96e0: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20  EAVE_CARD);..if 
96f0: 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  (scard_trans_ret
9700: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
9710: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
9720: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
9730: 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e  able to end tran
9740: 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69  saction, returni
9750: 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a  ng in error");..
9760: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9770: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
9780: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
9790: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
97a0: 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65  sfully terminate
97b0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
97c0: 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f   slot (%s)", slo
97d0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t->pcsc_reader);
97e0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
97f0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9800: 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65 64 20  /* APDU Related 
9810: 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a  Functions */./*.
9820: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
9830: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
9840: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
9850: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
9860: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
9870: 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e  d char class, un
9880: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
9890: 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65  ruction, unsigne
98a0: 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67  d char p1, unsig
98b0: 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73  ned char p2, uns
98c0: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75  igned char lc, u
98d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
98e0: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ta, unsigned cha
98f0: 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  r le, uint16_t *
9900: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
9910: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
9920: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
9930: 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  ata_len);. *. * 
9940: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
9950: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9960: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
9970: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
9980: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
9990: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
99a0: 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20  lass. *         
99b0: 41 50 44 55 20 43 6c 61 73 73 20 28 47 53 43 49  APDU Class (GSCI
99c0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20  S_CLASS_ISO7816 
99d0: 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  or GSCIS_CLASS_G
99e0: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20  LOBAL_PLATFORM. 
99f0: 2a 20 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c  *         usuall
9a00: 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20  y), (CLA). *. * 
9a10: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9a20: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a  r instruction. *
9a30: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 49 6e           APDU In
9a40: 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a  struction (INS).
9a50: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9a60: 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20  ed char p1. *   
9a70: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
9a80: 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20  eter 1 (P1). *. 
9a90: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9aa0: 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20  har p2. *       
9ab0: 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72    APDU Parameter
9ac0: 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20   2 (P2). *. *   
9ad0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9ae0: 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  lc. *         AP
9af0: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e  DU Length of Con
9b00: 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69  tent (Lc) -- thi
9b10: 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  s is the length 
9b20: 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20  of "data". *    
9b30: 20 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20       parameter. 
9b40: 20 49 66 20 22 64 61 74 61 22 20 69 73 20 73 70   If "data" is sp
9b50: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9b60: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
9b70: 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  will. *         
9b80: 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20  be ignored.. *. 
9b90: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9ba0: 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20  har *data. *    
9bb0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
9bc0: 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20  buffer to send. 
9bd0: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c   It should be "L
9be0: 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20  c" bytes long.  
9bf0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70  If. *         sp
9c00: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9c10: 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62   "Lc" will not b
9c20: 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73  e sent, and this
9c30: 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a   buffer will be.
9c40: 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72   *         ignor
9c50: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
9c60: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20  signed char le. 
9c70: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c  *         APDU L
9c80: 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74 61  ength of Expecta
9c90: 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69  tion (Le) -- thi
9ca0: 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  s is the length 
9cb0: 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  of the. *       
9cc0: 20 20 65 78 70 65 63 74 65 64 20 72 65 70 6c 79    expected reply
9cd0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
9ce0: 65 63 69 66 69 65 64 20 61 73 20 30 20 74 68 65  ecified as 0 the
9cf0: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a  n it will not. *
9d00: 20 20 20 20 20 20 20 20 20 62 65 20 73 65 6e 74           be sent
9d10: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74  .. *. *     uint
9d20: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20  16_t *respcode. 
9d30: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
9d40: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
9d50: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
9d60: 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68  nse code.  If th
9d70: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
9d80: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
9d90: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
9da0: 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69   code will be di
9db0: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20  scarded.. *. *  
9dc0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9dd0: 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20   *respdata. *   
9de0: 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e        [OUT] Poin
9df0: 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f  ter to storage o
9e00: 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20  f APDU response 
9e10: 64 61 74 61 2e 20 20 49 66 20 74 68 69 73 20 69  data.  If this i
9e20: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65  s. *         spe
9e30: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
9e40: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74  the response dat
9e50: 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72  a will be discar
9e60: 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ded.  If. *     
9e70: 20 20 20 20 74 68 65 20 22 72 65 73 70 64 61 74      the "respdat
9e80: 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72  a_len" parameter
9e90: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
9ea0: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66   NULL, this buff
9eb0: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69  er. *         wi
9ec0: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9ed0: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  d.. *. *     siz
9ee0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
9ef0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e  n. *         [IN
9f00: 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69  , OUT] Pointer i
9f10: 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69  nitialing contai
9f20: 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ning the size of
9f30: 20 74 68 65 20 22 72 65 73 70 64 61 74 61 22 0a   the "respdata".
9f40: 20 2a 20 20 20 20 20 20 20 20 20 62 75 66 66 65   *         buffe
9f50: 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75 72  r.  Before retur
9f60: 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65  ning, the pointe
9f70: 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70  d to value is up
9f80: 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20  dated to the. * 
9f90: 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f          number o
9fa0: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
9fb0: 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 20  to the buffer.  
9fc0: 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69  If this is speci
9fd0: 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20  fied as. *      
9fe0: 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c     NULL, it will
9ff0: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c   not be updated,
a000: 20 61 6e 64 20 22 72 65 73 70 64 61 74 61 22 20   and "respdata" 
a010: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
a020: 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20  causing. *      
a030: 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20     the response 
a040: 64 61 74 61 20 74 6f 20 62 65 20 64 69 73 63 61  data to be disca
a050: 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55  rded.. *. * RETU
a060: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
a070: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
a080: 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75             On su
a090: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
a0a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a0b0: 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72  IC      On error
a0c0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
a0d0: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
a0e0: 54 20 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e  T  If the sendin
a0f0: 67 20 66 61 69 6c 65 64 20 62 65 63 61 75 73 65  g failed because
a100: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a   the token is. *
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 61 62 73 65 6e 74 0a 20 2a 20 20 20 20 20 43 41  absent. *     CA
a140: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
a150: 59 20 20 20 20 20 20 20 20 49 66 20 73 6f 6d 65  Y        If some
a160: 74 68 69 6e 67 20 74 68 61 74 20 6c 6f 6f 6b 73  thing that looks
a170: 20 72 65 74 72 79 27 61 62 6c 65 20 77 65 6e 74   retry'able went
a180: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 77 72 6f 6e 67 20 2d 2d 20 74 72 79 20     wrong -- try 
a1b0: 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
a1c0: 63 74 69 6f 6e 20 6f 76 65 72 0a 20 2a 20 20 20  ction over. *   
a1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67 61               aga
a1f0: 69 6e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  in. *. * NOTES. 
a200: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
a210: 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74  ion will connect
a220: 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f   to the PC/SC Co
a230: 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72  nnection Manager
a240: 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61 63 6b   via. *     cack
a250: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
a260: 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a  ) if needed.. *.
a270: 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c 20 63   *     It will c
a280: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61  onnect to the ca
a290: 72 64 20 69 6e 20 74 68 65 20 72 65 61 64 65 72  rd in the reader
a2a0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
a2b0: 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73 70 65   slot. *     spe
a2c0: 63 69 66 69 65 64 2e 20 20 49 74 20 77 69 6c 6c  cified.  It will
a2d0: 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68   reconnect to th
a2e0: 65 20 63 61 72 64 20 69 66 20 74 68 65 20 63 6f  e card if the co
a2f0: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20  nnection. *     
a300: 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a  goes away.. *. *
a310: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
a320: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  ret cackey_send_
a330: 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b  apdu(struct cack
a340: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
a350: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
a360: 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ss, unsigned cha
a370: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75  r instruction, u
a380: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c  nsigned char p1,
a390: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
a3a0: 32 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  2, unsigned int 
a3b0: 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  lc, unsigned cha
a3c0: 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65  r *data, unsigne
a3d0: 64 20 69 6e 74 20 6c 65 2c 20 75 69 6e 74 31 36  d int le, uint16
a3e0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
a3f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
a400: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
a410: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
a420: 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63  uint8_t major_rc
a430: 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a  , minor_rc;..siz
a440: 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  e_t bytes_to_cop
a450: 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  y, tmp_respdata_
a460: 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49  len;..LPCSCARD_I
a470: 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53 65 6e  O_REQUEST pioSen
a480: 64 50 63 69 3b 0a 09 53 43 41 52 44 5f 49 4f 5f  dPci;..SCARD_IO_
a490: 52 45 51 55 45 53 54 20 70 69 6f 52 65 63 76 50  REQUEST pioRecvP
a4a0: 63 69 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f  ci;..DWORD xmit_
a4b0: 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  len, recv_len;..
a4c0: 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f  LONG scard_xmit_
a4d0: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
a4e0: 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69  n_ret;..BYTE xmi
a4f0: 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63  t_buf[1024], rec
a500: 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e  v_buf[1024];..in
a510: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
a520: 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70  et, pcsc_getresp
a530: 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  _ret;..int idx;.
a540: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a550: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
a560: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b  ;...if (!slot) {
a570: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a580: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
a590: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22  slot specified."
a5a0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a5b0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a5c0: 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  IC);..}...if (re
a5d0: 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73  spcode) {...*res
a5e0: 70 63 6f 64 65 20 3d 20 30 78 66 66 66 66 3b 0a  pcode = 0xffff;.
a5f0: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
a600: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
a610: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
a620: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
a630: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
a640: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
a650: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a660: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
a670: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
a680: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
a690: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
a6a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
a6b0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
a6c0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  ./* Determine wh
a6d0: 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20  ich protocol to 
a6e0: 73 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73  send using */..s
a6f0: 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f  witch (slot->pro
a700: 74 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20  tocol) {...case 
a710: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a720: 30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  0:....CACKEY_DEB
a730: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
a740: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
a750: 67 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a  gram is T=0");..
a760: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
a770: 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09  SCARD_PCI_T0;...
a780: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
a790: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a7a0: 31 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  1:....CACKEY_DEB
a7b0: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
a7c0: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
a7d0: 67 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a  gram is T=1");..
a7e0: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
a7f0: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
a800: 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75  ..break;...defau
a810: 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  lt:....CACKEY_DE
a820: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
a830: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75  lid protocol fou
a840: 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b  nd, aborting.");
a850: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
a860: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
a870: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e  C);..}.../* Tran
a880: 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65  smit */..xmit_le
a890: 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66  n = 0;..xmit_buf
a8a0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63  [xmit_len++] = c
a8b0: 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  lass;..xmit_buf[
a8c0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e  xmit_len++] = in
a8d0: 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74  struction;..xmit
a8e0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a8f0: 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66   = p1;..xmit_buf
a900: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70  [xmit_len++] = p
a910: 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a  2;..if (data) {.
a920: 09 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20  ..if (lc > 255) 
a930: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
a940: 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f  G_PRINTF("CAUTIO
a950: 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20  N!  Using an Lc 
a960: 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35  greater than 255
a970: 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c   is untested.  L
a980: 63 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09  c = %u", lc);...
a990: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a9a0: 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f  len++] = 0x82; /
a9b0: 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a  * XXX UNTESTED *
a9c0: 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  /....xmit_buf[xm
a9d0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20  it_len++] = (lc 
a9e0: 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a  & 0xff00) >> 8;.
a9f0: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
aa00: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30  _len++] = lc & 0
aa10: 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  xff;...} else {.
aa20: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
aa30: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
aa40: 7d 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
aa50: 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b  ; idx < lc; idx+
aa60: 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  +) {....xmit_buf
aa70: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64  [xmit_len++] = d
aa80: 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d  ata[idx];...}..}
aa90: 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30  ...if (le != 0x0
aaa0: 30 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20  0) {...if (le > 
aab0: 32 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  256) {....CACKEY
aac0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
aad0: 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61  AUTION!  Using a
aae0: 6e 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61  n Le greater tha
aaf0: 6e 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65  n 256 is unteste
ab00: 64 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65  d.  Le = %u", le
ab10: 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  );.....xmit_buf[
ab20: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
ab30: 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53  82; /* XXX UNTES
ab40: 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62  TED */....xmit_b
ab50: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
ab60: 20 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e   (le & 0xff00) >
ab70: 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66  > 8;....xmit_buf
ab80: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
ab90: 65 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c  e & 0xff;...} el
aba0: 73 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36  se if (le == 256
abb0: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
abc0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
abd0: 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  00;...} else {..
abe0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
abf0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d  len++] = le;...}
ac00: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53  ..}.../* Begin S
ac10: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
ac20: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
ac30: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
ac40: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63  n(slot);...if (c
ac50: 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c  lass == GSCIS_CL
ac60: 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 28  ASS_ISO7816 && (
ac70: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47  instruction == G
ac80: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
ac90: 59 20 7c 7c 20 69 6e 73 74 72 75 63 74 69 6f 6e  Y || instruction
aca0: 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f   == GSCIS_INSTR_
acb0: 43 48 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45  CHANGE_REFERENCE
acc0: 29 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29  ) && p1 == 0x00)
acd0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
ace0: 47 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e  G_PRINTF("Sendin
acf0: 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72  g APDU: <<censor
ad00: 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20  ed>>");..} else 
ad10: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
ad20: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69  _PRINTBUF("Sendi
ad30: 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f  ng APDU:", xmit_
ad40: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a  buf, xmit_len);.
ad50: 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20  .}...recv_len = 
ad60: 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29  sizeof(recv_buf)
ad70: 3b 0a 09 6d 65 6d 63 70 79 28 26 70 69 6f 52 65  ;..memcpy(&pioRe
ad80: 63 76 50 63 69 2c 20 70 69 6f 53 65 6e 64 50 63  cvPci, pioSendPc
ad90: 69 2c 20 73 69 7a 65 6f 66 28 70 69 6f 52 65 63  i, sizeof(pioRec
ada0: 76 50 63 69 29 29 3b 0a 09 73 63 61 72 64 5f 78  vPci));..scard_x
adb0: 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54  mit_ret = SCardT
adc0: 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63  ransmit(slot->pc
add0: 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64  sc_card, pioSend
ade0: 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  Pci, xmit_buf, x
adf0: 6d 69 74 5f 6c 65 6e 2c 20 26 70 69 6f 52 65 63  mit_len, &pioRec
ae00: 76 50 63 69 2c 20 72 65 63 76 5f 62 75 66 2c 20  vPci, recv_buf, 
ae10: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66  &recv_len);...if
ae20: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
ae30: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f   == SCARD_E_NOT_
ae40: 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09  TRANSACTED) {...
ae50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ae60: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
ae70: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
ae80: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
ae90: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c  ) = %s/%lx), wil
aea0: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75  l ask calling fu
aeb0: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20  nction to retry 
aec0: 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63  (not resetting c
aed0: 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  ard)...", CACKEY
aee0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
aef0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
af00: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
af10: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
af20: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
af30: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
af40: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
af50: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
af60: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
af70: 0a 0a 09 09 63 61 63 6b 65 79 5f 72 65 63 6f 6e  ....cackey_recon
af80: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
af90: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b  slot->protocol);
afa0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
afb0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b  Y_PCSC_E_RETRY);
afc0: 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f  ..}...if (scard_
afd0: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52  xmit_ret == SCAR
afe0: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 29 20  D_E_NO_SERVICE) 
aff0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
b000: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
b010: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
b020: 63 61 72 64 2c 20 70 6f 73 73 69 62 6c 79 20 64  card, possibly d
b030: 75 65 20 74 6f 20 50 43 2f 53 43 20 68 61 6e 64  ue to PC/SC hand
b040: 6c 65 20 62 65 69 6e 67 20 69 6e 76 61 6c 69 64  le being invalid
b050: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
b060: 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c  ) = %s/%lx), wil
b070: 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75  l ask calling fu
b080: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 2e  nction to retry.
b090: 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
b0a0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
b0b0: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
b0c0: 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65  t_ret), (unsigne
b0d0: 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d  d long) scard_xm
b0e0: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 63 61 63 6b  it_ret);....cack
b0f0: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
b100: 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74  et(slot);....ret
b110: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b120: 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69  E_RETRY);..}...i
b130: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
b140: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
b150: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
b160: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
b170: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
b180: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
b190: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
b1a0: 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%lx)", CACKEY_D
b1b0: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
b1c0: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
b1d0: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69  xmit_ret), (unsi
b1e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64  gned long) scard
b1f0: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43  _xmit_ret);....C
b200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b210: 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74  TF("Marking slot
b220: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
b230: 72 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b 65  reset");...cacke
b240: 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
b250: 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28  t(slot);....if (
b260: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
b270: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
b280: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
b290: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b2a0: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
b2b0: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
b2c0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
b2d0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
b2e0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
b2f0: 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  lot, SCARD_PROTO
b300: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
b310: 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a 0a 09 09  ROTOCOL_T1);....
b320: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
b330: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
b340: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
b350: 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72  switch (slot->pr
b360: 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63  otocol) {......c
b370: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
b380: 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70 69 6f  OL_T0:.......pio
b390: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
b3a0: 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62  PCI_T0;........b
b3b0: 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
b3c0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
b3d0: 31 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64  1:.......pioSend
b3e0: 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f  Pci = SCARD_PCI_
b3f0: 54 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  T1;........break
b400: 3b 0a 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a  ;......default:.
b410: 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
b420: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
b430: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
b440: 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74 65 20  d, but too late 
b450: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61  to do anything a
b460: 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74  bout it now -- t
b470: 72 79 69 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b  rying anyway.");
b480: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
b490: 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d  ...}....../* Re-
b4a0: 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61  establish transa
b4b0: 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73  ction, if it was
b4c0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09   present */.....
b4d0: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
b4e0: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
b4f0: 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72   {......slot->tr
b500: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
b510: 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  -;......slot->tr
b520: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
b530: 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09  w_lock = 1;.....
b540: 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
b550: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b560: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
b570: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b580: 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75  "Reset successfu
b590: 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74 74 69 6e  l, retransmittin
b5a0: 67 22 29 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c  g");......recv_l
b5b0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76  en = sizeof(recv
b5c0: 5f 62 75 66 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _buf);.....memcp
b5d0: 79 28 26 70 69 6f 52 65 63 76 50 63 69 2c 20 70  y(&pioRecvPci, p
b5e0: 69 6f 53 65 6e 64 50 63 69 2c 20 73 69 7a 65 6f  ioSendPci, sizeo
b5f0: 66 28 70 69 6f 52 65 63 76 50 63 69 29 29 3b 0a  f(pioRecvPci));.
b600: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  ....scard_xmit_r
b610: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
b620: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
b630: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  rd, pioSendPci, 
b640: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
b650: 65 6e 2c 20 26 70 69 6f 52 65 63 76 50 63 69 2c  en, &pioRecvPci,
b660: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
b670: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
b680: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21  scard_xmit_ret !
b690: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
b6a0: 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
b6b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b6c0: 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64  etransmit failed
b6d0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b6e0: 61 69 6c 75 72 65 20 61 66 74 65 72 20 64 69 73  ailure after dis
b6f0: 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63  connecting the c
b700: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
b710: 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43  it = %s/%li)", C
b720: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b730: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
b740: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
b750: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  , (long) scard_x
b760: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09  mit_ret);.......
b770: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
b780: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
b790: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
b7a0: 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70  D);......slot->p
b7b0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
b7c0: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a  ed = 0;......./*
b7d0: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
b7e0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
b7f0: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
b800: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
b810: 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  .....cackey_end_
b820: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b830: 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
b840: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
b850: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
b860: 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
b870: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b880: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
b890: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
b8a0: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
b8b0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
b8c0: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
b8d0: 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e  ARD);.....slot->
b8e0: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
b8f0: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a  ted = 0;....../*
b900: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
b910: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
b920: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
b930: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
b940: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b950: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b960: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
b970: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
b980: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
b990: 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
b9a0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
b9b0: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09  NABSENT);....}..
b9c0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
b9d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b9e0: 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  ("Disconnecting 
b9f0: 63 61 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72  card");.....SCar
ba00: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
ba10: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
ba20: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
ba30: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
ba40: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
ba50: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
ba60: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
ba70: 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74  on */....slot->t
ba80: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
ba90: 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 1;....cackey_
baa0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
bab0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45  slot);.....CACKE
bac0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bad0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
bae0: 6c 75 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72  lure");....retur
baf0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
bb00: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
bb10: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
bb20: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65  BUG_PRINTBUF("Re
bb30: 74 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20  turned Value:", 
bb40: 72 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c  recv_buf, recv_l
bb50: 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f  en);...if (recv_
bb60: 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20  len < 2) {.../* 
bb70: 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65  Minimal response
bb80: 20 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79 74   length is 2 byt
bb90: 65 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  es, returning in
bba0: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41   failure */...CA
bbb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bbc0: 46 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20  F("Response too 
bbd0: 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67  small, returning
bbe0: 20 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63   in failure (rec
bbf0: 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28  v_len = %lu)", (
bc00: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
bc10: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20  ecv_len);..../* 
bc20: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
bc30: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
bc40: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
bc50: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
bc60: 2f 2a 20 53 75 70 70 6c 79 20 61 6e 20 69 6e 76  /* Supply an inv
bc70: 61 6c 69 64 20 72 65 73 70 6f 6e 73 65 20 63 6f  alid response co
bc80: 64 65 20 2a 2f 0a 09 09 69 66 20 28 72 65 73 70  de */...if (resp
bc90: 63 6f 64 65 29 20 7b 0a 09 09 09 2a 72 65 73 70  code) {....*resp
bca0: 63 6f 64 65 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09  code = 0;...}...
bcb0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
bcc0: 43 53 43 5f 45 5f 4e 4f 44 41 54 41 29 3b 0a 09  CSC_E_NODATA);..
bcd0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
bce0: 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   result code */.
bcf0: 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76  .major_rc = recv
bd00: 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20  _buf[recv_len - 
bd10: 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20  2];..minor_rc = 
bd20: 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65  recv_buf[recv_le
bd30: 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73  n - 1];..if (res
bd40: 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70  pcode) {...*resp
bd50: 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63  code = (major_rc
bd60: 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72   << 8) | minor_r
bd70: 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73  c;..}.../* Adjus
bd80: 74 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72  t message buffer
bd90: 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d   */..recv_len -=
bda0: 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74   2;.../* Add byt
bdb0: 65 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c  es to return val
bdc0: 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64  ue */..tmp_respd
bdd0: 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66  ata_len = 0;..if
bde0: 20 28 72 65 73 70 64 61 74 61 20 26 26 20 72 65   (respdata && re
bdf0: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
be00: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
be10: 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e   = *respdata_len
be20: 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f  ;....bytes_to_co
be30: 70 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c  py = *respdata_l
be40: 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f  en;....if (recv_
be50: 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63  len < bytes_to_c
be60: 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  opy) {....bytes_
be70: 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c  to_copy = recv_l
be80: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  en;...}....CACKE
be90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bea0: 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65  Copying %lu byte
beb0: 73 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  s to the buffer 
bec0: 28 72 65 63 76 27 64 20 25 6c 75 20 62 79 74 65  (recv'd %lu byte
bed0: 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20  s, but only %lu 
bee0: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75  bytes left in ou
bef0: 72 20 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73  r buffer)", (uns
bf00: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65  igned long) byte
bf10: 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69  s_to_copy, (unsi
bf20: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f  gned long) recv_
bf30: 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
bf40: 6f 6e 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c  ong) *respdata_l
bf50: 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72  en);....memcpy(r
bf60: 65 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75  espdata, recv_bu
bf70: 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  f, bytes_to_copy
bf80: 29 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d  );...respdata +=
bf90: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
bfa0: 0a 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  ...*respdata_len
bfb0: 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   = bytes_to_copy
bfc0: 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61  ;...tmp_respdata
bfd0: 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  _len -= bytes_to
bfe0: 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b  _copy;..} else {
bff0: 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20  ...if (recv_len 
c000: 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
c010: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c020: 54 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c  Throwing away %l
c030: 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65  u bytes, nowhere
c040: 20 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20   to put them!", 
c050: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c060: 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09  recv_len);...}..
c070: 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  }...if (major_rc
c080: 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a   == 0x61) {.../*
c090: 20 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44   We need to READ
c0a0: 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
c0b0: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
c0c0: 72 20 72 65 61 64 20 72 65 71 75 69 72 65 64 22  r read required"
c0d0: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f  );....if (minor_
c0e0: 72 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  rc == 0x00) {...
c0f0: 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b  .minor_rc = CACK
c100: 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d  EY_APDU_MTU;...}
c110: 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73 70  ....pcsc_getresp
c120: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
c130: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
c140: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
c150: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47  6, GSCIS_INSTR_G
c160: 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30  ET_RESPONSE, 0x0
c170: 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c  0, 0x00, 0, NULL
c180: 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70  , minor_rc, resp
c190: 63 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20  code, respdata, 
c1a0: 26 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  &tmp_respdata_le
c1b0: 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63 73 63 5f  n);....if (pcsc_
c1c0: 67 65 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43  getresp_ret != C
c1d0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c1e0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
c1f0: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
c200: 72 20 72 65 61 64 20 66 61 69 6c 65 64 21 20 20  r read failed!  
c210: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
c220: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45  lure");...../* E
c230: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
c240: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
c250: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
c260: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
c270: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
c280: 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  p_ret == CACKEY_
c290: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
c2a0: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
c2b0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b  Y_PCSC_E_RETRY);
c2c0: 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
c2d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
c2e0: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
c2f0: 69 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e  if (respdata_len
c300: 29 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61  ) {....*respdata
c310: 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70  _len += tmp_resp
c320: 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  data_len;...}...
c330: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
c340: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
c350: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
c360: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
c370: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c380: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
c390: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 62  ng in success (b
c3a0: 75 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c  uffer read compl
c3b0: 65 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e  ete)");...return
c3c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
c3d0: 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20  K);..}.../* End 
c3e0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
c3f0: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
c400: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
c410: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61  (slot);...if (ma
c420: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20  jor_rc == 0x90) 
c430: 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a  {.../* Success *
c440: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
c450: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
c460: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d  ng in success (m
c470: 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22  ajor_rc = 0x90)"
c480: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
c490: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
c4a0: 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
c4b0: 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20  UG_PRINTF("APDU 
c4c0: 52 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  Returned an erro
c4d0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
c4e0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74  failure");...ret
c4f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
c500: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 73  E_GENERIC);.}..s
c510: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
c520: 68 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  har *cackey_read
c530: 5f 62 65 72 74 6c 76 5f 74 61 67 28 75 6e 73 69  _bertlv_tag(unsi
c540: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c550: 72 2c 20 73 69 7a 65 5f 74 20 2a 62 75 66 66 65  r, size_t *buffe
c560: 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69 67 6e 65  r_len_p, unsigne
c570: 64 20 63 68 61 72 20 74 61 67 2c 20 75 6e 73 69  d char tag, unsi
c580: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
c590: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 6f 75  ffer, size_t *ou
c5a0: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 29 20 7b  tbuffer_len_p) {
c5b0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
c5c0: 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65  *buffer_p;..size
c5d0: 5f 74 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  _t outbuffer_len
c5e0: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 73  , buffer_len;..s
c5f0: 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 09 69 6e 74  ize_t size;..int
c600: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
c610: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
c620: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 62 75  led.");...if (bu
c630: 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55  ffer_len_p == NU
c640: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
c650: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66  EBUG_PRINTF("buf
c660: 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c  fer_len_p is NUL
c670: 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  L.  Returning in
c680: 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09   failure.");....
c690: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
c6a0: 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 66 65 72  ...if (outbuffer
c6b0: 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  _len_p == NULL) 
c6c0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c6d0: 5f 50 52 49 4e 54 46 28 22 6f 75 74 62 75 66 66  _PRINTF("outbuff
c6e0: 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c  er_len_p is NULL
c6f0: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
c700: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
c710: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c720: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a  ..buffer_len = *
c730: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b  outbuffer_len_p;
c740: 0a 09 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 20  ..outbuffer_len 
c750: 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  = *outbuffer_len
c760: 5f 70 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72  _p;...if (buffer
c770: 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41  _len < 2) {...CA
c780: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c790: 46 28 22 62 75 66 66 65 72 5f 6c 65 6e 20 69 73  F("buffer_len is
c7a0: 20 6c 65 73 73 20 74 68 61 6e 20 32 2c 20 73 6f   less than 2, so
c7b0: 20 77 65 20 63 61 6e 27 74 20 72 65 61 64 20 61   we can't read a
c7c0: 6e 79 20 74 61 67 2e 20 20 52 65 74 75 72 6e 69  ny tag.  Returni
c7d0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c7e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c7f0: 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70  );..}...buffer_p
c800: 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66 20 28   = buffer;..if (
c810: 62 75 66 66 65 72 5f 70 5b 30 5d 20 21 3d 20 74  buffer_p[0] != t
c820: 61 67 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ag) {...CACKEY_D
c830: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
c840: 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f 74 20 74   found was not t
c850: 61 67 20 65 78 70 65 63 74 65 64 2e 20 20 54 61  ag expected.  Ta
c860: 67 20 3d 20 25 30 32 78 2c 20 45 78 70 65 63 74  g = %02x, Expect
c870: 65 64 20 3d 20 25 30 32 78 2e 20 20 52 65 74 75  ed = %02x.  Retu
c880: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c890: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  .", (unsigned in
c8a0: 74 29 20 62 75 66 66 65 72 5f 70 5b 30 5d 2c 20  t) buffer_p[0], 
c8b0: 74 61 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tag);....return(
c8c0: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66  NULL);..}...buff
c8d0: 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f  er_p++;..buffer_
c8e0: 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28 62 75  len--;...if ((bu
c8f0: 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78 38 30  ffer_p[0] & 0x80
c900: 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09 09 73  ) == 0x80) {...s
c910: 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78 20 3d  ize = 0;...idx =
c920: 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26 20   (buffer_p[0] & 
c930: 30 78 37 66 29 3b 0a 0a 09 09 69 66 20 28 69 64  0x7f);....if (id
c940: 78 20 3e 20 62 75 66 66 65 72 5f 6c 65 6e 29 20  x > buffer_len) 
c950: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
c960: 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72  G_PRINTF("Malfor
c970: 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20 2d 2d  med BER value --
c980: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
c990: 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 72  s available to r
c9a0: 65 61 64 20 6c 65 6e 67 74 68 20 28 69 64 78 20  ead length (idx 
c9b0: 3d 20 25 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e  = %i, buffer_len
c9c0: 20 3d 20 25 6c 75 29 22 2c 20 69 64 78 2c 20 28   = %lu)", idx, (
c9d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
c9e0: 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 09  uffer_len);.....
c9f0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09  return(NULL);...
ca00: 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64 78 20  }....for (; idx 
ca10: 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09  > 0; idx--) {...
ca20: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09  .buffer_p++;....
ca30: 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09  buffer_len--;...
ca40: 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09  ..size <<= 8;...
ca50: 09 73 69 7a 65 20 7c 3d 20 62 75 66 66 65 72 5f  .size |= buffer_
ca60: 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  p[0];...}..} els
ca70: 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20 62 75 66  e {...size = buf
ca80: 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a 09 62  fer_p[0];..}...b
ca90: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66  uffer_p++;..buff
caa0: 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28  er_len--;...if (
cab0: 73 69 7a 65 20 3e 20 6f 75 74 62 75 66 66 65 72  size > outbuffer
cac0: 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  _len) {...CACKEY
cad0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
cae0: 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79 20 76 61  nable to copy va
caf0: 6c 75 65 20 62 75 66 66 65 72 20 74 6f 20 6f 75  lue buffer to ou
cb00: 74 62 75 66 66 65 72 2c 20 6e 6f 74 20 65 6e 6f  tbuffer, not eno
cb10: 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61 6c 75 65  ugh room.  Value
cb20: 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d   buffer length =
cb30: 20 25 6c 75 2c 20 6f 75 74 20 62 75 66 66 65 72   %lu, out buffer
cb40: 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20   length = %lu", 
cb50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
cb60: 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  size, (unsigned 
cb70: 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66 65 72 5f  long) outbuffer_
cb80: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
cb90: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f 75 74  NULL);..}...*out
cba0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 73  buffer_len_p = s
cbb0: 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74 62 75 66  ize;..if (outbuf
cbc0: 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  fer) {...memcpy(
cbd0: 6f 75 74 62 75 66 66 65 72 2c 20 62 75 66 66 65  outbuffer, buffe
cbe0: 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75  r_p, size);...bu
cbf0: 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a 65 3b 0a  ffer_p += size;.
cc00: 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 2d 3d 20  ..buffer_len -= 
cc10: 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66 66 65 72  size;....*buffer
cc20: 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66 65 72 5f  _len_p = buffer_
cc30: 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  len;....CACKEY_D
cc40: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 42  EBUG_PRINTBUF("B
cc50: 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a 22  ER-TLV results:"
cc60: 2c 20 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a  , outbuffer, siz
cc70: 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  e);..} else {...
cc80: 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c 20  memmove(buffer, 
cc90: 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b  buffer_p, size);
cca0: 0a 09 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75  ...buffer_p = bu
ccb0: 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ffer;....CACKEY_
ccc0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
ccd0: 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a  BER-TLV results:
cce0: 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 29  ", buffer, size)
ccf0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
cd00: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
cd10: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
cd20: 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f 6e 74 65  .  Size of conte
cd30: 6e 74 73 20 66 6f 72 20 74 61 67 20 25 30 32 78  nts for tag %02x
cd40: 20 69 73 20 25 6c 75 22 2c 20 28 75 6e 73 69 67   is %lu", (unsig
cd50: 6e 65 64 20 69 6e 74 29 20 74 61 67 2c 20 28 75  ned int) tag, (u
cd60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
cd70: 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75  ze);...return(bu
cd80: 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20  ffer_p);.}../*. 
cd90: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
cda0: 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79    ssize_t cackey
cdb0: 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75 63 74  _get_data(struct
cdc0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
cdd0: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
cde0: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
cdf0: 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e  t buffer_len, un
ce00: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b  signed char oid[
ce10: 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  3]);. *. * ARGUM
ce20: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
ce30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
ce40: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
ce50: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
ce60: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
ce70: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
ce80: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
ce90: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
cea0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
ceb0: 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a 20 2a 20  t buffer_len. * 
cec0: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
ced0: 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d  f bytes to attem
cee0: 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a  pt to read. *. *
cef0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
cf00: 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20 20 20 20  ar oid[3]. *    
cf10: 20 20 20 20 20 33 2d 62 79 74 65 20 4f 49 44 20       3-byte OID 
cf20: 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 0a 20 2a  to read. *. *. *
cf30: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
cf40: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
cf50: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
cf60: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
cf70: 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72  ctually read, or
cf80: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a   -1 on error.. *
cf90: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
cfa0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
cfb0: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
cfc0: 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75  ey_get_data(stru
cfd0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cfe0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
cff0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
d000: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
d010: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69  unsigned char oi
d020: 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67 6e 65  d[3]) {..unsigne
d030: 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d 20 7b  d char cmd[] = {
d040: 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78 30 30  0x5C, 0x03, 0x00
d050: 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 09  , 0x00, 0x00};..
d060: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
d070: 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74  uffer_p;..size_t
d080: 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e   init_buffer_len
d090: 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74 31 36 5f  , size;..uint16_
d0a0: 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74  t respcode;..int
d0b0: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
d0c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d0d0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
d0e0: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 20 3d  nit_buffer_len =
d0f0: 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 63   buffer_len;...c
d100: 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a  md[2] = oid[0];.
d110: 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d  .cmd[3] = oid[1]
d120: 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b  ;..cmd[4] = oid[
d130: 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74 6f 20  2];.../* 256 to 
d140: 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c 61 72  indicate the lar
d150: 67 65 73 74 20 6d 65 73 73 61 67 65 20 73 69 7a  gest message siz
d160: 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72 20 69  e -- not clear i
d170: 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f 72 6b  f this will work
d180: 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73 61 67   with all messag
d190: 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20  es */..send_ret 
d1a0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
d1b0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
d1c0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49  LASS_ISO7816, NI
d1d0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
d1e0: 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30 78 33  TR_GET_DATA, 0x3
d1f0: 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f 66 28  F, 0xFF, sizeof(
d200: 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36 2c 20  cmd), cmd, 256, 
d210: 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65  &respcode, buffe
d220: 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 29 3b  r, &buffer_len);
d230: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d240: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
d250: 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b  _RETRY) {...CACK
d260: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d270: 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61  "ADPU Sending fa
d280: 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72  iled, retrying r
d290: 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09  ead buffer");...
d2a0: 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 67  .return(cackey_g
d2b0: 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62 75  et_data(slot, bu
d2c0: 66 66 65 72 2c 20 69 6e 69 74 5f 62 75 66 66 65  ffer, init_buffe
d2d0: 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a 09 7d  r_len, oid));..}
d2e0: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d2f0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
d300: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
d310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
d320: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29  ckey_send_apdu()
d330: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
d340: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
d350: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
d360: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
d370: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
d380: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
d390: 5f 4d 41 58 0a 09 69 66 20 28 62 75 66 66 65 72  _MAX..if (buffer
d3a0: 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53  _len > _POSIX_SS
d3b0: 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
d3c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d3d0: 28 22 52 65 61 64 20 62 79 74 65 73 20 28 62 75  ("Read bytes (bu
d3e0: 66 66 65 72 5f 6c 65 6e 29 20 65 78 63 65 65 64  ffer_len) exceed
d3f0: 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
d400: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d410: 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
d420: 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20  i, buffer_len = 
d430: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
d440: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
d450: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d460: 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09  buffer_len);....
d470: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
d480: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
d490: 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20  .if (buffer_len 
d4a0: 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 2) {...CACKEY_
d4b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
d4c0: 44 55 20 47 45 54 20 44 41 54 41 20 72 65 74 75  DU GET DATA retu
d4d0: 72 6e 65 64 20 25 6c 75 20 62 79 74 65 73 2c 20  rned %lu bytes, 
d4e0: 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f  which is too sho
d4f0: 72 74 20 66 6f 72 20 61 20 42 45 52 2d 54 4c 56  rt for a BER-TLV
d500: 20 72 65 73 70 6f 6e 73 65 22 2c 20 28 75 6e 73   response", (uns
d510: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66  igned long) buff
d520: 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  er_len);....retu
d530: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 69 7a  rn(-1);..}...siz
d540: 65 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a  e = buffer_len;.
d550: 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b  .buffer_p = cack
d560: 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74  ey_read_bertlv_t
d570: 61 67 28 62 75 66 66 65 72 2c 20 26 62 75 66 66  ag(buffer, &buff
d580: 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20 4e 55  er_len, 0x53, NU
d590: 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09 69 66  LL, &size);...if
d5a0: 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55   (buffer_p == NU
d5b0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
d5c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
d5d0: 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c 65 64   decoding failed
d5e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
d5f0: 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65 74 75  rror.");....retu
d600: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43 41 43  rn(-1);..}...CAC
d610: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
d620: 55 46 28 22 47 45 54 20 44 41 54 41 20 72 65 73  UF("GET DATA res
d630: 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20 73 69  ult", buffer, si
d640: 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ze);...CACKEY_DE
d650: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
d660: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
d670: 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73  , read %lu bytes
d680: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
d690: 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75  g) size);...retu
d6a0: 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(size);.}../*.
d6b0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d6c0: 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65     ssize_t cacke
d6d0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
d6e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
d6f0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
d700: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
d710: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
d720: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
d730: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
d740: 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a  l_offset);. *. *
d750: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
d760: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
d770: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
d780: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
d790: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
d7a0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
d7b0: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20  d char *buffer. 
d7c0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
d7d0: 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20  Buffer. *. *    
d7e0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a   size_t count. *
d7f0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
d800: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65  of bytes to atte
d810: 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20  mpt to read. *. 
d820: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
d830: 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20  har t_or_v. *   
d840: 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68 65        Select the
d850: 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20 6f   T-buffer (01) o
d860: 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29 20  r V-buffer (02) 
d870: 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a  to read from.  .
d880: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
d890: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a   initial_offset.
d8a0: 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63 69   *         Speci
d8b0: 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  fy the offset to
d8c0: 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64 20   begin the read 
d8d0: 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45  from. *. *. * RE
d8e0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
d8f0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
d900: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
d910: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
d920: 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31  ally read, or -1
d930: 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a   on error.. *. *
d940: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
d950: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
d960: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
d970: 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75  read_buffer(stru
d980: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d990: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
d9a0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
d9b0: 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67  e_t count, unsig
d9c0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c  ned char t_or_v,
d9d0: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f   size_t initial_
d9e0: 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73 69 67  offset) {..unsig
d9f0: 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74 5f 62  ned char *init_b
da00: 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20 69  uffer;..size_t i
da10: 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a 65  nit_count;..size
da20: 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f  _t init_initial_
da30: 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f 74  offset;...size_t
da40: 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78   offset = 0, max
da50: 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75  _offset, max_cou
da60: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  nt;..unsigned ch
da70: 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74  ar cmd[2];..uint
da80: 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
da90: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
daa0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dab0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
dac0: 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20 3d 20  ..init_buffer = 
dad0: 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63 6f  buffer;..init_co
dae0: 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e  unt = count;..in
daf0: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
db00: 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  t = initial_offs
db10: 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74  et;...max_offset
db20: 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63   = count;..max_c
db30: 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41 50  ount = CACKEY_AP
db40: 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f  DU_MTU;...if (t_
db50: 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f  or_v != 1 && t_o
db60: 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41  r_v != 2) {...CA
db70: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
db80: 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20  F("Invalid T or 
db90: 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  V parameter spec
dba0: 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ified, returning
dbb0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
dbc0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
dbd0: 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72  ...cmd[0] = t_or
dbe0: 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20  _v;...while (1) 
dbf0: 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e  {...if (offset >
dc00: 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a  = max_offset) {.
dc10: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dc20: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 74  PRINTF("Buffer t
dc30: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e  oo small, return
dc40: 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e  ing what we got.
dc50: 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b  ..");.....break;
dc60: 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20  ...}....count = 
dc70: 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66  max_offset - off
dc80: 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74  set;...if (count
dc90: 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a   > max_count) {.
dca0: 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63  ...count = max_c
dcb0: 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64  ount;...}....cmd
dcc0: 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  [1] = count;....
dcd0: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
dce0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
dcf0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
dd00: 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
dd10: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
dd20: 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61  BUFFER, ((initia
dd30: 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65  l_offset + offse
dd40: 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c  t) >> 8) & 0xff,
dd50: 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74   (initial_offset
dd60: 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78 66   + offset) & 0xf
dd70: 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  f, sizeof(cmd), 
dd80: 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70  cmd, 0x00, &resp
dd90: 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f  code, buffer + o
dda0: 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a  ffset, &count);.
ddb0: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
ddc0: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
ddd0: 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43 41 43  _RETRY) {....CAC
dde0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ddf0: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
de00: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
de10: 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a 0a  read buffer");..
de20: 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
de30: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
de40: 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 2c 20  t, init_buffer, 
de50: 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72  init_count, t_or
de60: 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c  _v, init_initial
de70: 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a 0a  _offset));...}..
de80: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
de90: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
dea0: 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73  OK) {....if (res
deb0: 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29  pcode == 0x6A86)
dec0: 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63   {.....if (max_c
ded0: 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09  ount == 1) {....
dee0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
def0: 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20  ....max_count = 
df00: 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a  max_count / 2;..
df10: 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
df20: 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
df30: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
df40: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66  ey_send_apdu() f
df50: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
df60: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
df70: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
df80: 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20  .}....offset += 
df90: 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f  count;....if (co
dfa0: 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29  unt < max_count)
dfb0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
dfc0: 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74  UG_PRINTF("Short
dfd0: 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d   read -- count =
dfe0: 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69   %i, cmd[1] = %i
dff0: 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20  ", (int) count, 
e000: 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a  (int) cmd[1]);..
e010: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
e020: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
e030: 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
e040: 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
e050: 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e  AX..if (offset >
e060: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
e070: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
e080: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73  BUG_PRINTF("Offs
e090: 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  et exceeds maxim
e0a0: 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
e0b0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
e0c0: 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73  (max = %li, offs
e0d0: 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  et = %lu)", (lon
e0e0: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
e0f0: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
e100: 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09  ong) offset);...
e110: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
e120: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
e130: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e140: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
e150: 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61   in success, rea
e160: 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75  d %lu bytes", (u
e170: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66  nsigned long) of
e180: 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  fset);...return(
e190: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  offset);.}../*. 
e1a0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
e1b0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
e1c0: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
e1d0: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
e1e0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
e1f0: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20  gned char *aid, 
e200: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b  size_t aid_len);
e210: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
e220: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
e230: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
e240: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
e250: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
e260: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
e270: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
e280: 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75 66  d. *         Buf
e290: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41  fer containing A
e2a0: 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65  pplet ID to sele
e2b0: 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  ct. *. *     siz
e2c0: 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20  e_t aid_len. *  
e2d0: 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66         Number of
e2e0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22 61   bytes in the "a
e2f0: 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29 20  id" (Applet ID) 
e300: 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20  parameter. *. * 
e310: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
e320: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
e330: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
e340: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
e350: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
e360: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
e370: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
e380: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a      None. *. */.
e390: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
e3a0: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
e3b0: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
e3c0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
e3d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e3e0: 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f  aid, size_t aid_
e3f0: 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64  len) {..int send
e400: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
e410: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e420: 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
e430: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
e440: 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65  "Selecting apple
e450: 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65  t:", aid, aid_le
e460: 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d  n);...send_ret =
e470: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
e480: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
e490: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
e4a0: 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c  IS_INSTR_SELECT,
e4b0: 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c   GSCIS_PARAM_SEL
e4c0: 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 30  ECT_APPLET, 0x00
e4d0: 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20  , aid_len, aid, 
e4e0: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
e4f0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73  , NULL);...if (s
e500: 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
e510: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20  Y_PCSC_E_RETRY) 
e520: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
e530: 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65  _PRINTF("ADPU Se
e540: 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65  nding failed, re
e550: 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20 61 70  trying select ap
e560: 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  plet");....retur
e570: 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  n(cackey_select_
e580: 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69 64  applet(slot, aid
e590: 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a  , aid_len));..}.
e5a0: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
e5b0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
e5c0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
e5d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
e5e0: 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c  led to open appl
e5f0: 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  et, returning in
e600: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e610: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e620: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
e630: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e640: 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66  PRINTF("Successf
e650: 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69  ully selected fi
e660: 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  le");...return(C
e670: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
e680: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
e690: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
e6a0: 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 63  y_pcsc_id_type c
e6b0: 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64  ackey_detect_and
e6c0: 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70  _select_root_app
e6d0: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
e6e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 63 61  y_slot *slot, ca
e6f0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
e700: 65 20 74 79 70 65 5f 68 69 6e 74 29 3b 0a 20 2a  e type_hint);. *
e710: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
e720: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
e730: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
e740: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
e750: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
e760: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 63 61 63 6b  o. *. *     cack
e770: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
e780: 74 79 70 65 5f 68 69 6e 74 0a 20 2a 20 20 20 20  type_hint. *    
e790: 20 20 20 20 20 41 20 68 69 6e 74 20 61 73 20 74       A hint as t
e7a0: 6f 20 77 68 69 63 68 20 74 79 70 65 20 6f 66 20  o which type of 
e7b0: 63 61 72 64 20 6d 69 67 68 74 20 62 65 20 69 6e  card might be in
e7c0: 20 74 68 69 73 20 73 6c 6f 74 20 28 43 41 43 20   this slot (CAC 
e7d0: 6f 72 20 50 49 56 29 0a 20 2a 0a 20 2a 20 52 45  or PIV). *. * RE
e7e0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
e7f0: 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45    CACKEY_ID_TYPE
e800: 5f 50 49 56 20 20 20 20 20 20 20 49 66 20 74 68  _PIV       If th
e810: 65 20 63 61 72 64 20 63 6f 6e 6e 65 63 74 65 64  e card connected
e820: 20 69 73 20 61 20 50 49 56 0a 20 2a 20 20 20 20   is a PIV. *    
e830: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
e840: 43 41 43 20 20 20 20 20 20 20 49 66 20 74 68 65  CAC       If the
e850: 20 63 61 72 64 20 63 6f 6e 6e 65 63 74 65 64 20   card connected 
e860: 69 73 20 61 20 43 41 43 20 77 69 74 68 20 74 68  is a CAC with th
e870: 65 20 43 43 43 0a 20 2a 20 20 20 20 20 20 20 20  e CCC. *        
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 20 61 70 70 6c 65 74 0a 20 2a 20        applet. * 
e8a0: 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59      CACKEY_ID_TY
e8b0: 50 45 5f 45 52 52 4f 52 20 20 20 20 20 49 66 20  PE_ERROR     If 
e8c0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
e8d0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   determine what 
e8e0: 74 79 70 65 20 6f 66 20 63 61 72 64 0a 20 2a 20  type of card. * 
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
e910: 63 6f 6e 6e 65 63 74 65 64 0a 20 2a 0a 20 2a 20  connected. *. * 
e920: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
e930: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 65 6c  s function resel
e940: 65 63 74 73 20 74 68 65 20 22 72 6f 6f 74 22 20  ects the "root" 
e950: 61 70 70 6c 65 74 2c 20 61 66 74 65 72 20 74 68  applet, after th
e960: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
e970: 61 6c 6c 65 64 0a 20 2a 20 20 20 20 20 74 68 65  alled. *     the
e980: 20 75 73 65 72 20 6d 61 79 20 62 65 20 72 65 71   user may be req
e990: 75 69 72 65 64 20 74 6f 20 6c 6f 67 69 6e 20 61  uired to login a
e9a0: 67 61 69 6e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  gain. *. */.stat
e9b0: 69 63 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ic cackey_pcsc_i
e9c0: 64 5f 74 79 70 65 20 63 61 63 6b 65 79 5f 64 65  d_type cackey_de
e9d0: 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f  tect_and_select_
e9e0: 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 74 72 75  root_applet(stru
e9f0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
ea00: 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 70 63 73  slot, cackey_pcs
ea10: 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f 68  c_id_type type_h
ea20: 69 6e 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  int) {..unsigned
ea30: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
ea40: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
ea50: 7d 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b  }, piv_aid[] = {
ea60: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50  NISTSP800_73_3_P
ea70: 49 56 5f 41 49 44 7d 3b 0a 09 63 61 63 6b 65 79  IV_AID};..cackey
ea80: 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 74 72  _pcsc_id_type tr
ea90: 79 5f 74 79 70 65 73 5b 32 5d 2c 20 74 72 79 5f  y_types[2], try_
eaa0: 74 79 70 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  type;..int send_
eab0: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ret;..int idx;..
eac0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ead0: 49 4e 54 46 28 22 52 65 73 65 6c 65 63 74 69 6e  INTF("Reselectin
eae0: 67 20 74 68 65 20 72 6f 6f 74 20 61 70 70 6c 65  g the root apple
eaf0: 74 22 29 3b 0a 0a 09 69 66 20 28 74 79 70 65 5f  t");...if (type_
eb00: 68 69 6e 74 20 3d 3d 20 43 41 43 4b 45 59 5f 49  hint == CACKEY_I
eb10: 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 20  D_TYPE_UNKNOWN) 
eb20: 7b 0a 09 09 74 79 70 65 5f 68 69 6e 74 20 3d 20  {...type_hint = 
eb30: 73 6c 6f 74 2d 3e 69 64 5f 74 79 70 65 5f 68 69  slot->id_type_hi
eb40: 6e 74 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 69  nt;..}...slot->i
eb50: 64 5f 74 79 70 65 5f 68 69 6e 74 20 3d 20 43 41  d_type_hint = CA
eb60: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b  CKEY_ID_TYPE_UNK
eb70: 4e 4f 57 4e 3b 0a 0a 09 73 77 69 74 63 68 20 28  NOWN;...switch (
eb80: 74 79 70 65 5f 68 69 6e 74 29 20 7b 0a 09 09 63  type_hint) {...c
eb90: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
eba0: 50 45 5f 50 49 56 3a 0a 09 09 09 43 41 43 4b 45  PE_PIV:....CACKE
ebb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ebc0: 54 72 79 69 6e 67 20 74 6f 20 72 65 73 65 6c 65  Trying to resele
ebd0: 63 74 20 74 68 65 20 50 49 56 20 72 6f 6f 74 20  ct the PIV root 
ebe0: 61 70 70 6c 65 74 20 66 69 72 73 74 22 29 3b 0a  applet first");.
ebf0: 0a 09 09 09 74 72 79 5f 74 79 70 65 73 5b 30 5d  ....try_types[0]
ec00: 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
ec10: 45 5f 50 49 56 3b 0a 09 09 09 74 72 79 5f 74 79  E_PIV;....try_ty
ec20: 70 65 73 5b 31 5d 20 3d 20 43 41 43 4b 45 59 5f  pes[1] = CACKEY_
ec30: 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 0a 09 09  ID_TYPE_CAC;....
ec40: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
ec50: 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
ec60: 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e  UG_PRINTF("Tryin
ec70: 67 20 74 6f 20 72 65 73 65 6c 65 63 74 20 74 68  g to reselect th
ec80: 65 20 43 41 43 20 43 43 43 20 61 70 70 6c 65 74  e CAC CCC applet
ec90: 20 66 69 72 73 74 22 29 3b 0a 0a 09 09 09 74 72   first");.....tr
eca0: 79 5f 74 79 70 65 73 5b 30 5d 20 3d 20 43 41 43  y_types[0] = CAC
ecb0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b  KEY_ID_TYPE_CAC;
ecc0: 0a 09 09 09 74 72 79 5f 74 79 70 65 73 5b 31 5d  ....try_types[1]
ecd0: 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
ece0: 45 5f 50 49 56 3b 0a 0a 09 09 09 62 72 65 61 6b  E_PIV;.....break
ecf0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
ed00: 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
ed10: 6f 66 28 74 72 79 5f 74 79 70 65 73 29 20 2f 20  of(try_types) / 
ed20: 73 69 7a 65 6f 66 28 74 72 79 5f 74 79 70 65 73  sizeof(try_types
ed30: 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
ed40: 09 09 74 72 79 5f 74 79 70 65 20 3d 20 74 72 79  ..try_type = try
ed50: 5f 74 79 70 65 73 5b 69 64 78 5d 3b 0a 0a 09 09  _types[idx];....
ed60: 73 77 69 74 63 68 20 28 74 72 79 5f 74 79 70 65  switch (try_type
ed70: 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
ed80: 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
ed90: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
eda0: 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20  _PRINTF("Trying 
edb0: 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 43 41  to select the CA
edc0: 43 20 43 43 43 20 61 70 70 6c 65 74 22 29 3b 0a  C CCC applet");.
edd0: 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  .....send_ret = 
ede0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
edf0: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
ee00: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
ee10: 69 64 29 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  id));......break
ee20: 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
ee30: 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
ee40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ee50: 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f  RINTF("Trying to
ee60: 20 73 65 6c 65 63 74 20 74 68 65 20 50 49 56 20   select the PIV 
ee70: 72 6f 6f 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a  root applet");..
ee80: 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
ee90: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
eea0: 6c 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69  let(slot, piv_ai
eeb0: 64 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69  d, sizeof(piv_ai
eec0: 64 29 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  d));......break;
eed0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
eee0: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
eef0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
ef00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ef10: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
ef20: 20 73 65 6c 65 63 74 65 64 20 74 68 65 20 25 73   selected the %s
ef30: 20 61 70 70 6c 65 74 20 2d 2d 20 73 65 74 74 69   applet -- setti
ef40: 6e 67 20 74 68 65 20 5c 22 4c 4f 47 49 4e 20 52  ng the \"LOGIN R
ef50: 45 51 55 49 52 45 44 5c 22 20 66 6c 61 67 20 6f  EQUIRED\" flag o
ef60: 6e 20 74 68 65 20 74 6f 6b 65 6e 22 2c 0a 09 09  n the token",...
ef70: 09 09 74 72 79 5f 74 79 70 65 20 3d 3d 20 43 41  ..try_type == CA
ef80: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
ef90: 20 3f 20 22 43 41 43 22 20 3a 20 22 50 49 56 22   ? "CAC" : "PIV"
efa0: 0a 09 09 09 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d  ....);.....slot-
efb0: 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  >token_flags = C
efc0: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
efd0: 44 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 69 64 5f  D;.....slot->id_
efe0: 74 79 70 65 5f 68 69 6e 74 20 3d 20 74 72 79 5f  type_hint = try_
eff0: 74 79 70 65 3b 0a 0a 09 09 09 72 65 74 75 72 6e  type;.....return
f000: 28 74 72 79 5f 74 79 70 65 29 3b 0a 09 09 7d 0a  (try_type);...}.
f010: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
f020: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
f030: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 79 20 61   to select any a
f040: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  pplet, returning
f050: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
f060: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 49  .return(CACKEY_I
f070: 44 5f 54 59 50 45 5f 45 52 52 4f 52 29 3b 0a 7d  D_TYPE_ERROR);.}
f080: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
f090: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
f0a0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
f0b0: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
f0c0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
f0d0: 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a  uint16_t ef);. *
f0e0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
f0f0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
f100: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
f110: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
f120: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
f130: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74  o. *. *     uint
f140: 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20  16_t ef. *      
f150: 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c     Elemental Fil
f160: 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  e to select. *. 
f170: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
f180: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
f190: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
f1a0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
f1b0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
f1c0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
f1d0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
f1e0: 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63  *     This selec
f1f0: 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79  ts an Elementary
f200: 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72   File (EF) under
f210: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73   the currently s
f220: 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44  elected. *     D
f230: 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44  edicated File (D
f240: 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70  F). *. *     Typ
f250: 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63  ically this is c
f260: 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65  alled after sele
f270: 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63  cting the correc
f280: 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a  t Applet (using.
f290: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65   *     cackey_se
f2a0: 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72  lect_applet) for
f2b0: 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f   VM cards. *. */
f2c0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
f2d0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
f2e0: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
f2f0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
f300: 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09  uint16_t ef) {..
f310: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69  unsigned char fi
f320: 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73  d_buf[2];..int s
f330: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
f340: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f350: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20  Called.");.../* 
f360: 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74  Open the element
f370: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64  ary file */..fid
f380: 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e  _buf[0] = (ef >>
f390: 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64   8) & 0xff;..fid
f3a0: 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30  _buf[1] = ef & 0
f3b0: 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  xff;...CACKEY_DE
f3c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65  BUG_PRINTF("Sele
f3d0: 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c  cting file: %04l
f3e0: 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  x", (unsigned lo
f3f0: 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f  ng) ef);...send_
f400: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
f410: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
f420: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
f430: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
f440: 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43  LECT, 0x02, 0x0C
f450: 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66  , sizeof(fid_buf
f460: 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30  ), fid_buf, 0x00
f470: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
f480: 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  LL);..if (send_r
f490: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
f4a0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
f4b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f4c0: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
f4d0: 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  file, returning 
f4e0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
f4f0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
f500: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
f510: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
f520: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
f530: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
f540: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
f550: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
f560: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
f570: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
f580: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  d cackey_free_tl
f590: 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  v(struct cackey_
f5a0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
f5b0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
f5c0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
f5d0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
f5e0: 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20  ty *root. *     
f5f0: 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20      Root of the 
f600: 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72  TLV list to star
f610: 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20  t freeing. *. * 
f620: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
f630: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
f640: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
f650: 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20   function frees 
f660: 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c  the TLV linked l
f670: 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66  isted returned f
f680: 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b  rom. *     "cack
f690: 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a  ey_read_tlv". *.
f6a0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
f6b0: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
f6c0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
f6d0: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20  v_entity *root) 
f6e0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
f6f0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72  _tlv_entity *cur
f700: 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28  r, *next;...if (
f710: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
f720: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
f730: 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b  or (curr = root;
f740: 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65   curr; curr = ne
f750: 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63  xt) {...next = c
f760: 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73  urr->_next;....s
f770: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67  witch (curr->tag
f780: 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ) {....case GSCI
f790: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a  S_TAG_ACR_TABLE:
f7a0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
f7b0: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
f7c0: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
f7d0: 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65  lue) {......free
f7e0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09  (curr->value);..
f7f0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
f800: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
f810: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69  G_CARDURL:.....i
f820: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  f (curr->value_c
f830: 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66  ardurl) {......f
f840: 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ree(curr->value_
f850: 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a  cardurl);.....}.
f860: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
f870: 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d  ..free(curr);..}
f880: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
f890: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
f8a0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
f8b0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
f8c0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
f8d0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
f8e0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
f8f0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
f900: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
f910: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
f920: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
f930: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
f940: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72  ot *slot) {..str
f950: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
f960: 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69  ntity *curr_enti
f970: 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c  ty, *root = NULL
f980: 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a  , *last = NULL;.
f990: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
f9a0: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c  len_buf[2], tval
f9b0: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61  _buf[1024], *tva
f9c0: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
f9d0: 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76  r vlen_buf[2], v
f9e0: 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a  val_buf[8192], *
f9f0: 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20  vval;..unsigned 
fa00: 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75  char *tmpbuf;..u
fa10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70  nsigned long tmp
fa20: 62 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74  buflen;..ssize_t
fa30: 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73   tlen, vlen;..ss
fa40: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
fa50: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74  .size_t offset_t
fa60: 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d   = 0, offset_v =
fa70: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   0;..unsigned ch
fa80: 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20  ar tag;..size_t 
fa90: 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48  length;.#ifdef H
faa0: 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e  AVE_LIBZ..int un
fab0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65  compress_ret;.#e
fac0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
fad0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
fae0: 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65  ed.");...read_re
faf0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
fb00: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65  buffer(slot, tle
fb10: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c  n_buf, sizeof(tl
fb20: 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73  en_buf), 1, offs
fb30: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
fb40: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74  _ret != sizeof(t
fb50: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
fb60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fb70: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
fb80: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
fb90: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
fba0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c  n(NULL);..}...tl
fbb0: 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31  en = (tlen_buf[1
fbc0: 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62  ] << 8) | tlen_b
fbd0: 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65  uf[0];...read_re
fbe0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
fbf0: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65  buffer(slot, vle
fc00: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c  n_buf, sizeof(vl
fc10: 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73  en_buf), 2, offs
fc20: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
fc30: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76  _ret != sizeof(v
fc40: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
fc50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fc60: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
fc70: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
fc80: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
fc90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c  n(NULL);..}...vl
fca0: 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31  en = (vlen_buf[1
fcb0: 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62  ] << 8) | vlen_b
fcc0: 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f  uf[0];...CACKEY_
fcd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
fce0: 67 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  g Length = %lu, 
fcf0: 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25  Value Length = %
fd00: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
fd10: 6f 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69  ong) tlen, (unsi
fd20: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29  gned long) vlen)
fd30: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
fd40: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
fd50: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
fd60: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
fd70: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
fd80: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
fd90: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
fda0: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
fdb0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
fdc0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
fdd0: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
fde0: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
fdf0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fe00: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
fe10: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
fe20: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
fe30: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
fe40: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
fe50: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
fe60: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
fe70: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
fe80: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
fe90: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
fea0: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
feb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fec0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
fed0: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
fee0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
fef0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
ff00: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
ff10: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
ff20: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
ff30: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
ff40: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
ff50: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
ff60: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
ff70: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ff80: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
ff90: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
ffa0: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
ffb0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
ffc0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
ffd0: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
ffe0: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
fff0: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
10000 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
10010 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
10020 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
10030 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
10040 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
10050 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
10060 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
10070 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
10080 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
10090 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
100a0 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
100b0 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
100c0 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
100d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
100e0 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
100f0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
10100 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
10110 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
10120 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
10130 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
10140 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
10150 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
10160 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
10170 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
10180 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
10190 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
101a0 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
101b0 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
101c0 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
101d0 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
101e0 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
101f0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
10200 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
10210 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
10220 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
10230 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
10240 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
10250 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
10260 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
10270 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
10280 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
10290 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
102a0 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
102b0 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
102c0 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
102d0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
102e0 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
102f0 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
10300 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
10310 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
10320 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
10330 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
10340 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
10350 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
10360 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
10370 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
10380 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
10390 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
103a0 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
103b0 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
103c0 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
103d0 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
103e0 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
103f0 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
10400 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
10410 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
10420 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10430 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
10440 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
10450 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
10460 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10470 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
10480 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
10490 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
104a0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
104b0 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66  r_entity));..#if
104c0 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
104d0 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
104e0 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d  ngth * 2;.....tm
104f0 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
10500 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75  pbuflen);......u
10510 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
10520 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
10530 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
10540 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
10550 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
10560 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
10570 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10580 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
10590 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
105a0 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
105b0 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
105c0 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
105d0 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
105e0 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
105f0 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
10600 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
10610 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
10620 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
10630 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10640 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
10650 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
10660 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
10670 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
10680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
10690 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
106a0 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
106b0 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
106c0 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
106d0 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
106e0 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
106f0 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
10700 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
10710 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
10720 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
10730 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
10740 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
10750 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
10760 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
10770 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10780 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
10790 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
107a0 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
107b0 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
107c0 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
107d0 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
107e0 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
107f0 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
10800 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
10810 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
10820 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
10830 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
10840 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
10850 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
10860 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
10870 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
10880 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
10890 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
108a0 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
108b0 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
108c0 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
108d0 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
108e0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
108f0 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
10900 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
10910 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
10920 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
10930 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
10940 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
10950 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
10960 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
10970 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
10980 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
10990 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
109a0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
109b0 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
109c0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
109d0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
109e0 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
109f0 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
10a00 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
10a10 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
10a20 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c  if (start == NUL
10a30 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
10a40 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
10a50 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
10a60 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74  dx++) {...if (st
10a70 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
10a80 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28  cate) {....free(
10a90 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
10aa0 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a  ficate);...}..}.
10ab0 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74  ..if (free_start
10ac0 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74  ) {...free(start
10ad0 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
10ae0 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
10af0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
10b00 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f  ntity *cackey_co
10b10 70 79 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  py_certs(struct 
10b20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
10b30 74 69 74 79 20 2a 64 65 73 74 2c 20 73 74 72 75  tity *dest, stru
10b40 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
10b50 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20  dentity *start, 
10b60 73 69 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a  size_t count) {.
10b70 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69  .size_t idx;...i
10b80 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (start == NULL
10b90 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  ) {...return(NUL
10ba0 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73  L);..}...if (des
10bb0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64  t == NULL) {...d
10bc0 65 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  est = malloc(siz
10bd0 65 6f 66 28 2a 64 65 73 74 29 20 2a 20 63 6f 75  eof(*dest) * cou
10be0 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  nt);..}...for (i
10bf0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f  dx = 0; idx < co
10c00 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
10c10 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70  dest[idx].id_typ
10c20 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 69  e = start[idx].i
10c30 64 5f 74 79 70 65 3b 0a 0a 09 09 73 77 69 74 63  d_type;....switc
10c40 68 20 28 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f  h (dest[idx].id_
10c50 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
10c60 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
10c70 41 43 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28 64  AC:.....memcpy(d
10c80 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  est[idx].card.ca
10c90 63 2e 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b  c.applet, start[
10ca0 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70  idx].card.cac.ap
10cb0 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73  plet, sizeof(des
10cc0 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
10cd0 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 64 65  applet));.....de
10ce0 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  st[idx].card.cac
10cf0 2e 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64  .file = start[id
10d00 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  x].card.cac.file
10d10 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
10d20 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
10d30 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 64 65 73  YPE_PIV:.....des
10d40 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
10d50 6b 65 79 5f 69 64 20 3d 20 73 74 61 72 74 5b 69  key_id = start[i
10d60 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
10d70 5f 69 64 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  _id;.....memcpy(
10d80 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  dest[idx].card.p
10d90 69 76 2e 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b  iv.label, start[
10da0 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61  idx].card.piv.la
10db0 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 73 74  bel, sizeof(dest
10dc0 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c  [idx].card.piv.l
10dd0 61 62 65 6c 29 29 3b 0a 09 09 09 09 62 72 65 61  abel));.....brea
10de0 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45  k;....case CACKE
10df0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
10e00 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  NLY:.....break;.
10e10 09 09 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e  ..}...dest[idx].
10e20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
10e30 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72  = start[idx].cer
10e40 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09  tificate_len;...
10e50 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a  dest[idx].keysiz
10e60 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b  e = start[idx].k
10e70 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b  eysize;....dest[
10e80 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10e90 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69   = malloc(dest[i
10ea0 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
10eb0 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64  len);...memcpy(d
10ec0 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
10ed0 63 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d  cate, start[idx]
10ee0 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 64 65  .certificate, de
10ef0 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
10f00 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  ate_len);..}...r
10f10 65 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a  eturn(dest);.}..
10f20 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
10f30 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
10f40 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
10f50 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
10f60 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
10f70 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
10f80 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
10f90 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
10fa0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
10fb0 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
10fc0 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
10fd0 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
10fe0 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
10ff0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65  csc_identity *ce
11000 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  rts, unsigned lo
11010 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 63 61  ng *count) {..ca
11020 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
11030 65 20 63 68 65 63 6b 5f 69 64 5f 74 79 70 65 3b  e check_id_type;
11040 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
11050 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
11060 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20  urr_id;..struct 
11070 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
11080 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63  y *ccc_tlv, *ccc
11090 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c  _curr, *app_tlv,
110a0 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73   *app_curr;..uns
110b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 76 5f  igned char *piv_
110c0 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76  oid, piv_oid_piv
110d0 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  auth[] = {NISTSP
110e0 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56  800_73_3_OID_PIV
110f0 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73  AUTH}, piv_oid_s
11100 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49  ignature[] = {NI
11110 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44  STSP800_73_3_OID
11120 5f 53 49 47 4e 41 54 55 52 45 7d 2c 20 70 69 76  _SIGNATURE}, piv
11130 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20  _oid_keymgt[] = 
11140 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
11150 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e  OID_KEYMGT};..un
11160 73 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72  signed char curr
11170 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e  _aid[7];..unsign
11180 65 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 38  ed char buffer[8
11190 31 39 32 5d 2c 20 2a 62 75 66 66 65 72 5f 70 2c  192], *buffer_p,
111a0 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67   *tmpbuf;..unsig
111b0 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20  ned long outidx 
111c0 3d 20 30 3b 0a 09 63 68 61 72 20 2a 70 69 76 5f  = 0;..char *piv_
111d0 6c 61 62 65 6c 3b 0a 09 63 61 63 6b 65 79 5f 72  label;..cackey_r
111e0 65 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  et transaction_r
111f0 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  et;..ssize_t rea
11200 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62  d_ret;..size_t b
11210 75 66 66 65 72 5f 6c 65 6e 2c 20 74 6d 70 62 75  uffer_len, tmpbu
11220 66 6c 65 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73  flen;..int certs
11230 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74  _resizable;..int
11240 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63   send_ret, selec
11250 74 5f 72 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f  t_ret;..int piv_
11260 6b 65 79 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69  key, piv = 0;..i
11270 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f  nt cached_certs_
11280 76 61 6c 69 64 3b 0a 09 69 6e 74 20 69 64 78 3b  valid;..int idx;
11290 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  ..cackey_pcsc_id
112a0 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b 0a 23  _type id_type;.#
112b0 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
112c0 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
112d0 72 65 74 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67  ret;..z_stream g
112e0 7a 69 70 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64  zip_stream;.#end
112f0 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
11300 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
11310 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74  .");...if (count
11320 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11340 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  F("count is NULL
11350 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
11360 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
11370 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
11380 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c  if (certs != NUL
11390 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e  L) {...if (*coun
113a0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t == 0) {....CAC
113b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
113c0 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72  ("Requested we r
113d0 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c  eturn 0 objects,
113e0 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29   short-circuit")
113f0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72  ;.....return(cer
11400 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  ts);...}..}...ca
11410 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64  ched_certs_valid
11420 20 3d 20 30 3b 0a 09 69 66 20 28 21 73 6c 6f 74   = 0;..if (!slot
11430 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ->slot_reset) {.
11440 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
11450 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63  ed_certs) {....c
11460 61 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69  ached_certs_vali
11470 64 20 3d 20 31 3b 0a 0a 09 09 09 69 66 20 28 73  d = 1;.....if (s
11480 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
11490 73 5f 63 6f 75 6e 74 20 3e 20 30 29 20 7b 0a 09  s_count > 0) {..
114a0 09 09 09 63 61 63 68 65 64 5f 63 65 72 74 73 5f  ...cached_certs_
114b0 76 61 6c 69 64 20 3d 20 31 3b 0a 09 09 09 7d 0a  valid = 1;....}.
114c0 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  ..}..}...if (cac
114d0 68 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 29  hed_certs_valid)
114e0 20 7b 0a 09 09 69 66 20 28 63 65 72 74 73 20 3d   {...if (certs =
114f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 65 72  = NULL) {....cer
11500 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ts = malloc(size
11510 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f  of(*certs) * slo
11520 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
11530 63 6f 75 6e 74 29 3b 0a 09 09 09 2a 63 6f 75 6e  count);....*coun
11540 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  t = slot->cached
11550 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09  _certs_count;...
11560 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 66 20 28  } else {....if (
11570 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63  *count > slot->c
11580 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
11590 74 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e 74 20  t) {.....*count 
115a0 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  = slot->cached_c
115b0 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 09 7d  erts_count;....}
115c0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 63  ...}....cackey_c
115d0 6f 70 79 5f 63 65 72 74 73 28 63 65 72 74 73 2c  opy_certs(certs,
115e0 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65   slot->cached_ce
115f0 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09  rts, *count);...
11600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11610 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
11620 63 61 63 68 65 64 20 63 65 72 74 69 66 69 63 61  cached certifica
11630 74 65 73 20 66 6f 72 20 74 68 69 73 20 73 6c 6f  tes for this slo
11640 74 20 28 63 61 72 64 20 68 61 73 20 6e 6f 74 20  t (card has not 
11650 62 65 65 6e 20 72 65 73 65 74 20 61 6e 64 20 74  been reset and t
11660 68 65 72 65 20 61 72 65 20 63 61 63 68 65 64 20  here are cached 
11670 63 65 72 74 73 20 61 76 61 69 6c 61 62 6c 65 29  certs available)
11680 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 65  ");....return(ce
11690 72 74 73 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  rts);..}...if (s
116a0 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
116b0 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 66 72  s) {...cackey_fr
116c0 65 65 5f 63 65 72 74 73 28 73 6c 6f 74 2d 3e 63  ee_certs(slot->c
116d0 61 63 68 65 64 5f 63 65 72 74 73 2c 20 73 6c 6f  ached_certs, slo
116e0 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
116f0 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 73 6c  count, 1);....sl
11700 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
11710 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a   = NULL;..}.../*
11720 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43 61   Begin a SmartCa
11730 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd transaction *
11740 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  /..transaction_r
11750 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 69  et = cackey_begi
11760 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
11770 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 61  ot);..if (transa
11780 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43  ction_ret != CAC
11790 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
117a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
117b0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 62  PRINTF("Unable b
117c0 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
117d0 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
117e0 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
117f0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
11800 69 64 5f 74 79 70 65 20 3d 20 63 61 63 6b 65 79  id_type = cackey
11810 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65  _detect_and_sele
11820 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73  ct_root_applet(s
11830 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54  lot, CACKEY_ID_T
11840 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09  YPE_UNKNOWN);...
11850 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
11860 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
11870 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
11880 09 70 69 76 20 3d 20 30 3b 0a 0a 09 09 09 62 72  .piv = 0;.....br
11890 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b  eak;...case CACK
118a0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
118b0 09 09 09 70 69 76 20 3d 20 31 3b 0a 0a 09 09 09  ...piv = 1;.....
118c0 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
118d0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52  CKEY_ID_TYPE_ERR
118e0 4f 52 3a 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e  OR:..../* Termin
118f0 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
11900 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
11910 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
11920 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
11930 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
11940 55 4c 4c 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e  ULL) {.....*coun
11950 74 20 3d 20 30 3b 0a 09 09 09 7d 0a 0a 09 09 09  t = 0;....}.....
11960 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09  return(NULL);...
11970 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
11980 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
11990 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 43 41 43  ERT_ONLY:....CAC
119a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
119b0 28 22 45 72 72 6f 72 2e 20 20 49 6d 70 6f 73 73  ("Error.  Imposs
119c0 69 62 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 20 72  ible condition r
119d0 65 61 63 68 65 64 2e 22 29 3b 0a 0a 09 09 09 62  eached.");.....b
119e0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  reak;..}...if (c
119f0 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  erts == NULL) {.
11a00 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
11a10 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
11a20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d  * 5);...*count =
11a30 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69   5;...certs_resi
11a40 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c  zable = 1;..} el
11a50 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73  se {...certs_res
11a60 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a  izable = 0;..}..
11a70 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f  .if (piv) {...fo
11a80 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
11a90 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  < 3; idx++) {...
11aa0 09 73 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a  .switch (idx) {.
11ab0 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09  ....case 0:.....
11ac0 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f  .piv_oid = piv_o
11ad0 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09  id_pivauth;.....
11ae0 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53  .piv_key = NISTS
11af0 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49  P800_78_3_KEY_PI
11b00 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f  VAUTH;......piv_
11b10 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74  label = "Authent
11b20 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62  ication";......b
11b30 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31  reak;.....case 1
11b40 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
11b50 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75   piv_oid_signatu
11b60 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79  re;......piv_key
11b70 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f   = NISTSP800_78_
11b80 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b  3_KEY_SIGNATURE;
11b90 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20  ......piv_label 
11ba0 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09  = "Signature";..
11bb0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63  ....break;.....c
11bc0 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f  ase 2:......piv_
11bd0 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65  oid = piv_oid_ke
11be0 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ymgt;......piv_k
11bf0 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
11c00 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a  8_3_KEY_KEYMGT;.
11c10 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d  .....piv_label =
11c20 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74   "Key Management
11c30 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ";......break;..
11c40 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74  ..}.....read_ret
11c50 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61   = cackey_get_da
11c60 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c  ta(slot, buffer,
11c70 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c   sizeof(buffer),
11c80 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69   piv_oid);.....i
11c90 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  f (read_ret <= 0
11ca0 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
11cb0 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f  ;....}.....curr_
11cc0 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
11cd0 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b  dx];....outidx++
11ce0 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b  ;.....curr_id->k
11cf0 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09  eysize = -1;....
11d00 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65  curr_id->id_type
11d10 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
11d20 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69  E_PIV;....curr_i
11d30 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f  d->card.piv.key_
11d40 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09  id = piv_key;...
11d50 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
11d60 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c  >card.piv.label,
11d70 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c   piv_label, strl
11d80 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20  en(piv_label) + 
11d90 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  1);.....curr_id-
11da0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
11db0 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09   = read_ret;....
11dc0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11dd0 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
11de0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11df0 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66  te_len);.....buf
11e00 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  fer_len = sizeof
11e10 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66  (buffer);....buf
11e20 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72  fer_p = cackey_r
11e30 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62  ead_bertlv_tag(b
11e40 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c  uffer, &buffer_l
11e50 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69  en, 0x70, curr_i
11e60 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
11e70 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  &curr_id->certif
11e80 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
11e90 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20  if (buffer_p == 
11ea0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
11eb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11ec0 22 52 65 61 64 69 6e 67 20 63 65 72 74 69 66 69  "Reading certifi
11ed0 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c  cate from BER-TL
11ee0 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65  V response faile
11ef0 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20  d, skipping key 
11f00 25 69 22 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09  %i", idx);......
11f10 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65  free(curr_id->ce
11f20 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09  rtificate);.....
11f30 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
11f40 69 63 61 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  icate = NULL;...
11f50 09 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09  ...outidx--;....
11f60 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11f70 0a 0a 09 09 09 69 66 20 28 63 75 72 72 5f 69 64  .....if (curr_id
11f80 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
11f90 6e 20 3e 20 34 29 20 7b 0a 09 09 09 09 69 66 20  n > 4) {.....if 
11fa0 28 6d 65 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d  (memcmp(curr_id-
11fb0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 22 5c  >certificate, "\
11fc0 78 31 66 5c 78 38 62 5c 78 30 38 5c 78 30 30 22  x1f\x8b\x08\x00"
11fd0 2c 20 34 29 20 3d 3d 20 30 29 20 7b 0a 23 69 66  , 4) == 0) {.#if
11fe0 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
11ff0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63  ...tmpbuflen = c
12000 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12010 61 74 65 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09  ate_len * 2;....
12020 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
12030 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  c(tmpbuflen);...
12040 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12050 5f 50 52 49 4e 54 42 55 46 28 22 41 74 74 65 6d  _PRINTBUF("Attem
12060 70 74 69 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72  pting to decompr
12070 65 73 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e  ess:", curr_id->
12080 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 75 72  certificate, cur
12090 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
120a0 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a  e_len);.......gz
120b0 69 70 5f 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63  ip_stream.zalloc
120c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a   = NULL;......gz
120d0 69 70 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20  ip_stream.zfree 
120e0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69  = NULL;......gzi
120f0 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20  p_stream.opaque 
12100 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a  = NULL;.......gz
12110 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69  ip_stream.next_i
12120 6e 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65  n  = curr_id->ce
12130 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09  rtificate;......
12140 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69  gzip_stream.avai
12150 6c 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e  l_in = curr_id->
12160 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
12170 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61  ......gzip_strea
12180 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70  m.next_out = tmp
12190 62 75 66 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73  buf;......gzip_s
121a0 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20  tream.avail_out 
121b0 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09  = tmpbuflen;....
121c0 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
121d0 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 28  t = inflateInit(
121e0 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09  &gzip_stream);..
121f0 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65  ....if (uncompre
12200 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20  ss_ret == Z_OK) 
12210 7b 0a 09 09 09 09 09 09 2f 2a 20 54 72 79 20 61  {......./* Try a
12220 67 61 69 6e 20 61 73 20 61 20 67 7a 69 70 20 62  gain as a gzip b
12230 75 66 66 65 72 20 2a 2f 0a 09 09 09 09 09 09 75  uffer */.......u
12240 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
12250 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69 70  inflateEnd(&gzip
12260 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09 09  _stream);.......
12270 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72  if (uncompress_r
12280 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09  et == Z_OK) {...
12290 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
122a0 2e 7a 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a  .zalloc = NULL;.
122b0 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
122c0 61 6d 2e 7a 66 72 65 65 20 3d 20 4e 55 4c 4c 3b  am.zfree = NULL;
122d0 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72  ........gzip_str
122e0 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c  eam.opaque = NUL
122f0 4c 3b 0a 0a 09 09 09 09 09 09 09 67 7a 69 70 5f  L;.........gzip_
12300 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20  stream.next_in  
12310 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  = curr_id->certi
12320 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09 09 67  ficate;........g
12330 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c  zip_stream.avail
12340 5f 69 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63  _in = curr_id->c
12350 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
12360 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  .......gzip_stre
12370 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d  am.next_out = tm
12380 70 62 75 66 3b 0a 09 09 09 09 09 09 09 67 7a 69  pbuf;........gzi
12390 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f  p_stream.avail_o
123a0 75 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  ut = tmpbuflen;.
123b0 09 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  .......uncompres
123c0 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 49  s_ret = inflateI
123d0 6e 69 74 32 28 26 67 7a 69 70 5f 73 74 72 65 61  nit2(&gzip_strea
123e0 6d 2c 20 33 31 29 3b 0a 09 09 09 09 09 09 7d 0a  m, 31);.......}.
123f0 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28  .....}......if (
12400 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
12410 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09  = Z_OK) {.......
12420 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
12430 20 69 6e 66 6c 61 74 65 28 26 67 7a 69 70 5f 73   inflate(&gzip_s
12440 74 72 65 61 6d 2c 20 30 29 3b 0a 09 09 09 09 09  tream, 0);......
12450 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  }......if (uncom
12460 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 53  press_ret == Z_S
12470 54 52 45 41 4d 5f 45 4e 44 29 20 7b 0a 09 09 09  TREAM_END) {....
12480 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
12490 74 20 3d 20 69 6e 66 6c 61 74 65 45 6e 64 28 26  t = inflateEnd(&
124a0 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09  gzip_stream);...
124b0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
124c0 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  ..uncompress_ret
124d0 20 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b   = Z_DATA_ERROR;
124e0 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20  ......}......if 
124f0 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  (uncompress_ret 
12500 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09  == Z_OK) {......
12510 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 67 7a 69  .tmpbuflen = gzi
12520 70 5f 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f  p_stream.total_o
12530 75 74 3b 0a 0a 09 09 09 09 09 09 43 41 43 4b 45  ut;........CACKE
12540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12550 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74  ("Decompressed t
12560 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  o:", tmpbuf, tmp
12570 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 09  buflen);........
12580 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65  free(curr_id->ce
12590 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09  rtificate);.....
125a0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
125b0 69 66 69 63 61 74 65 20 3d 20 74 6d 70 62 75 66  ificate = tmpbuf
125c0 3b 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d  ;.......curr_id-
125d0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
125e0 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09   = tmpbuflen;...
125f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
12600 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12610 52 49 4e 54 46 28 22 44 65 63 6f 6d 70 72 65 73  RINTF("Decompres
12620 73 69 6e 67 20 66 61 69 6c 65 64 21 20 75 6e 63  sing failed! unc
12630 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
12640 65 64 20 25 69 22 2c 20 75 6e 63 6f 6d 70 72 65  ed %i", uncompre
12650 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 09  ss_ret);........
12660 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09 09  free(tmpbuf);...
12670 09 09 09 7d 0a 23 65 6c 73 65 0a 09 09 09 09 09  ...}.#else......
12680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12690 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20  NTF("Error.  We 
126a0 67 6f 74 20 61 20 63 6f 6d 70 72 65 73 73 65 64  got a compressed
126b0 20 63 65 72 74 69 66 69 63 61 74 65 20 62 75 74   certificate but
126c0 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
126d0 7a 6c 69 62 2e 20 20 48 6f 70 69 6e 67 20 66 6f  zlib.  Hoping fo
126e0 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a 23  r the best.");.#
126f0 65 6e 64 69 66 0a 09 09 09 09 7d 0a 09 09 09 7d  endif.....}....}
12700 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
12710 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65  ./* Read all the
12720 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68   applets from th
12730 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09  e CCC's TLV */..
12740 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65  .ccc_tlv = cacke
12750 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29  y_read_tlv(slot)
12760 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  ;..../* Look for
12770 20 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63   CARDURLs that c
12780 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49  oorespond to PKI
12790 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f   applets */...fo
127a0 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r (ccc_curr = cc
127b0 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b  c_tlv; ccc_curr;
127c0 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f   ccc_curr = ccc_
127d0 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09  curr->_next) {..
127e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
127f0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67  RINTF("Found tag
12800 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b  : %s ... ", CACK
12810 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
12820 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  G_TO_STR(ccc_cur
12830 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66  r->tag));.....if
12840 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20   (ccc_curr->tag 
12850 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  != GSCIS_TAG_CAR
12860 44 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  DURL) {.....CACK
12870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12880 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
12890 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
128a0 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29   about CARDURLs)
128b0 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
128c0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
128d0 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
128e0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
128f0 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  e & CACKEY_TLV_A
12900 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45  PP_PKI) != CACKE
12910 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b  Y_TLV_APP_PKI) {
12920 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12930 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
12940 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20  skipping it (we 
12950 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
12960 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69  PKI applets, thi
12970 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74  s applet support
12980 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41  s: %s/%02x)", CA
12990 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
129a0 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63  APPTYPE_TO_STR(c
129b0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
129c0 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
129d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
129e0 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
129f0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
12a00 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  e);......continu
12a10 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  e;....}.....CACK
12a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
12a30 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75  F("RID:", ccc_cu
12a40 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12a50 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
12a60 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12a70 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
12a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12a90 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25  RINTF("AppID = %
12aa0 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
12ab0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
12ac0 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
12ad0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12ae0 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67  ->appid), (unsig
12af0 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
12b00 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12b10 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41  l->appid);....CA
12b20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12b30 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73  F("ObjectID = %s
12b40 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
12b50 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
12b60 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
12b70 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
12b80 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73  >objectid), (uns
12b90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
12ba0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
12bb0 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a  url->objectid);.
12bc0 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
12bd0 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  aid, ccc_curr->v
12be0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
12bf0 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
12c00 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12c10 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72  l->rid));....cur
12c20 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
12c30 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63  r_aid) - 2] = (c
12c40 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12c50 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e  ardurl->appid >>
12c60 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63   8) & 0xff;....c
12c70 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63  urr_aid[sizeof(c
12c80 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20  urr_aid) - 1] = 
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 20 26  cardurl->appid &
12cb0 20 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65   0xff;...../* Se
12cc0 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65  lect found apple
12cd0 74 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65  t ... */....sele
12ce0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
12cf0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
12d00 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  ot, curr_aid, si
12d10 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b  zeof(curr_aid));
12d20 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ....if (select_r
12d30 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
12d40 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  C_S_OK) {.....CA
12d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12d60 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c  F("Failed to sel
12d70 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70  ect applet, skip
12d80 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
12d90 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
12da0 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
12db0 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e  ....}...../* ...
12dc0 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c   and object (fil
12dd0 65 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f  e) */....select_
12de0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
12df0 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63  ect_file(slot, c
12e00 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12e10 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
12e20 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74  );....if (select
12e30 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
12e40 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
12e50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12e60 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
12e70 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70  elect file, skip
12e80 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
12e90 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
12ea0 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
12eb0 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f  ....}...../* Pro
12ec0 63 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73  cess this file's
12ed0 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   TLV looking for
12ee0 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
12ef0 0a 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61  ....app_tlv = ca
12f00 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c  ckey_read_tlv(sl
12f10 6f 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61  ot);......for (a
12f20 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c  pp_curr = app_tl
12f30 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70  v; app_curr; app
12f40 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72  _curr = app_curr
12f50 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43  ->_next) {.....C
12f60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12f70 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25  TF("Found tag: %
12f80 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
12f90 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
12fa0 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29  (app_curr->tag))
12fb0 3b 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75  ;.....if (app_cu
12fc0 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
12fd0 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
12fe0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
12ff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
13000 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
13010 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
13020 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73  out CERTIFICATEs
13030 29 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69  )");.......conti
13040 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
13050 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
13060 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75  [outidx];.....ou
13070 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72  tidx++;......cur
13080 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20  r_id->id_type = 
13090 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
130a0 41 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  AC;.....memcpy(c
130b0 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
130c0 2e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69  .applet, curr_ai
130d0 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  d, sizeof(curr_i
130e0 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
130f0 65 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69  et));.....curr_i
13100 64 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  d->card.cac.file
13110 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
13120 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
13130 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69  ctid;.....curr_i
13140 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b  d->keysize = -1;
13150 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
13160 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69  UG_PRINTF("Filli
13170 6e 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  ng curr_id->card
13180 2e 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29  .cac.applet (%p)
13190 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a   with %lu bytes:
131a0 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  ", curr_id->card
131b0 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e  .cac.applet, (un
131c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
131d0 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  eof(curr_id->car
131e0 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
131f0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13200 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22  _PRINTBUF("VAL:"
13210 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
13220 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65  cac.applet, size
13230 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
13240 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a  .cac.applet));..
13250 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
13260 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61  tificate_len = a
13270 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b  pp_curr->length;
13280 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
13290 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
132a0 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  loc(curr_id->cer
132b0 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
132c0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
132d0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
132e0 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c  app_curr->value,
132f0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
13300 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
13310 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
13320 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66  count) {......if
13330 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c   (certs_resizabl
13340 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e  e) {.......*coun
13350 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 69 66  t *= 2;.......if
13360 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b   (*count != 0) {
13370 0a 09 09 09 09 09 09 09 63 65 72 74 73 20 3d 20  ........certs = 
13380 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73  realloc(certs, s
13390 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
133a0 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09  (*count));......
133b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
133c0 09 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09  .certs = NULL;..
133d0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c  .....}......} el
133e0 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  se {.......break
133f0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
13400 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
13410 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29  ree_tlv(app_tlv)
13420 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78  ;.....if (outidx
13430 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
13440 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
13450 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
13460 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09  _tlv(ccc_tlv);..
13470 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74  }...*count = out
13480 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73  idx;...if (certs
13490 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09  _resizable) {...
134a0 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29  if (*count != 0)
134b0 20 7b 0a 09 09 09 63 65 72 74 73 20 3d 20 72 65   {....certs = re
134c0 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a  alloc(certs, siz
134d0 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a  eof(*certs) * (*
134e0 63 6f 75 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73  count));...} els
134f0 65 20 7b 0a 09 09 09 66 72 65 65 28 63 65 72 74  e {....free(cert
13500 73 29 3b 0a 0a 09 09 09 63 65 72 74 73 20 3d 20  s);.....certs = 
13510 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73  NULL;...}..}...s
13520 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
13530 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f  s = cackey_copy_
13540 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74  certs(NULL, cert
13550 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f  s, *count);..slo
13560 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
13570 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a  count = *count;.
13580 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53  ../* Terminate S
13590 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63  martCard Transac
135a0 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
135b0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
135c0 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28  slot);...return(
135d0 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  certs);.}../*. *
135e0 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
135f0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
13600 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
13610 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
13620 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
13630 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
13640 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
13650 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
13660 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 74  y_signdecrypt(st
13670 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
13680 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63   *slot, struct c
13690 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
136a0 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
136b0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69  ed char *buf, si
136c0 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73  ze_t buflen, uns
136d0 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62  igned char *outb
136e0 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75  uf, size_t outbu
136f0 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70  flen, int padInp
13700 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74  ut, int unpadOut
13710 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70  put) {..cackey_p
13720 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74  csc_id_type id_t
13730 79 70 65 2c 20 63 68 65 63 6b 5f 69 64 5f 74 79  ype, check_id_ty
13740 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  pe;..unsigned ch
13750 61 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ar dyn_auth_temp
13760 6c 61 74 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61  late[10], *dyn_a
13770 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73  uth_tmpbuf;..uns
13780 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62  igned char *tmpb
13790 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a  uf, *tmpbuf_s, *
137a0 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75  outbuf_s, *outbu
137b0 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  f_p;..unsigned c
137c0 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  har bytes_to_sen
137d0 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75  d, p1, class;..u
137e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f  nsigned char blo
137f0 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  cktype;..cackey_
13800 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75  ret send_ret;..u
13810 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65  int16_t respcode
13820 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61  ;..ssize_t retva
13830 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73  l = 0, unpadoffs
13840 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62  et;..size_t tmpb
13850 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74  uflen, padlen, t
13860 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74  mpoutbuflen, out
13870 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72  buf_len;..int fr
13880 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
13890 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59  int le;...CACKEY
138a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
138b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
138c0 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  slot == NULL) {.
138d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
138e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 73  RINTF("Error.  s
138f0 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  lot is NULL");..
13900 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
13910 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e 55  ...if (buf == NU
13920 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
13930 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
13940 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c 4c  or.  buf is NULL
13950 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
13960 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
13970 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
13980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13990 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75 74  NTF("Error.  out
139a0 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  buf is NULL");..
139b0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
139c0 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20  ...if (identity 
139d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
139e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
139f0 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
13a00 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  ty is NULL");...
13a10 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
13a20 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
13a30 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d  pcsc_identity ==
13a40 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
13a50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13a60 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
13a70 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
13a80 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
13a90 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
13aa0 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69 74  d_type = identit
13ab0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13ac0 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20 28  ->id_type;..if (
13ad0 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45  id_type == CACKE
13ae0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
13af0 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  NLY) {...CACKEY_
13b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13b10 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
13b20 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
13b30 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
13b40 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68  CERT_ONLY, which
13b50 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
13b60 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70 74  for sign/decrypt
13b70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
13b80 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
13b90 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73  id_type) {...cas
13ba0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
13bb0 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41 43  _PIV:...case CAC
13bc0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
13bd0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
13be0 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
13bf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13c00 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e  ror.  identity->
13c10 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73  pcsc_identity is
13c20 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65 64   not a supported
13c30 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73 3a   value. Type is:
13c40 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30 78   0x%lx (PIV = 0x
13c50 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c 78  %lx, CAC = 0x%lx
13c60 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
13c70 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75 6e  ng) id_type, (un
13c80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
13c90 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c  KEY_ID_TYPE_PIV,
13ca0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13cb0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
13cc0 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  CAC);.....return
13cd0 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
13ce0 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
13cf0 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
13d00 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
13d10 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
13d20 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
13d30 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13d40 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
13d50 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
13d60 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13d70 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
13d80 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
13d90 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
13da0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
13db0 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
13dc0 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
13dd0 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
13de0 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
13df0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
13e00 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
13e10 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
13e20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
13e30 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
13e40 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
13e50 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
13e60 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13e70 2d 3e 6b 65 79 73 69 7a 65 20 2d 20 33 29 29 20  ->keysize - 3)) 
13e80 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
13e90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13ea0 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
13eb0 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
13ec0 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
13ed0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
13ee0 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
13ef0 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
13f00 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
13f10 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
13f20 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
13f30 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
13f40 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
13f50 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
13f60 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
13f70 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
13f80 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 65 64  BUG_PRINTF("Need
13f90 20 74 6f 20 70 61 64 20 74 68 65 20 62 75 66 66   to pad the buff
13fa0 65 72 20 77 69 74 68 20 25 6c 6c 75 20 62 79 74  er with %llu byt
13fb0 65 73 20 28 74 6d 70 62 75 66 6c 65 6e 20 3d 20  es (tmpbuflen = 
13fc0 25 6c 6c 75 2c 20 62 75 66 6c 65 6e 20 3d 20 25  %llu, buflen = %
13fd0 6c 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  llu)", (unsigned
13fe0 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 70 61 64 6c   long long) padl
13ff0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
14000 6e 67 20 6c 6f 6e 67 29 20 74 6d 70 62 75 66 6c  ng long) tmpbufl
14010 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
14020 6e 67 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29  ng long) buflen)
14030 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b  ;....../* RSA PK
14040 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d  CS#1 EMSA-PKCS1-
14050 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a  v1_5 Padding */.
14060 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20  ....tmpbuf[0] = 
14070 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66  0x00;.....tmpbuf
14080 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09  [1] = 0x01;.....
14090 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32  memset(&tmpbuf[2
140a0 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29  ], 0xFF, padlen)
140b0 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64  ;.....tmpbuf[pad
140c0 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a  len + 2]= 0x00;.
140d0 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62  ....memcpy(&tmpb
140e0 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20  uf[padlen + 3], 
140f0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  buf, buflen);...
14100 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14110 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
14120 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65  ed:", buf, bufle
14130 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  n);.....CACKEY_D
14140 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
14150 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c  added:", tmpbuf,
14160 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09   tmpbuflen);....
14170 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70  } else {.....tmp
14180 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74  buf = buf;.....t
14190 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
141a0 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  n;.....free_tmpb
141b0 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c  uf = 0;.....padl
141c0 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  en = 0;....}...}
141d0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
141e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
141f0 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
14200 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
14210 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
14220 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
14230 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62  ded!");.....tmpb
14240 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70  uf = buf;....tmp
14250 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
14260 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
14270 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d  = 0;....padlen =
14280 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20   0;...}..} else 
14290 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  {...tmpbuf = buf
142a0 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ;...tmpbuflen = 
142b0 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74  buflen;...free_t
142c0 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64  mpbuf = 0;...pad
142d0 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  len = 0;..}.../*
142e0 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   Begin transacti
142f0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
14300 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
14310 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65  slot);.../* Sele
14320 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c 65  ct correct apple
14330 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  t */..switch (id
14340 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
14350 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
14360 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  AC:....CACKEY_DE
14370 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65  BUG_PRINTF("Sele
14380 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f 75  cting applet fou
14390 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69  nd at %p ...", i
143a0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
143b0 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
143c0 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61 63  .applet);....cac
143d0 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
143e0 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79  t(slot, identity
143f0 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
14400 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
14410 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69 74  , sizeof(identit
14420 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
14430 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
14440 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65  t));...../* Sele
14450 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65 20  ct correct file 
14460 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 6c  */....cackey_sel
14470 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69  ect_file(slot, i
14480 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
14490 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63  entity->card.cac
144a0 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b  .file);....break
144b0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
144c0 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
144d0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
144e0 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09  e[0] = 0x7C;....
144f0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
14500 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[1] = 0x82;....
14510 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
14520 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c  e[2] = ((tmpbufl
14530 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30 30  en + 6) & 0xff00
14540 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61  ) >> 8;....dyn_a
14550 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20  uth_template[3] 
14560 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36  = (tmpbuflen + 6
14570 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09 64  ) & 0x00ff;....d
14580 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14590 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64  [4] = 0x82;....d
145a0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
145b0 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 64  [5] = 0x00;....d
145c0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
145d0 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09 64  [6] = 0x81;....d
145e0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
145f0 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64  [7] = 0x82;....d
14600 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14610 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e  [8] = (tmpbuflen
14620 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b   & 0xff00) >> 8;
14630 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
14640 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75  plate[9] = tmpbu
14650 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a  flen & 0x00ff;..
14660 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62  ...dyn_auth_tmpb
14670 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
14680 75 66 6c 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64  uflen + sizeof(d
14690 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
146a0 29 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79  ));....memcpy(dy
146b0 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 2c 20 64  n_auth_tmpbuf, d
146c0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
146d0 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  , sizeof(dyn_aut
146e0 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09  h_template));...
146f0 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61 75 74 68  .memcpy(dyn_auth
14700 5f 74 6d 70 62 75 66 20 2b 20 73 69 7a 65 6f 66  _tmpbuf + sizeof
14710 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
14720 74 65 29 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  te), tmpbuf, tmp
14730 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  buflen);.....if 
14740 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a  (free_tmpbuf) {.
14750 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 29  ....free(tmpbuf)
14760 3b 0a 09 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75  ;....}.....tmpbu
14770 66 6c 65 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64  flen += sizeof(d
14780 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
14790 29 3b 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 64  );....tmpbuf = d
147a0 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a  yn_auth_tmpbuf;.
147b0 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
147c0 20 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09   1;.....break;..
147d0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
147e0 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a  TYPE_CERT_ONLY:.
147f0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74  ...break;..}...t
14800 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66  mpbuf_s = tmpbuf
14810 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
14820 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d  tbuf;..while (tm
14830 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70  pbuflen) {...tmp
14840 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62  outbuflen = outb
14850 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d  uflen;....if (tm
14860 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
14870 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
14880 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20  bytes_to_send = 
14890 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
148a0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62  ...} else {....b
148b0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74  ytes_to_send = t
148c0 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  mpbuflen;...}...
148d0 09 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b  .send_ret = CACK
148e0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
148f0 43 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f  C;...switch (id_
14900 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
14910 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
14920 41 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62  AC:.....if (tmpb
14930 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
14940 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09  PDU_MTU) {......
14950 70 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09  p1 = 0x80;......
14960 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d  le = 0x00;.....}
14970 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20   else {......p1 
14980 3d 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20  = 0x00;......le 
14990 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09  = 0x00;.....}...
149a0 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
149b0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
149c0 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
149d0 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
149e0 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49  , GSCIS_INSTR_SI
149f0 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30  GNDECRYPT, p1, 0
14a00 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65  x00, bytes_to_se
14a10 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20  nd, tmpbuf, le, 
14a20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75  &respcode, outbu
14a30 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e  f, &tmpoutbuflen
14a40 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
14a50 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
14a60 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66  TYPE_PIV:.....if
14a70 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41   (tmpbuflen > CA
14a80 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b  CKEY_APDU_MTU) {
14a90 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78  ......class = 0x
14aa0 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78  10;......le = 0x
14ab0 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  00;.....} else {
14ac0 0a 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53  ......class = GS
14ad0 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
14ae0 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36  6;......le = 256
14af0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e  ;.....}......sen
14b00 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
14b10 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63  end_apdu(slot, c
14b20 6c 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f  lass, NISTSP800_
14b30 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55  73_3_INSTR_GENAU
14b40 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38  TH, NISTSP800_78
14b50 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c  _3_ALGO_RSA2048,
14b60 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
14b70 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70  identity->card.p
14b80 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73  iv.key_id, bytes
14b90 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66  _to_send, tmpbuf
14ba0 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c  , le, &respcode,
14bb0 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74   outbuf, &tmpout
14bc0 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65  buflen);.....bre
14bd0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
14be0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
14bf0 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ONLY:.....break;
14c00 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64  ...}....if (send
14c10 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
14c20 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
14c30 66 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20  f (free_tmpbuf) 
14c40 7b 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  {.....if (tmpbuf
14c50 5f 73 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  _s) {......free(
14c60 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d  tmpbuf_s);.....}
14c70 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64  ....}...../* End
14c80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
14c90 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
14ca0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
14cb0 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
14cc0 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
14cd0 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09  _E_RETRY) {.....
14ce0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14cf0 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
14d00 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 72  g Failed -- retr
14d10 79 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65  ying.");......re
14d20 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e  turn(cackey_sign
14d30 64 65 63 72 79 70 74 28 73 6c 6f 74 2c 20 69 64  decrypt(slot, id
14d40 65 6e 74 69 74 79 2c 20 62 75 66 2c 20 62 75 66  entity, buf, buf
14d50 6c 65 6e 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74  len, outbuf, out
14d60 62 75 66 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74  buflen, padInput
14d70 2c 20 75 6e 70 61 64 4f 75 74 70 75 74 29 29 3b  , unpadOutput));
14d80 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
14d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
14da0 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69 6c  DPU Sending Fail
14db0 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20  ed -- returning 
14dc0 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
14dd0 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d  .if (respcode ==
14de0 20 30 78 36 39 38 32 20 7c 7c 20 72 65 73 70 63   0x6982 || respc
14df0 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 20 7c 7c  ode == 0x6e00 ||
14e00 20 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36   respcode == 0x6
14e10 64 30 30 29 20 7b 0a 09 09 09 09 69 66 20 28 72  d00) {.....if (r
14e20 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 65 30  espcode == 0x6e0
14e30 30 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  0) {......CACKEY
14e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47  _DEBUG_PRINTF("G
14e50 6f 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53  ot \"WRONG CLASS
14e60 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77  \", this means w
14e70 65 20 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f  e are talking to
14e80 20 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63   the wrong objec
14e90 74 20 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73  t (likely becaus
14ea0 65 20 74 68 65 20 63 61 72 64 20 77 65 6e 74 20  e the card went 
14eb0 61 77 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69  away) -- resetti
14ec0 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  ng");.....} else
14ed0 20 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d   if (respcode ==
14ee0 20 30 78 36 64 30 30 29 20 7b 0a 09 09 09 09 09   0x6d00) {......
14ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14f00 4e 54 46 28 22 47 6f 74 20 5c 22 49 4e 56 41 4c  NTF("Got \"INVAL
14f10 49 44 20 49 4e 53 54 52 55 43 54 49 4f 4e 5c 22  ID INSTRUCTION\"
14f20 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77 65 20  , this means we 
14f30 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74  are talking to t
14f40 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20  he wrong object 
14f50 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 65 20  (likely because 
14f60 74 68 65 20 63 61 72 64 20 77 65 6e 74 20 61 77  the card went aw
14f70 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69 6e 67  ay) -- resetting
14f80 22 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ");.....} else {
14f90 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14fa0 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72  UG_PRINTF("Secur
14fb0 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73  ity status not s
14fc0 61 74 69 73 69 66 69 65 64 20 28 72 65 73 70 63  atisified (respc
14fd0 6f 64 65 20 3d 20 30 78 25 30 34 78 29 2e 20 20  ode = 0x%04x).  
14fe0 52 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f  Returning NEEDLO
14ff0 47 49 4e 22 2c 20 28 69 6e 74 29 20 72 65 73 70  GIN", (int) resp
15000 63 6f 64 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  code);.....}....
15010 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
15020 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
15030 0a 09 09 09 09 63 61 63 6b 65 79 5f 64 65 74 65  .....cackey_dete
15040 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f  ct_and_select_ro
15050 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ot_applet(slot, 
15060 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55  CACKEY_ID_TYPE_U
15070 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 09 09 09 73 6c  NKNOWN);......sl
15080 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot->token_flags 
15090 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
150a0 49 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72  IRED;......retur
150b0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
150c0 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d  NEEDLOGIN);....}
150d0 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
150e0 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
150f0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
15100 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
15110 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e  UG_PRINTF("Token
15120 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e   absent.  Return
15130 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22  ing TOKENABSENT"
15140 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  );......cackey_m
15150 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
15160 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  lot);......retur
15170 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15180 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
15190 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
151a0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65  BUG_PRINTF("Some
151b0 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67  thing went wrong
151c0 20 64 75 72 69 6e 67 20 73 69 67 6e 69 6e 67 2c   during signing,
151d0 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 73   resetting the s
151e0 6c 6f 74 20 61 6e 64 20 68 6f 70 69 6e 67 20 66  lot and hoping f
151f0 6f 72 20 74 68 65 20 62 65 73 74 2e 22 29 3b 0a  or the best.");.
15200 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
15210 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09  disconnect();...
15220 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  ..cackey_pcsc_co
15230 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63 61 63  nnect();.....cac
15240 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73  key_detect_and_s
15250 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65  elect_root_apple
15260 74 28 73 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49  t(slot, CACKEY_I
15270 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b  D_TYPE_UNKNOWN);
15280 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
15290 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
152a0 43 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75  C);...}....tmpbu
152b0 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  f += bytes_to_se
152c0 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20  nd;...tmpbuflen 
152d0 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  -= bytes_to_send
152e0 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74  ;....outbuf += t
152f0 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f  mpoutbuflen;...o
15300 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f  utbuflen -= tmpo
15310 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76  utbuflen;...retv
15320 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c  al += tmpoutbufl
15330 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  en;..}...if (fre
15340 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66  e_tmpbuf) {...if
15350 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09   (tmpbuf_s) {...
15360 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
15370 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66  ...}..}...outbuf
15380 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f   = outbuf_s;.../
15390 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
153a0 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
153b0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
153c0 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  t);..#ifdef CACK
153d0 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
153e0 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
153f0 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75  E_MAX..if (outbu
15400 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53  flen > _POSIX_SS
15410 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
15420 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15430 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65  ("Outbuflen exce
15440 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
15450 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
15460 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
15470 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d  %li, outbuflen =
15480 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
15490 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
154a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
154b0 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09   outbuflen);....
154c0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
154d0 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
154e0 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f  ./* We must remo
154f0 76 65 20 74 68 65 20 22 37 43 22 20 74 61 67 20  ve the "7C" tag 
15500 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73 69  to get to the si
15510 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74  gnature */..swit
15520 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
15530 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
15540 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74  TYPE_PIV:....out
15550 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c  buf_len = retval
15560 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20  ;....outbuf_p = 
15570 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74  cackey_read_bert
15580 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26  lv_tag(outbuf, &
15590 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43  outbuf_len, 0x7C
155a0 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66  , NULL,  &outbuf
155b0 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75  _len);....if (ou
155c0 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  tbuf_p == NULL) 
155d0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
155e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
155f0 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72  nse from PIV for
15600 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e   GENERATE AUTHEN
15610 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74  TICATION was not
15620 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74   a 0x7C tag, ret
15630 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
15640 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  e");......return
15650 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  (-1);....}.....r
15660 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c  etval = outbuf_l
15670 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c  en;.....outbuf_l
15680 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09  en = retval;....
15690 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65  outbuf_p = cacke
156a0 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61  y_read_bertlv_ta
156b0 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75  g(outbuf, &outbu
156c0 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c  f_len, 0x82, NUL
156d0 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29  L,  &outbuf_len)
156e0 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f  ;....if (outbuf_
156f0 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  p == NULL) {....
15700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15710 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66  INTF("Response f
15720 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45  rom PIV for GENE
15730 52 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54  RATE AUTHENTICAT
15740 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78  ION was not a 0x
15750 38 32 20 77 69 74 68 69 6e 20 61 20 30 78 37 43  82 within a 0x7C
15760 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20   tag, returning 
15770 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
15780 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15790 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d  ..}.....retval =
157a0 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09   outbuf_len;....
157b0 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
157c0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
157d0 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  C:...case CACKEY
157e0 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
157f0 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  LY:....break;..}
15800 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c  .../* Unpad repl
15810 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f  y */..if (unpadO
15820 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72  utput) {...if (r
15830 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09  etval < 3) {....
15840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15850 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f  NTF("Reply is to
15860 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20  o small, we are 
15870 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61  not able to unpa
15880 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  d -- passing bac
15890 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
158a0 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
158b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
158c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
158d0 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
158e0 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
158f0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
15900 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
15910 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  tval);...}....if
15920 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30   (outbuf[0] != 0
15930 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  x00) {....CACKEY
15940 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
15950 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64  nrecognized padd
15960 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61  ing scheme -- pa
15970 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68  ssing back and h
15980 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oping for the be
15990 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45  st!");.....CACKE
159a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
159b0 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
159c0 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
159d0 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
159e0 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09  ng) retval);....
159f0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
15a00 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65  ..}....blocktype
15a10 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09   = outbuf[1];...
15a20 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b  unpadoffset = 0;
15a30 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63  ....switch (bloc
15a40 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  ktype) {....case
15a50 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61   0x00:...../* Pa
15a60 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20  dding Scheme 1, 
15a70 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65  the first non-ze
15a80 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73  ro byte is the s
15a90 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a  tart of data */.
15aa0 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
15ab0 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
15ac0 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
15ad0 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
15ae0 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
15af0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
15b00 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62   0x00) {.......b
15b10 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
15b20 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
15b30 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09  .case 0x01:.....
15b40 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
15b50 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61  e 2, pad bytes a
15b60 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64  re 0xFF followed
15b70 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09   by 0x00 */.....
15b80 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
15b90 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
15ba0 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
15bb0 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
15bc0 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
15bd0 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46  adoffset] != 0xF
15be0 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f  F) {.......if (o
15bf0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
15c00 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
15c10 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
15c20 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61  ++;.........brea
15c30 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  k;.......} else 
15c40 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  {........CACKEY_
15c50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
15c60 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
15c70 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
15c80 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
15c90 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
15ca0 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30   0x00 found 0x%0
15cb0 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
15cc0 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
15cd0 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
15ce0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
15cf0 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
15d00 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
15d10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
15d20 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64  nvalid padding d
15d30 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  ata found, retur
15d40 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c  ning in failure,
15d50 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
15d60 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25  n 0xFF found 0x%
15d70 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  02x", (unsigned 
15d80 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61  int) outbuf[unpa
15d90 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09  doffset]);......
15da0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
15db0 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
15dc0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
15dd0 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  02:...../* Paddi
15de0 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64  ng Scheme 3, pad
15df0 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a   bytes are non-z
15e00 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62  ero first zero b
15e10 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65  yte found is the
15e20 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20   seperator byte 
15e30 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
15e40 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
15e50 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
15e60 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
15e70 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
15e80 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
15e90 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   == 0x00) {.....
15ea0 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
15eb0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
15ec0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
15ed0 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
15ee0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20   (unpadoffset > 
15ef0 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43  retval) {....CAC
15f00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15f10 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72  ("Offset greater
15f20 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65   than reply size
15f30 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e  , aborting.  (un
15f40 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c  padoffset = %lu,
15f50 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c   retval = %lu)",
15f60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15f70 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75   unpadoffset, (u
15f80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
15f90 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
15fa0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  n(-1);...}....CA
15fb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15fc0 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f  BUF("Padded:", o
15fd0 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
15fe0 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70  ...retval -= unp
15ff0 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d  adoffset;...memm
16000 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62  ove(outbuf, outb
16010 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74  uf + unpadoffset
16020 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41  , retval);....CA
16030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16040 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
16050 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
16060 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44  ;..}....CACKEY_D
16070 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16080 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
16090 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
160a0 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
160b0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
160c0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
160d0 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
160e0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
160f0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
16100 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
16110 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
16120 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
16130 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
16140 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
16150 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
16160 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
16170 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
16180 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70   {..cackey_ret p
16190 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
161a0 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c  ..DWORD reader_l
161b0 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20  en = 0, state = 
161c0 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c  0, protocol = 0,
161d0 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20   atr_len;..BYTE 
161e0 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45  atr[MAX_ATR_SIZE
161f0 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f  ];..LONG status_
16200 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
16210 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  n_ret;...CACKEY_
16220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
16230 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
16240 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot->internal) {
16250 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16260 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16270 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20  g token present 
16280 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29  (internal token)
16290 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
162a0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
162b0 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  NPRESENT);..}...
162c0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
162d0 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
162e0 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
162f0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
16300 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
16310 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
16320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16330 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
16340 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
16350 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
16360 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
16370 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
16380 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
16390 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
163a0 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53  RINTF("Calling S
163b0 43 61 72 64 53 74 61 74 75 73 28 29 20 74 6f 20  CardStatus() to 
163c0 64 65 74 65 72 6d 69 6e 65 20 63 61 72 64 20 73  determine card s
163d0 74 61 74 75 73 22 29 3b 0a 0a 09 61 74 72 5f 6c  tatus");...atr_l
163e0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29  en = sizeof(atr)
163f0 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ;..status_ret = 
16400 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
16410 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
16420 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
16430 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
16440 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
16450 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  );...if (status_
16460 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49  ret == SCARD_E_I
16470 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b  NVALID_HANDLE) {
16480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16490 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61  PRINTF("SCardSta
164a0 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  tus() returned S
164b0 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
164c0 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 61  ANDLE, marking a
164d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f  s not already co
164e0 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69  nnected and tryi
164f0 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61  ng again");...ca
16500 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
16510 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70  eset(slot);....p
16520 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
16530 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
16540 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69  _card(slot);...i
16550 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
16560 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
16570 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
16580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16590 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
165a0 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
165b0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
165c0 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  sent");.....retu
165d0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
165e0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
165f0 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
16600 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
16610 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29  ng SCardStatus()
16620 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61 74 72   again");....atr
16630 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
16640 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72 65 74  r);...status_ret
16650 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
16660 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
16670 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
16680 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
16690 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
166a0 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  len);..}...if (s
166b0 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
166c0 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
166d0 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
166e0 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
166f0 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
16700 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
16710 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
16720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16730 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
16740 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
16750 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
16760 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
16770 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
16780 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
16790 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
167a0 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a  D_PROTOCOL_T1);.
167b0 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
167c0 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
167d0 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
167e0 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73  ../* Re-establis
167f0 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  h transaction, i
16800 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74  f it was present
16810 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74   */.....if (slot
16820 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
16830 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  pth > 0) {......
16840 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
16850 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09  n_depth--;......
16860 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
16870 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
16880 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
16890 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
168a0 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
168b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
168c0 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
168d0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65  uccessful, reque
168e0 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61  rying");.....sta
168f0 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
16900 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
16910 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
16920 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
16930 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
16940 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09  , &atr_len);....
16950 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
16960 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
16970 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
16980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16990 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20  Still unable to 
169a0 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
169b0 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
169c0 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
169d0 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
169e0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
169f0 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
16a00 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
16a10 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
16a20 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
16a30 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
16a40 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
16a50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16a60 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  NTF("Unable to r
16a70 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64  econnect to card
16a80 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
16a90 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
16aa0 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  Reconnect() = %s
16ab0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
16ac0 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
16ad0 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e  _STR(scard_recon
16ae0 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65  n_ret));......re
16af0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
16b00 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
16b10 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
16b20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16b30 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
16b40 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
16b50 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
16b60 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
16b70 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
16b80 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
16b90 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
16ba0 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
16bb0 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ));.....return(C
16bc0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
16bd0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
16be0 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26  }...if ((state &
16bf0 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d   SCARD_ABSENT) =
16c00 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  = SCARD_ABSENT) 
16c10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16c20 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
16c30 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69   absent, returni
16c40 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
16c50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
16c60 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
16c70 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
16c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16c90 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
16ca0 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a  en present.");..
16cb0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
16cc0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
16cd0 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  NT);.}../*. * SY
16ce0 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
16cf0 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
16d00 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
16d10 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
16d20 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
16d30 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
16d40 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
16d50 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
16d60 79 5f 73 65 74 5f 70 69 6e 28 73 74 72 75 63 74  y_set_pin(struct
16d70 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
16d80 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
16d90 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75 6e 73 69  r *old_pin, unsi
16da0 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64 5f 70 69  gned long old_pi
16db0 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20  n_len, unsigned 
16dc0 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67  char *pin, unsig
16dd0 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e  ned long pin_len
16de0 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
16df0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
16e00 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
16e10 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
16e20 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
16e30 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
16e40 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
16e50 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
16e60 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
16e70 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  old_cac_pin[8] =
16e80 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
16e90 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
16ea0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
16eb0 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
16ec0 72 20 70 69 6e 5f 75 70 64 61 74 65 5b 73 69 7a  r pin_update[siz
16ed0 65 6f 66 28 63 61 63 5f 70 69 6e 29 20 2b 20 73  eof(cac_pin) + s
16ee0 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69  izeof(old_cac_pi
16ef0 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n)];..unsigned l
16f00 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09  ong num_certs;..
16f10 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73  uint16_t respons
16f20 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69  e_code;..int tri
16f30 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
16f40 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e  nt send_ret;..in
16f50 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20  t key_reference 
16f60 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 41 70 70  = 0x00;.../* App
16f70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e  arently, CAC PIN
16f80 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20  s are *EXACTLY* 
16f90 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20  8 bytes long -- 
16fa0 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66  pad with 0xFF if
16fb0 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
16fc0 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29  f (pin_len >= 8)
16fd0 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f   {...memcpy(cac_
16fe0 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d  pin, pin, 8);..}
16ff0 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
17000 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70  (cac_pin, pin, p
17010 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66  in_len);..}...if
17020 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20 3e 3d   (old_pin_len >=
17030 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f   8) {...memcpy(o
17040 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f  ld_cac_pin, old_
17050 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65  pin, 8);..} else
17060 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c 64 5f   {...memcpy(old_
17070 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e  cac_pin, old_pin
17080 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a  , old_pin_len);.
17090 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61 74 65 6e  .}.../* Concaten
170a0 61 74 65 20 62 6f 74 68 20 50 49 4e 73 20 74 6f  ate both PINs to
170b0 67 65 74 68 65 72 20 74 6f 20 73 65 6e 64 20 61  gether to send a
170c0 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 72  s a single instr
170d0 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65 6d 63 70  uction */..memcp
170e0 79 28 70 69 6e 5f 75 70 64 61 74 65 2c 20 6f 6c  y(pin_update, ol
170f0 64 5f 63 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f  d_cac_pin, sizeo
17100 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 29 3b  f(old_cac_pin));
17110 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75 70 64  ..memcpy(pin_upd
17120 61 74 65 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64  ate + sizeof(old
17130 5f 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  _cac_pin), cac_p
17140 69 6e 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  in, sizeof(cac_p
17150 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65 6a 65 63  in));.../* Rejec
17160 74 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65  t PINs which are
17170 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
17180 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20  f (pin_len < 5) 
17190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
171a0 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69  _PRINTF("Rejecti
171b0 6e 67 20 4e 65 77 20 50 49 4e 20 77 68 69 63 68  ng New PIN which
171c0 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 28 6c   is too short (l
171d0 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d 75 73  ength = %lu, mus
171e0 74 20 62 65 20 61 74 6c 65 61 73 74 20 35 29 22  t be atleast 5)"
171f0 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72  , pin_len);....r
17200 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
17210 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a  C_E_BADPIN);..}.
17220 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65  ..if (old_pin_le
17230 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45  n < 5) {...CACKE
17240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17250 52 65 6a 65 63 74 69 6e 67 20 4f 6c 64 20 50 49  Rejecting Old PI
17260 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  N which is too s
17270 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25  hort (length = %
17280 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65  lu, must be atle
17290 61 73 74 20 35 29 22 2c 20 6f 6c 64 5f 70 69 6e  ast 5)", old_pin
172a0 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
172b0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
172c0 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ADPIN);..}.../* 
172d0 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69  PIV authenticati
172e0 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72  on uses a "key_r
172f0 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38  eference" of 0x8
17300 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74  0 */..pcsc_ident
17310 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
17320 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
17330 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
17340 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  );..if (num_cert
17350 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64  s > 0 && pcsc_id
17360 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
17370 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63  ) {...switch (pc
17380 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d  sc_identities[0]
17390 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
173a0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
173b0 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
173c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
173d0 22 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72  "We have PIV car
173e0 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74  d, so we will at
173f0 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74  tempt to authent
17400 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20  icate using the 
17410 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  PIV Application 
17420 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b  key reference");
17430 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66 65 72 65  ......key_refere
17440 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 09 09 09  nce = 0x80;.....
17450 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
17460 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  t:.....break;...
17470 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
17480 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
17490 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
174a0 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49  s, 1);..}.../* I
174b0 73 73 75 65 20 61 20 53 65 74 20 50 49 4e 20 28  ssue a Set PIN (
174c0 43 48 41 4e 47 45 20 52 45 46 45 52 45 4e 43 45  CHANGE REFERENCE
174d0 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d  ) */..send_ret =
174e0 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
174f0 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
17500 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
17510 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47 45 5f  IS_INSTR_CHANGE_
17520 52 45 46 45 52 45 4e 43 45 2c 20 30 78 30 30 2c  REFERENCE, 0x00,
17530 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20   key_reference, 
17540 73 69 7a 65 6f 66 28 70 69 6e 5f 75 70 64 61 74  sizeof(pin_updat
17550 65 29 2c 20 70 69 6e 5f 75 70 64 61 74 65 2c 20  e), pin_update, 
17560 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f  0x00, &response_
17570 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  code, NULL, NULL
17580 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
17590 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
175a0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28  _S_OK) {...if ((
175b0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
175c0 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43  0x63C0) == 0x63C
175d0 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65  0) {....tries_re
175e0 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f  maining = (respo
175f0 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b  nse_code & 0xF);
17600 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17610 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
17620 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
17630 64 2c 20 25 69 20 74 72 69 65 73 20 72 65 6d 61  d, %i tries rema
17640 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65  ining", tries_re
17650 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 72 65  maining);.....re
17660 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
17670 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
17680 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
17690 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
176a0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
176b0 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
176c0 20 74 6f 20 73 65 74 20 50 49 4e 2c 20 64 65 76   to set PIN, dev
176d0 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72  ice is locked or
176e0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49   changing the PI
176f0 4e 20 69 73 20 64 69 73 61 62 6c 65 64 22 29 3b  N is disabled");
17700 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
17710 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
17720 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
17730 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
17740 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
17750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17760 46 28 22 50 49 4e 20 43 68 61 6e 67 65 20 73 75  F("PIN Change su
17770 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
17780 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
17790 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44 69 73 61  S_OK);.../* Disa
177a0 62 6c 65 20 61 20 77 61 72 6e 69 6e 67 2c 20 73  ble a warning, s
177b0 69 6e 63 65 20 74 68 69 73 20 69 73 20 6f 6e 6c  ince this is onl
177c0 79 20 75 73 65 64 20 69 6e 20 64 65 62 75 67 20  y used in debug 
177d0 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 65 73 5f 72  mode */..tries_r
177e0 65 6d 61 69 6e 69 6e 67 20 3d 20 74 72 69 65 73  emaining = tries
177f0 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a 0a 2f  _remaining;.}../
17800 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
17810 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
17820 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
17830 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
17840 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
17850 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
17860 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
17870 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
17880 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  t cackey_login(s
17890 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
178a0 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
178b0 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
178c0 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
178d0 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72  en, int *tries_r
178e0 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 69 6e 74 20  emaining_p, int 
178f0 72 65 74 72 69 65 73 29 20 7b 0a 09 73 74 72 75  retries) {..stru
17900 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
17910 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
17920 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
17930 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e  ned char cac_pin
17940 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46  [8] = {0xFF, 0xF
17950 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
17960 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
17970 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65   0xFF};..unsigne
17980 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
17990 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
179a0 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20  onse_code;..int 
179b0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
179c0 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
179d0 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e  .int key_referen
179e0 63 65 20 3d 20 30 78 30 30 2c 20 68 61 76 65 5f  ce = 0x00, have_
179f0 70 69 76 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  piv = 0;..cackey
17a00 5f 72 65 74 20 63 6f 6e 6e 65 63 74 5f 72 65 74  _ret connect_ret
17a10 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a 0a 09 2f  , token_ret;.../
17a20 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
17a30 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61  we do not know a
17a40 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72  bout how many tr
17a50 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e  ies are remainin
17a60 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f  g */..if (tries_
17a70 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
17a80 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
17a90 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f  g_p = -1;..}.../
17aa0 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41  * Apparently, CA
17ab0 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43  C PINs are *EXAC
17ac0 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e  TLY* 8 bytes lon
17ad0 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78  g -- pad with 0x
17ae0 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20  FF if too short 
17af0 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
17b00 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
17b10 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38  (cac_pin, pin, 8
17b20 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
17b30 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
17b40 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d  in, pin_len);..}
17b50 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49 4e  .../* Reject PIN
17b60 73 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f 20  s which are too 
17b70 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69  short */..if (pi
17b80 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43  n_len < 5) {...C
17b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17ba0 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 50 49  TF("Rejecting PI
17bb0 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  N which is too s
17bc0 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25  hort (length = %
17bd0 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65  lu, must be atle
17be0 61 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e  ast 5)", pin_len
17bf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
17c00 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
17c10 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56 20  N);..}.../* PIV 
17c20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 75  authentication u
17c30 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66 65 72  ses a "key_refer
17c40 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20 2a 2f  ence" of 0x80 */
17c50 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
17c60 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
17c70 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c  certs(slot, NULL
17c80 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
17c90 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
17ca0 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69  0 && pcsc_identi
17cb0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
17cc0 09 09 73 77 69 74 63 68 20 28 70 63 73 63 5f 69  ..switch (pcsc_i
17cd0 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64 5f  dentities[0].id_
17ce0 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
17cf0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
17d00 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  IV:.....CACKEY_D
17d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20  EBUG_PRINTF("We 
17d20 68 61 76 65 20 50 49 56 20 63 61 72 64 2c 20 73  have PIV card, s
17d30 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70  o we will attemp
17d40 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74  t to authenticat
17d50 65 20 75 73 69 6e 67 20 74 68 65 20 50 49 56 20  e using the PIV 
17d60 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20  Application key 
17d70 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09  reference");....
17d80 09 09 68 61 76 65 5f 70 69 76 20 3d 20 31 3b 0a  ..have_piv = 1;.
17d90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65  ....break;....de
17da0 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b  fault:.....break
17db0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
17dc0 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
17dd0 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
17de0 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09  certs, 1);..}...
17df0 69 66 20 28 68 61 76 65 5f 70 69 76 20 3d 3d 20  if (have_piv == 
17e00 31 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66 65 72  1) {...key_refer
17e10 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 7d 0a  ence = 0x80;..}.
17e20 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56  ../* Issue PIN V
17e30 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72  erify */..send_r
17e40 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
17e50 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
17e60 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
17e70 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
17e80 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72  IFY, 0x00, key_r
17e90 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66  eference, sizeof
17ea0 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  (cac_pin), cac_p
17eb0 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  in, 0x00, &respo
17ec0 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
17ed0 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e  NULL);...if (sen
17ee0 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
17ef0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
17f00 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
17f10 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
17f20 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
17f30 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
17f40 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
17f50 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
17f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
17f70 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
17f80 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
17f90 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
17fa0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
17fb0 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
17fc0 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a  ining_p) {.....*
17fd0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
17fe0 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  p = tries_remain
17ff0 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  ing;....}.....re
18000 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
18010 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
18020 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
18030 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
18040 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
18050 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
18060 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
18070 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63  d, device is loc
18080 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ked");.....retur
18090 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
180a0 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09  LOCKED);...}....
180b0 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  if (response_cod
180c0 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b 0a 09  e == 0x6d00) {..
180d0 09 09 69 66 20 28 72 65 74 72 69 65 73 20 3e 20  ..if (retries > 
180e0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
180f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f  DEBUG_PRINTF("Go
18100 74 20 49 53 4f 20 37 38 31 36 20 52 65 73 70 6f  t ISO 7816 Respo
18110 6e 73 65 20 5c 22 36 44 20 30 30 5c 22 20 69 6e  nse \"6D 00\" in
18120 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 56   response to a V
18130 45 52 49 46 59 20 72 65 71 75 65 73 74 2e 22 29  ERIFY request.")
18140 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
18150 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 64 69  UG_PRINTF("We di
18160 64 20 6e 6f 74 20 65 78 70 65 63 74 20 74 68 69  d not expect thi
18170 73 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  s because it is 
18180 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  not mentioned in
18190 20 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d   NIST SP 800-73-
181a0 33 20 50 61 72 74 20 32 20 53 65 63 74 69 6f 6e  3 Part 2 Section
181b0 20 33 2e 32 2e 31 20 6f 72 20 47 53 43 2d 49 53   3.2.1 or GSC-IS
181c0 20 76 32 2e 31 22 29 3b 0a 09 09 09 09 43 41 43   v2.1");.....CAC
181d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
181e0 28 22 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74  ("We are going t
181f0 6f 20 74 72 79 20 74 6f 20 72 65 73 65 74 20 74  o try to reset t
18200 68 65 20 63 61 72 64 20 61 6e 64 20 73 65 6c 65  he card and sele
18210 63 74 20 74 68 65 20 61 70 70 6c 65 74 20 61 67  ct the applet ag
18220 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 09 69 66 20  ain.");......if 
18230 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 20 26  (num_certs > 0 &
18240 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  & pcsc_identitie
18250 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
18260 09 09 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f  ..cackey_detect_
18270 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f  and_select_root_
18280 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70 63 73  applet(slot, pcs
18290 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e  c_identities[0].
182a0 69 64 5f 74 79 70 65 29 3b 0a 09 09 09 09 7d 0a  id_type);.....}.
182b0 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
182c0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
182d0 29 3b 0a 0a 09 09 09 09 63 6f 6e 6e 65 63 74 5f  );......connect_
182e0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
182f0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
18300 0a 09 09 09 09 69 66 20 28 63 6f 6e 6e 65 63 74  .....if (connect
18310 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
18320 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
18330 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18340 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
18350 72 65 63 6f 6e 6e 65 63 74 20 61 66 74 65 72 20  reconnect after 
18360 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 63 61  resetting the ca
18370 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  rd, returning in
18380 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 09   error.");......
18390 09 72 65 74 75 72 6e 28 63 6f 6e 6e 65 63 74 5f  .return(connect_
183a0 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  ret);.....}.....
183b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
183c0 49 4e 54 46 28 22 56 65 72 69 66 79 69 6e 67 20  INTF("Verifying 
183d0 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  we still have a 
183e0 74 6f 6b 65 6e 2e 22 29 3b 0a 09 09 09 09 74 6f  token.");.....to
183f0 6b 65 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ken_ret = cackey
18400 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
18410 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28 74 6f  lot);.....if (to
18420 6b 65 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ken_ret != CACKE
18430 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
18440 45 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 43 41  ESENT) {......CA
18450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18460 46 28 22 54 6f 6b 65 6e 20 6e 6f 74 20 70 72 65  F("Token not pre
18470 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  sent, returning 
18480 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
18490 09 09 09 72 65 74 75 72 6e 28 74 6f 6b 65 6e 5f  ...return(token_
184a0 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  ret);.....}.....
184b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
184c0 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20  INTF("Trying to 
184d0 6c 6f 67 69 6e 20 61 67 61 69 6e 22 29 3b 0a 09  login again");..
184e0 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
184f0 5f 6c 6f 67 69 6e 28 73 6c 6f 74 2c 20 70 69 6e  _login(slot, pin
18500 2c 20 70 69 6e 5f 6c 65 6e 2c 20 74 72 69 65 73  , pin_len, tries
18510 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 72 65  _remaining_p, re
18520 74 72 69 65 73 20 2d 20 31 29 29 3b 0a 09 09 09  tries - 1));....
18530 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  }...}....return(
18540 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
18550 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
18560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18570 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
18580 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  on succeeded");.
18590 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
185a0 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
185b0 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
185c0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
185d0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
185e0 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
185f0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
18600 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
18610 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
18620 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63  static ssize_t c
18630 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
18640 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72  ity_to_label(str
18650 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
18660 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
18670 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ty, unsigned cha
18680 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e  r *label_buf, un
18690 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65  signed long labe
186a0 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e  l_buf_len) {..un
186b0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74  signed long cert
186c0 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f  ificate_len;..vo
186d0 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a  id *label_asn1;.
186e0 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61  .void *certifica
186f0 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65  te;..int x509_re
18700 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66  ad_ret;...certif
18710 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
18720 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
18730 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
18740 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
18750 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
18760 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
18770 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75  en < 0) {...retu
18780 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30  rn(-1);..}...x50
18790 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
187a0 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72  9_to_subject(cer
187b0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
187c0 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64  icate_len, (void
187d0 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31   **) &label_asn1
187e0 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  );..if (x509_rea
187f0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72  d_ret < 0) {...r
18800 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
18810 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
18820 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e  x509_dn_to_strin
18830 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35  g(label_asn1, x5
18840 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68  09_read_ret, (ch
18850 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c  ar *) label_buf,
18860 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20   label_buf_len, 
18870 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39  "CN");..if (x509
18880 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  _read_ret <= 0) 
18890 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  {...x509_read_re
188a0 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
188b0 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
188c0 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
188d0 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
188e0 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
188f0 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66  en, NULL);....if
18900 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
18910 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72  <= 0) {....retur
18920 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  n(-1);...}..}..#
18930 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
18940 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
18950 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
18960 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
18970 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
18980 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
18990 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
189a0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78  x509_read_ret ex
189b0 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
189c0 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
189d0 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
189e0 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64  = %li, x509_read
189f0 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  _ret = %lu)", (l
18a00 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
18a10 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
18a20 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64   long) x509_read
18a30 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
18a40 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
18a50 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  f.#endif...retur
18a60 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  n(x509_read_ret)
18a70 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
18a80 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
18a90 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
18aa0 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76  y_mutex_create(v
18ab0 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09  oid **mutex) {..
18ac0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
18ad0 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
18ae0 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
18af0 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
18b00 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
18b10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18b20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
18b30 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
18b40 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
18b50 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
18b60 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
18b70 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
18b80 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ex = malloc(size
18b90 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  of(*pthread_mute
18ba0 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72  x));...if (!pthr
18bb0 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ead_mutex) {....
18bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18bd0 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61  NTF("Failed to a
18be0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22  llocate memory."
18bf0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
18c00 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61  );...}....pthrea
18c10 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
18c20 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74  ad_mutex_init(pt
18c30 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c  hread_mutex, NUL
18c40 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  L);...if (pthrea
18c50 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
18c60 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18c70 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
18c80 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65  _mutex_init() re
18c90 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
18ca0 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
18cb0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
18cc0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75  (-1);...}....*mu
18cd0 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  tex = pthread_mu
18ce0 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  tex;..} else {..
18cf0 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
18d00 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a  .CreateMutex) {.
18d10 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
18d20 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43   = cackey_args.C
18d30 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78  reateMutex(mutex
18d40 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
18d50 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
18d60 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
18d70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
18d80 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
18d90 65 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  eMutex() returne
18da0 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
18db0 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
18dc0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
18dd0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
18de0 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
18df0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
18e00 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
18e10 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
18e20 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  n(0);.}../* Retu
18e30 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
18e40 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
18e50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
18e60 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a  (void *mutex) {.
18e70 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
18e80 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
18e90 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
18ea0 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
18eb0 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
18ec0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18ed0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18ee0 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
18ef0 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
18f00 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
18f10 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
18f20 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
18f30 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09  tex = mutex;....
18f40 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
18f50 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
18f60 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65  ock(pthread_mute
18f70 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61  x);...if (pthrea
18f80 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  d_retval != 0) {
18f90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18fa0 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64  _PRINTF("pthread
18fb0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65  _mutex_lock() re
18fc0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
18fd0 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
18fe0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
18ff0 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  (-1);...}..} els
19000 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
19010 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29  _args.LockMutex)
19020 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
19030 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
19040 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65  s.LockMutex(mute
19050 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
19060 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
19070 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
19080 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19090 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
190a0 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
190b0 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
190c0 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
190d0 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
190e0 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
190f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
19100 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
19110 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
19120 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
19130 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  (0);.}../* Retur
19140 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
19150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
19160 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
19170 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b  k(void *mutex) {
19180 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
19190 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
191a0 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
191b0 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
191c0 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
191d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
191e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
191f0 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
19200 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
19210 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
19220 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
19230 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
19240 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09  utex = mutex;...
19250 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
19260 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
19270 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  unlock(pthread_m
19280 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
19290 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
192a0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
192b0 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
192c0 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
192d0 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
192e0 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
192f0 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
19300 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
19310 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
19320 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
19330 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  kMutex) {....cus
19340 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
19350 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
19360 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
19370 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
19380 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
19390 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
193a0 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
193b0 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
193c0 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
193d0 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
193e0 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
193f0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
19400 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
19410 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19420 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
19430 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
19440 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
19450 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54  }..static CK_ATT
19460 52 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65  RIBUTE_PTR cacke
19470 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
19480 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  (CK_OBJECT_CLASS
19490 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74   objectclass, st
194a0 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
194b0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
194c0 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ity, unsigned lo
194d0 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c  ng identity_num,
194e0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
194f0 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69  lCount) {..stati
19500 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72  c CK_BBOOL ck_tr
19510 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20  ue = 1;..static 
19520 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73  CK_BBOOL ck_fals
19530 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 63 20 43  e = 0;..static C
19540 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 75 73 74  K_TRUST ck_trust
19550 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f  ed = CK_TRUSTED_
19560 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55  DELEGATOR;..CK_U
19570 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d 20  LONG numattrs = 
19580 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b  0, retval_count;
19590 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54  ..CK_ATTRIBUTE_T
195a0 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f 74 79  YPE curr_attr_ty
195b0 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  pe;..CK_ATTRIBUT
195c0 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a 72 65  E curr_attr, *re
195d0 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  tval;..CK_VOID_P
195e0 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
195f0 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
19600 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  ..CK_OBJECT_CLAS
19610 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  S ck_object_clas
19620 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49 43 41  s;..CK_CERTIFICA
19630 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72 74 69  TE_TYPE ck_certi
19640 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b  ficate_type;..CK
19650 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79  _KEY_TYPE ck_key
19660 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43  _type;..CK_UTF8C
19670 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31 30 32  HAR ucTmpBuf[102
19680 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65 78 74  4];..SHA1Context
19690 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f   sha1_ctx;..MD5_
196a0 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69  CTX md5_ctx;..ui
196b0 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 73 68 5b  nt8_t sha1_hash[
196c0 53 48 41 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09  SHA1HashSize];..
196d0 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61 73 68  uint8_t md5_hash
196e0 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09  [MD5HashSize];..
196f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
19700 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69  ertificate;..ssi
19710 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
19720 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f  _len = -1, x509_
19730 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70  read_ret;..int p
19740 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41  Value_free;...CA
19750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19760 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63  F("Called (objec
19770 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64  tClass = %lu, id
19780 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75  entity_num = %lu
19790 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
197a0 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73  ong) objectclass
197b0 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  , identity_num);
197c0 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30  ...*pulCount = 0
197d0 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ;...if (objectcl
197e0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
197f0 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74  FICATE && object
19800 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42  class != CKO_PUB
19810 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  LIC_KEY && objec
19820 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
19830 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a  IVATE_KEY && obj
19840 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19850 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19860 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19870 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19880 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
19890 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a  LL), invalid obj
198a0 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09  ect class");....
198b0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
198c0 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74 20 2a  .../* Get Cert *
198d0 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20  /..if (identity 
198e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
198f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19900 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
19910 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e  jects (NULL), in
19920 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20 70 72  valid identiy pr
19930 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72 65 74  ovided");....ret
19940 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
19950 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64  certificate = id
19960 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
19970 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74  ate;..certificat
19980 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  e_len = identity
19990 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
199a0 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69  n;...if (certifi
199b0 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c  cate_len == -1 |
199c0 7c 20 63 65 72 74 69 66 69 63 61 74 65 20 3d 3d  | certificate ==
199d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
199e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
199f0 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65  Returning 0 obje
19a00 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73  cts (NULL), this
19a10 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73 20 6e   identity does n
19a20 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35 30 39  ot have an X.509
19a30 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73   certificate ass
19a40 6f 63 69 61 74 65 64 20 77 69 74 68 20 69 74 20  ociated with it 
19a50 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  and will not wor
19a60 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  k");....return(N
19a70 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  ULL);..}.../* Ve
19a80 72 69 66 79 20 74 68 61 74 20 63 65 72 74 69 66  rify that certif
19a90 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31 20 65  icate is ASN.1 e
19aa0 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63 65 72  ncoded X.509 cer
19ab0 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20  tificate */..if 
19ac0 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28  (x509_to_serial(
19ad0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
19ae0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55  tificate_len, NU
19af0 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43 41 43  LL) < 0) {...CAC
19b00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19b10 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
19b20 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68  jects (NULL), th
19b30 65 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  e X.509 certific
19b40 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ate associated w
19b50 69 74 68 20 74 68 69 73 20 69 64 65 6e 74 69 74  ith this identit
19b60 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 22 29  y is not valid")
19b70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
19b80 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63  );..}...retval_c
19b90 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65 74 76  ount = 64;..retv
19ba0 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76  al = malloc(retv
19bb0 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
19bc0 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66  f(*retval));...f
19bd0 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  or (curr_attr_ty
19be0 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  pe = 0; curr_att
19bf0 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35 33 36  r_type < 0xce536
19c00 33 62 66 3b 20 63 75 72 72 5f 61 74 74 72 5f 74  3bf; curr_attr_t
19c10 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  ype++) {...if (c
19c20 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d  urr_attr_type ==
19c30 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63 75 72   0x800) {....cur
19c40 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 78  r_attr_type = 0x
19c50 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09  ce536300;...}...
19c60 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d 20 30  .pValue_free = 0
19c70 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ;...pValue = NUL
19c80 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  L;...ulValueLen 
19c90 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
19ca0 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 5f  ...switch (curr_
19cb0 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09 09 09  attr_type) {....
19cc0 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a  case CKA_CLASS:.
19cd0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19ce0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19cf0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19d00 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38 6c 78  A_CLASS (0x%08lx
19d10 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19d20 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19d30 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b  r_type);......ck
19d40 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20  _object_class = 
19d50 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09  objectclass;....
19d60 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f  ..pValue = &ck_o
19d70 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09  bject_class;....
19d80 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
19d90 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63  zeof(ck_object_c
19da0 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lass);......CACK
19db0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19dc0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
19dd0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
19de0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
19df0 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53  ((CK_OBJECT_CLAS
19e00 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  S *) pValue), pV
19e10 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19e20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19e30 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19e40 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
19e50 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19e60 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19e70 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19e80 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38  CKA_TOKEN (0x%08
19e90 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
19ea0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
19eb0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
19ec0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
19ed0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
19ee0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
19ef0 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
19f00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19f10 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
19f20 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
19f30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
19f40 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
19f50 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
19f60 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
19f70 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
19f80 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
19f90 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 09 43  A_PRIVATE:.....C
19fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19fb0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
19fc0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 52 49  ttribute CKA_PRI
19fd0 56 41 54 45 20 28 30 78 25 30 38 6c 78 29 20 2e  VATE (0x%08lx) .
19fe0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
19ff0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1a000 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1a010 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
1a020 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1a030 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1a040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1a050 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1a060 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1a070 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
1a080 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1a090 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1a0a0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c  .....}......pVal
1a0b0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
1a0c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a0d0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
1a0e0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
1a0f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1a100 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
1a110 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
1a120 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
1a130 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
1a140 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
1a150 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1a160 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1a170 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1a180 54 52 55 53 54 45 44 3a 0a 09 09 09 09 43 41 43  TRUSTED:.....CAC
1a190 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a1a0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1a1b0 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
1a1c0 45 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ED (0x%08lx) ...
1a1d0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1a1e0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1a1f0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1a200 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1a210 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1a220 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1a230 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a240 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1a250 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1a260 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
1a270 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1a280 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1a290 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1a2a0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
1a2b0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1a2c0 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
1a2d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a2e0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1a2f0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1a300 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1a310 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1a320 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1a330 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1a340 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1a350 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1a360 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ase CKA_MODIFIAB
1a370 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  LE:.....CACKEY_D
1a380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1a390 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1a3a0 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45  e CKA_MODIFIABLE
1a3b0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1a3c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a3d0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1a3e0 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
1a3f0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
1a400 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1a410 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
1a420 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a430 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1a440 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
1a450 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1a460 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
1a470 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
1a480 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1a490 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1a4a0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1a4b0 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c  ..case CKA_LABEL
1a4c0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1a4d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1a4e0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1a4f0 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25 30 38  CKA_LABEL (0x%08
1a500 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a510 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a520 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a530 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 69 64  if (identity->id
1a540 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f  _type == CACKEY_
1a550 49 44 5f 54 59 50 45 5f 50 49 56 29 20 7b 0a 09  ID_TYPE_PIV) {..
1a560 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
1a570 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e  ntity->card.piv.
1a580 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75 6c 56 61  label;......ulVa
1a590 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  lueLen = strlen(
1a5a0 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 20 65  pValue);.....} e
1a5b0 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c  lse {......ulVal
1a5c0 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66  ueLen = snprintf
1a5d0 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d 70 42  ((char *) ucTmpB
1a5e0 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70  uf, sizeof(ucTmp
1a5f0 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79 20  Buf), "Identity 
1a600 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  #%lu", (unsigned
1a610 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
1a620 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56 61 6c 75  num);......pValu
1a630 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09  e = ucTmpBuf;...
1a640 09 09 09 09 69 66 20 28 75 6c 56 61 6c 75 65 4c  ....if (ulValueL
1a650 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54  en >= sizeof(ucT
1a660 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 09 09 09  mpBuf)) {.......
1a670 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a  ulValueLen = 0;.
1a680 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
1a690 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ULL;......}.....
1a6a0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
1a6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1a6c0 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
1a6d0 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
1a6e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1a6f0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1a700 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1a710 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41  KA_VALUE:.....CA
1a720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a730 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1a740 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55  tribute CKA_VALU
1a750 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
1a760 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a770 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1a780 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28  );......switch (
1a790 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09  objectclass) {..
1a7a0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49  ....case CKO_PRI
1a7b0 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09  VATE_KEY:.......
1a7c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a7d0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1a7e0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1a7f0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72  ause we are a pr
1a800 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09  ivate key.");...
1a810 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1a820 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41  .case CKO_NETSCA
1a830 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09 09 09  PE_TRUST:.......
1a840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a850 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1a860 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1a870 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1a880 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1a890 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  ect");........br
1a8a0 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
1a8b0 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09  KO_PUBLIC_KEY:..
1a8c0 09 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
1a8d0 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
1a8e0 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72 65 61  ........x509_rea
1a8f0 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
1a900 70 75 62 6b 65 79 28 63 65 72 74 69 66 69 63 61  pubkey(certifica
1a910 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
1a920 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
1a930 09 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
1a940 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a  ead_ret < 0) { .
1a950 09 09 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  ........pValue =
1a960 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20   NULL;........} 
1a970 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 75  else {.........u
1a980 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
1a990 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
1a9a0 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09  ..}.......}.....
1a9b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
1a9c0 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  ase CKO_CERTIFIC
1a9d0 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75  ATE:.......pValu
1a9e0 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b  e = certificate;
1a9f0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
1aa00 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f  n = certificate_
1aa10 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  len;........brea
1aa20 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  k;.....}......CA
1aa30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1aa40 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1aa50 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
1aa60 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1aa70 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1aa80 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1aa90 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a  ase CKA_ISSUER:.
1aaa0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1aab0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1aac0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1aad0 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c  A_ISSUER (0x%08l
1aae0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1aaf0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1ab00 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1ab10 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
1ab20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
1ab30 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
1ab40 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
1ab50 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1ab60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ab70 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1ab80 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1ab90 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1aba0 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20   certificate or 
1abb0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1abc0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1abd0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1abe0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
1abf0 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
1ac00 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
1ac10 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72  = x509_to_issuer
1ac20 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
1ac30 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
1ac40 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
1ac50 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
1ac60 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
1ac70 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1ac80 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1ac90 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
1aca0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
1acb0 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
1acc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1acd0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1ace0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
1acf0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1ad00 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1ad10 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1ad20 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  ase CKA_SERIAL_N
1ad30 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45  UMBER:.....CACKE
1ad40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ad50 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1ad60 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  bute CKA_SERIAL_
1ad70 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29  NUMBER (0x%08lx)
1ad80 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1ad90 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1ada0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1adb0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
1adc0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
1add0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
1ade0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1adf0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1ae00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ae10 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1ae20 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1ae30 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
1ae40 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65  ertificate or Ne
1ae50 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1ae60 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1ae70 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
1ae80 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
1ae90 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
1aea0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
1aeb0 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63  x509_to_serial(c
1aec0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
1aed0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
1aee0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
1aef0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
1af00 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
1af10 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
1af20 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
1af30 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
1af40 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
1af50 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
1af60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1af70 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1af80 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
1af90 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1afa0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1afb0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1afc0 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a  ase CKA_SUBJECT:
1afd0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1afe0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1aff0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1b000 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25 30  KA_SUBJECT (0x%0
1b010 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1b020 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1b030 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1b040 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1b050 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
1b060 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
1b070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b080 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1b090 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1b0a0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
1b0b0 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a 09 09  rtificate");....
1b0c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1b0d0 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
1b0e0 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
1b0f0 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
1b100 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75  ret = x509_to_su
1b110 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74  bject(certificat
1b120 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
1b130 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
1b140 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
1b150 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
1b160 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1b170 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
1b180 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1b190 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
1b1a0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
1b1b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b1c0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1b1d0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1b1e0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1b1f0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1b200 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1b210 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ....case CKA_ID:
1b220 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b230 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1b240 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1b250 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29 20  KA_ID (0x%08lx) 
1b260 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1b270 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1b280 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1b290 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1b2a0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1b2b0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1b2c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b2d0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b2e0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b2f0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1b300 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1b310 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1b320 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42 75  ..}......ucTmpBu
1b330 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74  f[0] = ((identit
1b340 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29  y_num + 1) >> 8)
1b350 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54   & 0xff;.....ucT
1b360 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65  mpBuf[1] =  (ide
1b370 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26  ntity_num + 1) &
1b380 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c   0xff;......pVal
1b390 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a  ue = &ucTmpBuf;.
1b3a0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1b3b0 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f   2;......CACKEY_
1b3c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1b3d0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
1b3e0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
1b3f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
1b400 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
1b410 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
1b420 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
1b430 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPE:.....CACKEY_
1b440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b450 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1b460 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41  te CKA_CERTIFICA
1b470 54 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78  TE_TYPE (0x%08lx
1b480 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b490 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b4a0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1b4b0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
1b4c0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
1b4d0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1b4e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1b4f0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1b500 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1b510 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
1b520 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
1b530 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1b540 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75  .../* We only su
1b550 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66  pport one certif
1b560 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09  icate type */...
1b570 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  ..ck_certificate
1b580 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30  _type = CKC_X_50
1b590 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  9;......pValue =
1b5a0 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65   &ck_certificate
1b5b0 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _type;.....ulVal
1b5c0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1b5d0 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
1b5e0 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  pe);......CACKEY
1b5f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b600 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  ... returning CK
1b610 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25  C_X_509 (%lu) (%
1b620 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1b630 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43  ed long) *((CK_C
1b640 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
1b650 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1b660 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1b670 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1b680 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b690 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50  case CKA_KEY_TYP
1b6a0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
1b6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1b6c0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1b6d0 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30   CKA_KEY_TYPE (0
1b6e0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1b6f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1b700 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1b710 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1b720 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
1b730 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  TE_KEY && object
1b740 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42  class != CKO_PUB
1b750 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  LIC_KEY) {......
1b760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b770 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1b780 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1b790 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
1b7a0 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  a key.");.......
1b7b0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1b7c0 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70  ../* We only sup
1b7d0 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70  port one key typ
1b7e0 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f  e */.....ck_key_
1b7f0 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a  type = CKK_RSA;.
1b800 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1b810 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09  k_key_type;.....
1b820 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1b830 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29  eof(ck_key_type)
1b840 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1b850 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1b860 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52   returning CKK_R
1b870 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75  SA (%lu) (%p/%lu
1b880 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1b890 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46  ng) *((CK_CERTIF
1b8a0 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56  ICATE_TYPE *) pV
1b8b0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
1b8c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1b8d0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1b8e0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1b8f0 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41  CKA_SIGN:.....CA
1b900 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b910 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1b920 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e  tribute CKA_SIGN
1b930 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1b940 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b950 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1b960 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1b970 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1b980 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1b990 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b9a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1b9b0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1b9c0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1b9d0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1b9e0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1b9f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1ba00 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1ba10 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
1ba20 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
1ba30 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
1ba40 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1ba50 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
1ba60 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
1ba70 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1ba80 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
1ba90 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1baa0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
1bab0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
1bac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1bad0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1bae0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1baf0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1bb00 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1bb10 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1bb20 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1bb30 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1bb40 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1bb50 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a  A_SIGN_RECOVER:.
1bb60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1bb70 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1bb80 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1bb90 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 28  A_SIGN_RECOVER (
1bba0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1bbb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1bbc0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1bbd0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1bbe0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
1bbf0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1bc00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bc10 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1bc20 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1bc30 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
1bc40 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1bc50 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1bc60 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1bc70 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c  ../* We currentl
1bc80 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22  y only support "
1bc90 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64  Sign with Append
1bca0 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75  ix" */.....pValu
1bcb0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
1bcc0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1bcd0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
1bce0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1bcf0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1bd00 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
1bd10 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
1bd20 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
1bd30 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
1bd40 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1bd50 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1bd60 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1bd70 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44  k;....case CKA_D
1bd80 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b  ECRYPT:.....CACK
1bd90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bda0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1bdb0 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50  ibute CKA_DECRYP
1bdc0 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  T (0x%08lx) ..."
1bdd0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1bde0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
1bdf0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
1be00 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
1be10 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
1be20 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1be30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1be40 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
1be50 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
1be60 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
1be70 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1be80 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1be90 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1bea0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
1beb0 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63  ATE_KEY || objec
1bec0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55  tclass == CKO_PU
1bed0 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09  BLIC_KEY) {.....
1bee0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
1bef0 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
1bf00 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1bf10 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
1bf20 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
1bf30 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
1bf40 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1bf50 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
1bf60 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
1bf70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bf80 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1bf90 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
1bfa0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1bfb0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
1bfc0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
1bfd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1bfe0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1bff0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1c000 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09  CKA_SENSITIVE:..
1c010 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c020 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1c030 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1c040 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 25 30  _SENSITIVE (0x%0
1c050 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1c060 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1c070 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1c080 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1c090 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
1c0a0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1c0b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c0c0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1c0d0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1c0e0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
1c0f0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1c100 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1c110 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
1c120 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1c130 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
1c140 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
1c150 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
1c160 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1c170 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
1c180 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1c190 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
1c1a0 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
1c1b0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1c1c0 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
1c1d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c1e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1c1f0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
1c200 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
1c210 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
1c220 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
1c230 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1c240 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1c250 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1c260 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52  ...case CKA_EXTR
1c270 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43 41 43  ACTABLE:.....CAC
1c280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c290 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1c2a0 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54 52 41  ribute CKA_EXTRA
1c2b0 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  CTABLE (0x%08lx)
1c2c0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1c2d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1c2e0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1c2f0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1c300 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1c310 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
1c320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c330 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1c340 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1c350 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
1c360 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
1c370 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1c380 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
1c390 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1c3a0 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
1c3b0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1c3c0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
1c3d0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1c3e0 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
1c3f0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
1c400 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
1c410 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1c420 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
1c430 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
1c440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c450 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1c460 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1c470 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1c480 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
1c490 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1c4a0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1c4b0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1c4c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1c4d0 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a  ase CKA_MODULUS:
1c4e0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c4f0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1c500 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1c510 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 30  KA_MODULUS (0x%0
1c520 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1c530 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1c540 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1c550 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1c560 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
1c570 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1c580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c590 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1c5a0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1c5b0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
1c5c0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1c5d0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1c5e0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
1c5f0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
1c600 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
1c610 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
1c620 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63  509_to_modulus(c
1c630 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
1c640 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
1c650 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
1c660 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
1c670 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
1c680 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
1c690 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
1c6a0 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
1c6b0 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
1c6c0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
1c6d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c6e0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1c6f0 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
1c700 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1c710 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1c720 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1c730 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ase CKA_PUBLIC_E
1c740 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43  XPONENT:.....CAC
1c750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c760 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1c770 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49  ribute CKA_PUBLI
1c780 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30  C_EXPONENT (0x%0
1c790 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1c7a0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1c7b0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1c7c0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1c7d0 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
1c7e0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1c7f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c800 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1c810 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1c820 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
1c830 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1c840 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1c850 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
1c860 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
1c870 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
1c880 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
1c890 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28  509_to_exponent(
1c8a0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
1c8b0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
1c8c0 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
1c8d0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
1c8e0 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
1c8f0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
1c900 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
1c910 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
1c920 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
1c930 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
1c940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c950 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1c960 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
1c970 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1c980 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1c990 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1c9a0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44  case CKA_TRUST_D
1c9b0 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 45  IGITAL_SIGNATURE
1c9c0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1c9d0 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54  UST_NON_REPUDIAT
1c9e0 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ION:....case CKA
1c9f0 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50  _TRUST_KEY_ENCIP
1ca00 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  HERMENT:....case
1ca10 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54 41 5f   CKA_TRUST_DATA_
1ca20 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09  ENCIPHERMENT:...
1ca30 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1ca40 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09  KEY_AGREEMENT:..
1ca50 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1ca60 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a  _KEY_CERT_SIGN:.
1ca70 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1ca80 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63  T_CRL_SIGN:....c
1ca90 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45  ase CKA_TRUST_SE
1caa0 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 63 61  RVER_AUTH:....ca
1cab0 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  se CKA_TRUST_CLI
1cac0 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63 61 73  ENT_AUTH:....cas
1cad0 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45  e CKA_TRUST_CODE
1cae0 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73  _SIGNING:....cas
1caf0 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49  e CKA_TRUST_EMAI
1cb00 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09  L_PROTECTION:...
1cb10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cb20 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1cb30 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1cb40 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38  TRUST_... (0x%08
1cb50 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1cb60 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1cb70 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1cb80 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
1cb90 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75  sted;.....ulValu
1cba0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
1cbb0 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09 09 09  _trusted);......
1cbc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cbd0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1cbe0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
1cbf0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1cc00 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a  g) *((CK_TRUST *
1cc10 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
1cc20 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1cc30 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1cc40 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1cc50 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41  ase CKA_CERT_SHA
1cc60 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b  1_HASH:.....CACK
1cc70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cc80 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1cc90 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 53  ibute CKA_CERT_S
1cca0 48 41 31 5f 48 41 53 48 20 28 30 78 25 30 38 6c  HA1_HASH (0x%08l
1ccb0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1ccc0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1ccd0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1cce0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
1ccf0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1cd00 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1cd10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cd20 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1cd30 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1cd40 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
1cd50 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1cd60 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1cd70 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1cd80 53 48 41 31 52 65 73 65 74 28 26 73 68 61 31 5f  SHA1Reset(&sha1_
1cd90 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31 49 6e  ctx);.....SHA1In
1cda0 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c 20 63  put(&sha1_ctx, c
1cdb0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
1cdc0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
1cdd0 09 09 53 48 41 31 52 65 73 75 6c 74 28 26 73 68  ..SHA1Result(&sh
1cde0 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68 61 73  a1_ctx, sha1_has
1cdf0 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  h);......pValue 
1ce00 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09 09 09  = sha1_hash;....
1ce10 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1ce20 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68 29 3b  zeof(sha1_hash);
1ce30 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1ce40 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1ce50 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
1ce60 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
1ce70 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1ce80 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1ce90 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1cea0 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09  CERT_MD5_HASH:..
1ceb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cec0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1ced0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1cee0 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 20 28  _CERT_MD5_HASH (
1cef0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1cf00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1cf10 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1cf20 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
1cf30 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
1cf40 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
1cf50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cf60 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
1cf70 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
1cf80 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
1cf90 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  ot a Netscape tr
1cfa0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1cfb0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1cfc0 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28 26 6d  ......MD5Init(&m
1cfd0 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44 35  d5_ctx);.....MD5
1cfe0 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74 78 2c  Update(&md5_ctx,
1cff0 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65   certificate, ce
1d000 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
1d010 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35  ....MD5Final(md5
1d020 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74 78 29  _hash, &md5_ctx)
1d030 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
1d040 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c  md5_hash;.....ul
1d050 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1d060 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09  f(md5_hash);....
1d070 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d080 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1d090 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
1d0a0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
1d0b0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
1d0c0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
1d0d0 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
1d0e0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
1d0f0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1d100 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09  (CK_LONG) -1;...
1d110 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
1d120 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75  if (((CK_LONG) u
1d130 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28  lValueLen) != ((
1d140 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a  CK_LONG) -1)) {.
1d150 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72 5f  .../* Push curr_
1d160 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 74  attr onto the st
1d170 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61  ack */....curr_a
1d180 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72 5f  ttr.type = curr_
1d190 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 75  attr_type;....cu
1d1a0 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
1d1b0 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  en = ulValueLen;
1d1c0 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 70  .....curr_attr.p
1d1d0 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  Value = malloc(c
1d1e0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
1d1f0 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28  Len);....memcpy(
1d200 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65  curr_attr.pValue
1d210 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61  , pValue, curr_a
1d220 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ttr.ulValueLen);
1d230 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65 5f  .....if (pValue_
1d240 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29 20  free && pValue) 
1d250 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c 75  {.....free(pValu
1d260 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  e);....}.....if 
1d270 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 74  (numattrs >= ret
1d280 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  val_count) {....
1d290 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
1d2a0 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
1d2b0 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
1d2c0 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a  *retval));....}.
1d2d0 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76  ....memcpy(&retv
1d2e0 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63  al[numattrs], &c
1d2f0 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66  urr_attr, sizeof
1d300 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09  (curr_attr));...
1d310 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d  .numattrs++;...}
1d320 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74  ..}...if (numatt
1d330 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  rs != 0) {...ret
1d340 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61  val_count = numa
1d350 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d  ttrs;...retval =
1d360 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c   realloc(retval,
1d370 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20   retval_count * 
1d380 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
1d390 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72  ;..} else {...fr
1d3a0 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ee(retval);....r
1d3b0 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  etval = NULL;..}
1d3c0 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e  ...*pulCount = n
1d3d0 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45  umattrs;...CACKE
1d3e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d3f0 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62  Returning %lu ob
1d400 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75  jects (%p).", nu
1d410 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20 2a 29  mattrs, (void *)
1d420 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
1d430 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
1d440 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
1d450 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
1d460 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
1d470 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
1d480 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
1d490 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
1d4a0 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52  ount) {..CK_ATTR
1d4b0 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
1d4c0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1d4d0 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64   id_idx, attr_id
1d4e0 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  x;...if (identit
1d4f0 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69  ies == NULL || i
1d500 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
1d510 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  == 0) {...return
1d520 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69  ;..}...for (id_i
1d530 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c  dx = 0; id_idx <
1d540 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
1d550 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  t; id_idx++) {..
1d560 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
1d570 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1d580 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74  es) {....for (at
1d590 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
1d5a0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
1d5b0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1d5c0 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72  utes_count; attr
1d5d0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75  _idx++) {.....cu
1d5e0 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74  rr_attr = &ident
1d5f0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1d600 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64  tributes[attr_id
1d610 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72  x];......if (cur
1d620 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20  r_attr->pValue) 
1d630 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
1d640 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a  _attr->pValue);.
1d650 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
1d660 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f (identities[id
1d670 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1d680 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65  ) {.....free(ide
1d690 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1d6a0 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09  attributes);....
1d6b0 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65  }.....cackey_fre
1d6c0 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69  e_certs(identiti
1d6d0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1d6e0 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b  identity, 1, 1);
1d6f0 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69  ...}..}...free(i
1d700 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73  dentities);.}..s
1d710 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
1d720 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  ong cackey_read_
1d730 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73  dod_identities(s
1d740 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
1d750 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
1d760 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
1d770 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20   num_dod_certs) 
1d780 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
1d790 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f 69 64   cert_idx, id_id
1d7a0 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64 65  x = 0;...if (ide
1d7b0 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
1d7c0 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f   {...return(num_
1d7d0 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a  dod_certs * 3);.
1d7e0 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f 69  .}...for (cert_i
1d7f0 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
1d800 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73   < num_dod_certs
1d810 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
1d820 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1d830 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1d840 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
1d850 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1d860 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
1d870 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
1d880 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  es(CKO_CERTIFICA
1d890 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  TE, &extra_certs
1d8a0 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
1d8b0 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
1d8c0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1d8d0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
1d8e0 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b  unt);...id_idx++
1d8f0 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  ;....identities[
1d900 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1d910 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
1d920 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1d930 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
1d940 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
1d950 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43  butes(CKO_PUBLIC
1d960 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72  _KEY, &extra_cer
1d970 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
1d980 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
1d990 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
1d9a0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1d9b0 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
1d9c0 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65  ++;....identitie
1d9d0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1d9e0 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
1d9f0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1da00 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
1da10 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
1da20 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53  ributes(CKO_NETS
1da30 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78 74  CAPE_TRUST, &ext
1da40 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
1da50 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
1da60 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
1da70 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1da80 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
1da90 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72  id_idx++;..}...r
1daa0 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d  eturn(id_idx);.}
1dab0 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
1dac0 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
1dad0 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65  *cackey_read_ide
1dae0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
1daf0 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
1db00 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
1db10 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73  *ids_found) {..s
1db20 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
1db30 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
1db40 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74  _identities;..st
1db50 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
1db60 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
1db70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1db80 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78   num_ids, id_idx
1db90 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a  , curr_id_type;.
1dba0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
1dbb0 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f  um_certs, num_do
1dbc0 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64  d_certs, cert_id
1dbd0 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f  x;..int include_
1dbe0 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 2c  extra_certs = 0,
1dbf0 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72   include_dod_cer
1dc00 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ts;...CACKEY_DEB
1dc10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1dc20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f  d.");...if (ids_
1dc30 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  found == NULL) {
1dc40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dc50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1dc60 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c  ids_found is NUL
1dc70 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  L");....return(N
1dc80 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  ULL);..}..#ifdef
1dc90 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f   CACKEY_CARD_SLO
1dca0 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f  T_INCLUDE_EXTRA_
1dcb0 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65  CERTS..include_e
1dcc0 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a  xtra_certs = 1;.
1dcd0 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74  #endif...if (get
1dce0 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f  env("CACKEY_DOD_
1dcf0 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54  CERTS_ON_HW_SLOT
1dd00 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
1dd10 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  .include_extra_c
1dd20 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69  erts = 1;..}...i
1dd30 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1dd40 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f  Y_NO_DOD_CERTS_O
1dd50 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20  N_HW_SLOTS") != 
1dd60 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
1dd70 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1dd80 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  0;..}..#ifdef CA
1dd90 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45  CKEY_NO_EXTRA_CE
1dda0 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e 76 28  RTS..if (getenv(
1ddb0 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f 43 45  "CACKEY_EXTRA_CE
1ddc0 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  RTS") != NULL) {
1ddd0 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  ...include_dod_c
1dde0 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65 6c 73  erts = 1;..} els
1ddf0 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f  e {...include_do
1de00 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a  d_certs = 0;..}.
1de10 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74 65 6e  #else..if (geten
1de20 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54  v("CACKEY_NO_EXT
1de30 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55  RA_CERTS") != NU
1de40 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  LL) {...include_
1de50 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  dod_certs = 0;..
1de60 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75  } else {...inclu
1de70 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31  de_dod_certs = 1
1de80 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66  ;..}.#endif...if
1de90 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65   (include_dod_ce
1dea0 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64  rts) {...num_dod
1deb0 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f 66 28  _certs = sizeof(
1dec0 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f 20 73  extra_certs) / s
1ded0 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74  izeof(extra_cert
1dee0 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  s[0]);..} else {
1def0 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ...num_dod_certs
1df00 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73   = 0;..}...if (s
1df10 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot->internal) {
1df20 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63  ...num_ids = cac
1df30 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1df40 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75  ntities(NULL, nu
1df50 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09  m_dod_certs);...
1df60 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20  .if (num_ids != 
1df70 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69  0) {....identiti
1df80 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f  es = malloc(num_
1df90 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64  ids * sizeof(*id
1dfa0 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 09  entities));.....
1dfb0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1dfc0 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74  identities(ident
1dfd0 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63  ities, num_dod_c
1dfe0 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20  erts);...} else 
1dff0 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  {....identities 
1e000 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a  = NULL;...}....*
1e010 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f  ids_found = num_
1e020 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69  ids;....return(i
1e030 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a  dentities);..}..
1e040 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  .pcsc_identities
1e050 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63   = cackey_read_c
1e060 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c  erts(slot, NULL,
1e070 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69   &num_certs);..i
1e080 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
1e090 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
1e0a0 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65  /* Convert numbe
1e0b0 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75  r of Certs to nu
1e0c0 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
1e0d0 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28  */...num_ids = (
1e0e0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
1e0f0 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  - CKO_CERTIFICAT
1e100 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72  E + 1) * num_cer
1e110 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75  ts;....if (inclu
1e120 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20  de_extra_certs) 
1e130 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20  {....num_ids += 
1e140 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1e150 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c  identities(NULL,
1e160 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1e170 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69  ...}....identiti
1e180 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f  es = malloc(num_
1e190 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64  ids * sizeof(*id
1e1a0 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f  entities));..../
1e1b0 2a 20 41 64 64 20 63 65 72 74 69 66 69 63 61 74  * Add certificat
1e1c0 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79 73 2c  es, public keys,
1e1d0 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65 79   and private key
1e1e0 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61 72 74  s from the smart
1e1f0 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78  card */...id_idx
1e200 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72   = 0;...for (cer
1e210 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f  t_idx = 0; cert_
1e220 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b  idx < num_certs;
1e230 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09   cert_idx++) {..
1e240 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74  ..for (curr_id_t
1e250 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ype = CKO_CERTIF
1e260 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74  ICATE; curr_id_t
1e270 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41  ype <= CKO_PRIVA
1e280 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f  TE_KEY; curr_id_
1e290 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64  type++) {.....id
1e2a0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1e2b0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
1e2c0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
1e2d0 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65  tes(curr_id_type
1e2e0 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69  , &pcsc_identiti
1e2f0 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65  es[cert_idx], ce
1e300 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
1e310 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1e320 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  ibutes_count);..
1e330 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1e340 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1e350 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
1e360 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
1e370 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1e380 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65  entity));.....me
1e390 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
1e3a0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1e3b0 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65  ntity, &pcsc_ide
1e3c0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1e3d0 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  ], sizeof(*ident
1e3e0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1e3f0 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a  sc_identity));..
1e400 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1e410 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1e420 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
1e430 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  e = malloc(pcsc_
1e440 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1e450 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
1e460 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
1e470 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
1e480 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1e490 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
1e4a0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
1e4b0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
1e4c0 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
1e4d0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1e4e0 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1e4f0 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b  n);......id_idx+
1e500 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  +;....}...}....i
1e510 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  f (include_extra
1e520 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43 41 43  _certs) {....CAC
1e530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e540 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53 20 47  ("Including US G
1e550 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66  overnment Certif
1e560 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64 77 61  icates on hardwa
1e570 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63  re slot");.....c
1e580 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
1e590 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69  dentities(identi
1e5a0 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e  ties + id_idx, n
1e5b0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09  um_dod_certs);..
1e5c0 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65  .}....cackey_fre
1e5d0 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65  e_certs(pcsc_ide
1e5e0 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72  ntities, num_cer
1e5f0 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f  ts, 1);....*ids_
1e600 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b  found = num_ids;
1e610 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74  ....return(ident
1e620 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a 69 64  ities);..}...*id
1e630 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65  s_found = 0;..re
1e640 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 73  turn(NULL);.}..s
1e650 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
1e660 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28   cackey_get_pin(
1e670 63 68 61 72 20 2a 70 69 6e 62 75 66 29 20 7b 0a  char *pinbuf) {.
1e680 09 46 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63  .FILE *pinfd;..c
1e690 68 61 72 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a  har *fgets_ret;.
1e6a0 09 69 6e 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b  .int pclose_ret;
1e6b0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
1e6c0 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c  n_command == NUL
1e6d0 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41  L) {...return(CA
1e6e0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
1e6f0 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  RIC);..}...if (p
1e700 69 6e 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b  inbuf == NULL) {
1e710 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
1e720 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
1e730 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1e740 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 43 4b  BUG_PRINTF("CACK
1e750 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d  EY_PIN_COMMAND =
1e760 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e   %s", cackey_pin
1e770 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 70 69 6e  _command);...pin
1e780 66 64 20 3d 20 70 6f 70 65 6e 28 63 61 63 6b 65  fd = popen(cacke
1e790 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 22  y_pin_command, "
1e7a0 72 22 29 3b 0a 09 69 66 20 28 70 69 6e 66 64 20  r");..if (pinfd 
1e7b0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1e7c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e7d0 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e  ("Error.  %s: Un
1e7e0 61 62 6c 65 20 74 6f 20 72 75 6e 22 2c 20 63 61  able to run", ca
1e7f0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1e800 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
1e810 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
1e820 4e 29 3b 0a 09 7d 0a 0a 09 66 67 65 74 73 5f 72  N);..}...fgets_r
1e830 65 74 20 3d 20 66 67 65 74 73 28 70 69 6e 62 75  et = fgets(pinbu
1e840 66 2c 20 33 32 2c 20 70 69 6e 66 64 29 3b 0a 09  f, 32, pinfd);..
1e850 69 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d  if (fgets_ret ==
1e860 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 69 6e 62 75   NULL) {...pinbu
1e870 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a  f[0] = '\0';..}.
1e880 0a 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 70  ..pclose_ret = p
1e890 63 6c 6f 73 65 28 70 69 6e 66 64 29 3b 0a 09 69  close(pinfd);..i
1e8a0 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 3d 3d  f (pclose_ret ==
1e8b0 20 2d 31 20 26 26 20 65 72 72 6e 6f 20 3d 3d 20   -1 && errno == 
1e8c0 45 43 48 49 4c 44 29 20 7b 0a 09 09 43 41 43 4b  ECHILD) {...CACK
1e8d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e8e0 22 4e 6f 74 69 63 65 2e 20 20 70 63 6c 6f 73 65  "Notice.  pclose
1e8f0 28 29 20 69 6e 64 69 63 61 74 65 64 20 69 74 20  () indicated it 
1e900 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 74 68  could not get th
1e910 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 65 20  e status of the 
1e920 63 68 69 6c 64 2c 20 61 73 73 75 6d 69 6e 67 20  child, assuming 
1e930 69 74 20 73 75 63 63 65 65 65 64 65 64 20 21 22  it succeeeded !"
1e940 29 3b 0a 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74  );....pclose_ret
1e950 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70   = 0;..}...if (p
1e960 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20 30 29 20  close_ret != 0) 
1e970 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e980 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e990 20 25 73 3a 20 65 78 69 74 65 64 20 77 69 74 68   %s: exited with
1e9a0 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 61 74 75 73   non-zero status
1e9b0 20 6f 66 20 25 69 22 2c 20 63 61 63 6b 65 79 5f   of %i", cackey_
1e9c0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 70 63 6c  pin_command, pcl
1e9d0 6f 73 65 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ose_ret);....ret
1e9e0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1e9f0 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09  E_BADPIN);..}...
1ea00 69 66 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75  if (strlen(pinbu
1ea10 66 29 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b  f) < 1) {...CACK
1ea20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ea30 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 72 65 74  "Error.  %s: ret
1ea40 75 72 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c 20  urned no data", 
1ea50 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1ea60 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nd);....return(C
1ea70 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
1ea80 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  PIN);..}...if (p
1ea90 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e  inbuf[strlen(pin
1eaa0 62 75 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e  buf) - 1] == '\n
1eab0 27 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b 73 74  ') {...pinbuf[st
1eac0 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31  rlen(pinbuf) - 1
1ead0 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a 09 72  ] = '\0';..}...r
1eae0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
1eaf0 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  C_S_OK);.}..CK_D
1eb00 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1eb10 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69  K_RV, C_Initiali
1eb20 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
1eb30 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b  pInitArgs) {..CK
1eb40 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52  _C_INITIALIZE_AR
1eb50 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a  GS CK_PTR args;.
1eb60 09 75 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68  .uint32_t idx, h
1eb70 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e  ighest_slot;..in
1eb80 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  t mutex_init_ret
1eb90 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 64  ;..int include_d
1eba0 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b  od_certs;...CACK
1ebb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ebc0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1ebd0 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c   (cackey_initial
1ebe0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ebf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ec00 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69  rror.  Already i
1ec10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1ec20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1ec30 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e  PTOKI_ALREADY_IN
1ec40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1ec50 09 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21  .if (pInitArgs !
1ec60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73  = NULL) {...args
1ec70 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09   = pInitArgs;...
1ec80 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61  memcpy(&cackey_a
1ec90 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f  rgs, args, sizeo
1eca0 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b  f(cackey_args));
1ecb0 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1ecc0 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  eateMutex == NUL
1ecd0 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1ece0 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  oyMutex == NULL 
1ecf0 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1ed00 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
1ed10 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1ed20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  == NULL) {....if
1ed30 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
1ed40 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
1ed50 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
1ed60 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1ed70 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  s->LockMutex != 
1ed80 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
1ed90 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  lockMutex != NUL
1eda0 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
1edb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1edc0 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e  ror. Some, but n
1edd0 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67  ot All threading
1ede0 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
1edf0 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  ided.");......re
1ee00 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1ee10 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09  TS_BAD);....}...
1ee20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
1ee30 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
1ee40 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1ee50 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
1ee60 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
1ee70 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
1ee80 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
1ee90 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
1eea0 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
1eeb0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1eec0 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
1eed0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1eee0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1eef0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1ef00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1ef10 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
1ef20 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
1ef30 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1ef40 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ive = 0;..}...fo
1ef50 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1ef60 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1ef70 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1ef80 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1ef90 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
1efa0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1efb0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63  .active = 0;...c
1efc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1efd0 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
1efe0 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ULL;...cackey_sl
1eff0 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
1f000 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
1f010 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1f020 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
1f030 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
1f040 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1f050 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
1f060 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1f070 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f  lots[idx].token_
1f080 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63  flags = 0;...cac
1f090 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
1f0a0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  abel = NULL;...c
1f0b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1f0c0 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09  .internal = 0;..
1f0d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1f0e0 78 5d 2e 69 64 5f 74 79 70 65 5f 68 69 6e 74 20  x].id_type_hint 
1f0f0 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
1f100 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 7d 0a 0a 23 69  _UNKNOWN;..}..#i
1f110 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45  fdef CACKEY_NO_E
1f120 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66 20 28  XTRA_CERTS..if (
1f130 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 45  getenv("CACKEY_E
1f140 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20  XTRA_CERTS") != 
1f150 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
1f160 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b  e_dod_certs = 1;
1f170 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63  ..} else {...inc
1f180 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1f190 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66   0;..}.#else..if
1f1a0 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1f1b0 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22  _NO_EXTRA_CERTS"
1f1c0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  ) != NULL) {...i
1f1d0 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1f1e0 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
1f1f0 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1f200 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64  rts = 1;..}.#end
1f210 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64 65  if...if (include
1f220 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d 20 30 29  _dod_certs == 0)
1f230 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f240 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20  G_PRINTF("Asked 
1f250 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44  not to include D
1f260 6f 44 20 63 65 72 74 69 66 69 63 61 74 65 73 22  oD certificates"
1f270 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68  );..} else {...h
1f280 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73  ighest_slot = (s
1f290 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1f2a0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1f2b0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d  key_slots[0])) -
1f2c0 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   1;....CACKEY_DE
1f2d0 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c  BUG_PRINTF("Incl
1f2e0 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20  uding DoD certs 
1f2f0 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75  in slot %lu", (u
1f300 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69  nsigned long) hi
1f310 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09  ghest_slot);....
1f320 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
1f330 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76  hest_slot].activ
1f340 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
1f350 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1f360 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31  ot].internal = 1
1f370 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1f380 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c  [highest_slot].l
1f390 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64  abel = (unsigned
1f3a0 20 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f 76   char *) "US Gov
1f3b0 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63  ernment Certific
1f3c0 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f  ates";...cackey_
1f3d0 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1f3e0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
1f3f0 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63 61  = "CACKey";...ca
1f400 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1f410 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66  st_slot].token_f
1f420 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63  lags = 0;..}...c
1f430 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1f440 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61  d = 1;...if (!ca
1f450 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69  ckey_biglock_ini
1f460 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69  t) {...mutex_ini
1f470 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d  t_ret = cackey_m
1f480 75 74 65 78 5f 63 72 65 61 74 65 28 26 63 61 63  utex_create(&cac
1f490 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1f4a0 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f  .if (mutex_init_
1f4b0 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  ret != 0) {....C
1f4c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f4d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65  TF("Error.  Mute
1f4e0 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1f4f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
1f500 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f  return(CKR_CANT_
1f510 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  LOCK);...}....ca
1f520 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69  ckey_biglock_ini
1f530 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  t = 1;..}.../* D
1f540 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20  efine a command 
1f550 74 6f 20 70 72 6f 6d 70 74 20 75 73 65 72 20 66  to prompt user f
1f560 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66 64  or a PIN */.#ifd
1f570 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  ef CACKEY_PIN_CO
1f580 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09 63  MMAND_DEFAULT..c
1f590 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1f5a0 64 20 3d 20 73 74 72 64 75 70 28 43 41 43 4b 45  d = strdup(CACKE
1f5b0 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f  Y_MACRO_DEFAULT_
1f5c0 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f  XSTR(CACKEY_PIN_
1f5d0 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 29  COMMAND_DEFAULT)
1f5e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1f5f0 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  f CACKEY_PIN_COM
1f600 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55  MAND_XONLY_DEFAU
1f610 4c 54 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  LT..if (getenv("
1f620 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c  DISPLAY") != NUL
1f630 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69  L) {...cackey_pi
1f640 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64  n_command = strd
1f650 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1f660 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1f670 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1f680 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 29 3b  XONLY_DEFAULT));
1f690 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1f6a0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1f6b0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d  PIN_COMMAND") !=
1f6c0 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
1f6d0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20  y_pin_command = 
1f6e0 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43  strdup(getenv("C
1f6f0 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1f700 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67  D"));..}...if (g
1f710 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1f720 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22  N_COMMAND_XONLY"
1f730 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65 74  ) != NULL && get
1f740 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20 21  env("DISPLAY") !
1f750 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
1f760 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1f770 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22   strdup(getenv("
1f780 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1f790 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a 09 7d 0a  ND_XONLY"));..}.
1f7a0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 52  .#ifdef CACKEY_R
1f7b0 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f  EADERS_INCLUDE_O
1f7c0 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61 63  NLY_DEFAULT..cac
1f7d0 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
1f7e0 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64 75  ude_only = strdu
1f7f0 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44  p(CACKEY_MACRO_D
1f800 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b  EFAULT_XSTR(CACK
1f810 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55  EY_READERS_INCLU
1f820 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29  DE_ONLY_DEFAULT)
1f830 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1f840 66 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53  f CACKEY_READERS
1f850 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c 54  _EXCLUDE_DEFAULT
1f860 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  ..cackey_readers
1f870 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64 75  _exclude = strdu
1f880 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44  p(CACKEY_MACRO_D
1f890 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b  EFAULT_XSTR(CACK
1f8a0 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c 55  EY_READERS_EXCLU
1f8b0 44 45 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23 65  DE_DEFAULT));.#e
1f8c0 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e  ndif...if (geten
1f8d0 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52  v("CACKEY_READER
1f8e0 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29  S_INCLUDE_ONLY")
1f8f0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   != NULL) {...ca
1f900 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1f910 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64  lude_only = strd
1f920 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  up(getenv("CACKE
1f930 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44  Y_READERS_INCLUD
1f940 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69 66  E_ONLY"));....if
1f950 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73   (cackey_readers
1f960 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30 5d  _include_only[0]
1f970 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09 66   == '\0') {....f
1f980 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65  ree(cackey_reade
1f990 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29  rs_include_only)
1f9a0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61  ;.....cackey_rea
1f9b0 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c  ders_include_onl
1f9c0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d  y = NULL;...}..}
1f9d0 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1f9e0 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58  ACKEY_READERS_EX
1f9f0 43 4c 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c 29  CLUDE") != NULL)
1fa00 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64   {...cackey_read
1fa10 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74  ers_exclude = st
1fa20 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43  rdup(getenv("CAC
1fa30 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c  KEY_READERS_EXCL
1fa40 55 44 45 22 29 29 3b 0a 0a 09 09 69 66 20 28 63  UDE"));....if (c
1fa50 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78  ackey_readers_ex
1fa60 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30 27  clude[0] == '\0'
1fa70 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
1fa80 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
1fa90 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  de);.....cackey_
1faa0 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20  readers_exclude 
1fab0 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a  = NULL;...}..}..
1fac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fad0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1fae0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1faf0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1fb00 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1fb10 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1fb20 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65  K_RV, C_Finalize
1fb30 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52  )(CK_VOID_PTR pR
1fb40 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74  eserved) {..uint
1fb50 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  32_t idx;...CACK
1fb60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fb70 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1fb80 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e   (pReserved != N
1fb90 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1fba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1fbb0 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
1fbc0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
1fbd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1fbe0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1fbf0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1fc00 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1fc10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fc20 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1fc30 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1fc40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1fc50 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1fc60 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f  ALIZED);..}...fo
1fc70 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1fc80 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1fc90 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1fca0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1fcb0 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1fcc0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
1fcd0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
1fce0 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f  tive) {....C_Clo
1fcf0 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
1fd00 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
1fd10 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
1fd20 5f 61 6c 6c 28 31 29 3b 0a 0a 09 66 6f 72 20 28  _all(1);...for (
1fd30 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1fd40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fd50 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1fd60 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1fd70 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1fd80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1fd90 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1fda0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1fdb0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1fdc0 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63  ts[idx].cached_c
1fdd0 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b 65  erts) {....cacke
1fde0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61 63  y_free_certs(cac
1fdf0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63  key_slots[idx].c
1fe00 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61 63  ached_certs, cac
1fe10 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63  key_slots[idx].c
1fe20 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
1fe30 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b 65  t, 1);.....cacke
1fe40 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63  y_slots[idx].cac
1fe50 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c  hed_certs = NULL
1fe60 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
1fe70 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
1fe80 74 28 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  t();...if (cacke
1fe90 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
1fea0 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28   NULL) {...free(
1feb0 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1fec0 6e 64 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 70  nd);....cackey_p
1fed0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c  in_command = NUL
1fee0 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  L;..}...if (cack
1fef0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
1ff00 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29  de_only != NULL)
1ff10 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
1ff20 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
1ff30 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 63 61 63 6b 65  _only);....cacke
1ff40 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
1ff50 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09  e_only = NULL;..
1ff60 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 72  }...if (cackey_r
1ff70 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 21  eaders_exclude !
1ff80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65  = NULL) {...free
1ff90 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  (cackey_readers_
1ffa0 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 63 61 63  exclude);....cac
1ffb0 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1ffc0 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  ude = NULL;..}..
1ffd0 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
1ffe0 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  zed = 0;...CACKE
1fff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20000 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
20010 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
20020 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
20030 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20040 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20050 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e  C_GetInfo)(CK_IN
20060 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
20070 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
20080 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
20090 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
200a0 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
200b0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69  c CK_UTF8CHAR li
200c0 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
200d0 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a  [] = "CACKey";..
200e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
200f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20100 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
20110 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
20120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20130 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
20140 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
20150 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
20160 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
20170 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
20180 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
20190 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
201a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
201b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
201c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
201d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
201e0 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72  ;..}...pInfo->cr
201f0 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61  yptokiVersion.ma
20200 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
20210 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
20220 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
20230 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  xff;..pInfo->cry
20240 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e  ptokiVersion.min
20250 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
20260 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
20270 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
20280 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  f;...memset(pInf
20290 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
202a0 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
202b0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
202c0 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
202d0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
202e0 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
202f0 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
20300 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
20310 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  1);...pInfo->fla
20320 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d  gs = 0x00;...mem
20330 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  set(pInfo->libra
20340 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  ryDescription, '
20350 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
20360 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
20370 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
20380 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
20390 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61  scription, libra
203a0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  ryDescription, s
203b0 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73  izeof(libraryDes
203c0 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
203d0 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
203e0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
203f0 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
20400 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
20410 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  ff;..pInfo->libr
20420 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  aryVersion.minor
20430 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
20440 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
20450 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
20460 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20470 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
20480 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
20490 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
204a0 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73  }../*. * Process
204b0 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
204c0 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70  , and create map
204d0 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61  ping between rea
204e0 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f  der name and slo
204f0 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49  t ID. */.CK_DEFI
20500 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20510 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  V, C_GetSlotList
20520 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e  )(CK_BBOOL token
20530 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54  Present, CK_SLOT
20540 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73  _ID_PTR pSlotLis
20550 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
20560 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
20570 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63 61  tic int first_ca
20580 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  ll = 1;..int mut
20590 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
205a0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
205b0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e  ;..CK_ULONG coun
205c0 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  t, slot_count = 
205d0 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f  0, currslot, slo
205e0 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63  t_idx;..char *pc
205f0 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73  sc_readers, *pcs
20600 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63  c_readers_s, *pc
20610 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 63  sc_readers_e;..c
20620 68 61 72 20 2a 72 65 61 64 65 72 5f 63 68 65 63  har *reader_chec
20630 6b 5f 70 61 74 74 65 72 6e 3b 0a 09 44 57 4f 52  k_pattern;..DWOR
20640 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  D pcsc_readers_l
20650 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
20660 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b  listreaders_ret;
20670 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65  ..size_t curr_re
20680 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73  ader_len;..int s
20690 6c 6f 74 5f 72 65 73 65 74 3b 0a 09 69 6e 74 20  lot_reset;..int 
206a0 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 3b 0a  include_reader;.
206b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
206c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
206d0 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74  ;...if (pulCount
206e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
206f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20700 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75  F("Error. pulCou
20710 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
20720 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
20730 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
20740 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20750 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20770 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20780 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20790 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
207a0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
207b0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75  ALIZED);..}...mu
207c0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
207d0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
207e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
207f0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
20800 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20820 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
20830 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20840 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20850 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f  L_ERROR);..}.../
20860 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20  * Clear list of 
20870 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72  slots */..slot_r
20880 65 73 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 70  eset = 0;..if (p
20890 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69 66  SlotList) {...if
208a0 20 28 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b 0a   (first_call) {.
208b0 09 09 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20  ...first_call = 
208c0 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73 65  0;.....slot_rese
208d0 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  t = 1;...}..../*
208e0 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 73   If any of the s
208f0 6c 6f 74 73 20 68 61 76 65 20 62 65 65 6e 20 72  lots have been r
20900 65 73 65 74 20 74 68 65 6e 20 70 75 72 67 65 20  eset then purge 
20910 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
20920 61 6e 64 20 63 68 65 63 6b 20 61 67 61 69 6e 20  and check again 
20930 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c  */...for (currsl
20940 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
20950 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20960 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20970 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20980 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
20990 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
209a0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
209b0 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09  .internal) {....
209c0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
209d0 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
209e0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
209f0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 6f  active) {.....co
20a00 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
20a10 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
20a20 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74  s[currslot].slot
20a30 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09 73 6c  _reset) {.....sl
20a40 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09  ot_reset = 1;...
20a50 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
20a60 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 72  .}....if (slot_r
20a70 65 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  eset) {....CACKE
20a80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20a90 50 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74  Purging all slot
20aa0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b   information.");
20ab0 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
20ac0 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
20ad0 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
20ae0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73  actually being s
20af0 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
20b00 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
20b10 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
20b20 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 31 29 3b  sconnect_all(1);
20b30 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
20b40 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
20b50 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20b60 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20b70 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20b80 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
20b90 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65   {.....if (cacke
20ba0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
20bb0 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
20bc0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
20bd0 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
20be0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
20bf0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a  ctive = 0;....}.
20c00 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  ..}..}.../* Dete
20c10 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65  rmine list of re
20c20 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63  aders */..pcsc_c
20c30 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
20c40 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
20c50 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  ();..if (pcsc_co
20c60 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
20c70 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
20c80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20c90 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
20ca0 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c  on to PC/SC fail
20cb0 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  ed, assuming no 
20cc0 68 61 72 64 77 61 72 65 20 73 6c 6f 74 73 22 29  hardware slots")
20cd0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63  ;..} else {...pc
20ce0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d  sc_readers_len =
20cf0 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73   0;....scard_lis
20d00 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
20d10 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
20d20 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
20d30 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  dle, NULL, NULL,
20d40 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
20d50 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  en);....if (scar
20d60 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20d70 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d  t == SCARD_F_COM
20d80 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 41  M_ERROR) {....CA
20d90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20da0 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c  F("Error. SCardL
20db0 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65 74  istReaders() ret
20dc0 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 4f  urned SCARD_F_CO
20dd0 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d 69  MM_ERROR, assumi
20de0 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  ng Connection to
20df0 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61 79   PC/SC went away
20e00 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22  . Reconnecting."
20e10 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  );.....cackey_pc
20e20 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b  sc_disconnect();
20e30 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
20e40 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43  connect();.....C
20e50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20e60 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72 64  TF("Trying SCard
20e70 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61 67  ListReaders() ag
20e80 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 5f  ain");....scard_
20e90 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
20ea0 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  = SCardListReade
20eb0 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  rs(*cackey_pcsc_
20ec0 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55  handle, NULL, NU
20ed0 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72  LL, &pcsc_reader
20ee0 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69  s_len);...}....i
20ef0 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
20f00 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
20f10 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
20f20 5f 42 55 46 46 45 52 29 20 7b 0a 09 09 09 43 41  _BUFFER) {....CA
20f30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20f40 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c  F("Error. SCardL
20f50 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65 74  istReaders() ret
20f60 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e  urned SCARD_E_IN
20f70 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
20f80 52 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73  R, assuming this
20f90 20 69 73 20 61 20 62 75 67 20 28 65 2e 67 2e 2c   is a bug (e.g.,
20fa0 20 47 6f 6f 67 6c 65 20 50 43 53 43 29 20 61 6e   Google PCSC) an
20fb0 64 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6d  d allocating a m
20fc0 61 73 73 69 76 65 20 61 6d 6f 75 6e 74 20 6f 66  assive amount of
20fd0 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
20fe0 68 65 20 72 65 61 64 65 72 20 6c 69 73 74 2e 22  he reader list."
20ff0 29 3b 0a 0a 09 09 09 70 63 73 63 5f 72 65 61 64  );.....pcsc_read
21000 65 72 73 5f 6c 65 6e 20 3d 20 33 32 37 36 38 3b  ers_len = 32768;
21010 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
21020 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 41 52  aders_ret = SCAR
21030 44 5f 53 5f 53 55 43 43 45 53 53 3b 0a 09 09 7d  D_S_SUCCESS;...}
21040 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
21050 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
21060 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
21070 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72 73   && pcsc_readers
21080 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
21090 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20 6d  pcsc_readers = m
210a0 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64 65  alloc(pcsc_reade
210b0 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63  rs_len);....pcsc
210c0 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63 73  _readers_s = pcs
210d0 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09 73  c_readers;.....s
210e0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
210f0 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
21100 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
21110 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
21120 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c  L, pcsc_readers,
21130 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
21140 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72  en);....if (scar
21150 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
21160 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
21170 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73 63  CESS) {.....pcsc
21180 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63 73  _readers_e = pcs
21190 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73 63  c_readers + pcsc
211a0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09  _readers_len;...
211b0 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
211c0 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
211d0 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
211e0 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
211f0 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
21200 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
21210 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
21220 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
21230 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c  11 */.....currsl
21240 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77 68 69 6c  ot = 1;.....whil
21250 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
21260 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
21270 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64  ) {....../* Find
21280 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
21290 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72  slot */......for
212a0 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   (; currslot < (
212b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
212c0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
212d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
212e0 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
212f0 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
21300 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
21310 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
21320 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d  ..break;.......}
21330 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75  ......}.......cu
21340 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20  rr_reader_len = 
21350 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64  strlen(pcsc_read
21360 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  ers);.......if (
21370 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20  (pcsc_readers + 
21380 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29  curr_reader_len)
21390 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   > pcsc_readers_
213a0 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  e) {.......break
213b0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
213c0 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  f (curr_reader_l
213d0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
213e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
213f0 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
21400 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  t >= (sizeof(cac
21410 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
21420 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21430 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43  [0]))) {.......C
21440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21450 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72  TF("Found more r
21460 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74  eaders than slot
21470 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21  s are available!
21480 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
21490 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43  ;......}.......C
214a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
214b0 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72  TF("Found reader
214c0 3a 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d  : %s (currslot =
214d0 20 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61   %lu)", pcsc_rea
214e0 64 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20  ders, (unsigned 
214f0 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
21500 0a 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65  .......if (cacke
21510 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
21520 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29 20  e_only != NULL) 
21530 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
21540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
21550 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e  ed to include on
21560 6c 79 20 72 65 61 64 65 72 73 20 6d 61 74 63 68  ly readers match
21570 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b 65 79  ing: %s", cackey
21580 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
21590 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09 69  _only);........i
215a0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
215b0 30 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  0;.......reader_
215c0 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
215d0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
215e0 6e 63 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09 09  nclude_only;....
215f0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63 61 63  ..} else if (cac
21600 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
21610 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ude != NULL) {..
21620 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
21630 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20  G_PRINTF("Asked 
21640 74 6f 20 65 78 63 6c 75 64 65 20 72 65 61 64 65  to exclude reade
21650 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25 73 22  rs matching: %s"
21660 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  , cackey_readers
21670 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 09  _exclude);......
21680 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72  ..include_reader
21690 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64   = 1;.......read
216a0 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e  er_check_pattern
216b0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72   = cackey_reader
216c0 73 5f 65 78 63 6c 75 64 65 3b 0a 09 09 09 09 09  s_exclude;......
216d0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 69  } else {.......i
216e0 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
216f0 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72 5f  1;.......reader_
21700 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20  check_pattern = 
21710 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  NULL;......}....
21720 09 09 09 69 66 20 28 72 65 61 64 65 72 5f 63 68  ...if (reader_ch
21730 65 63 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20 4e  eck_pattern != N
21740 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 66 20  ULL) {.......if 
21750 28 73 74 72 73 74 72 28 70 63 73 63 5f 72 65 61  (strstr(pcsc_rea
21760 64 65 72 73 2c 20 72 65 61 64 65 72 5f 63 68 65  ders, reader_che
21770 63 6b 5f 70 61 74 74 65 72 6e 29 20 21 3d 20 4e  ck_pattern) != N
21780 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 43 41  ULL) {........CA
21790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
217a0 46 28 22 54 68 69 73 20 72 65 61 64 65 72 20 6d  F("This reader m
217b0 61 74 63 68 65 64 20 74 68 65 20 70 61 74 74 65  atched the patte
217c0 72 6e 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09 09  rn.");..........
217d0 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61  .....include_rea
217e0 64 65 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f 72  der = !include_r
217f0 65 61 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a 09  eader;.......}..
21800 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
21810 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 21  include_reader !
21820 3d 20 31 29 20 7b 0a 09 09 09 09 09 09 43 41 43  = 1) {.......CAC
21830 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21840 28 22 53 6b 69 70 70 69 6e 67 20 74 68 69 73 20  ("Skipping this 
21850 72 65 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09 09  reader.");......
21860 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
21870 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
21880 6e 20 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63 6f  n + 1;........co
21890 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a 0a  ntinue;......}..
218a0 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
218b0 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
218c0 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
218d0 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61  actually being a
218e0 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20  sked supply the 
218f0 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
21900 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
21910 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
21920 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20  if (slot_reset) 
21930 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  {........cackey_
21940 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
21950 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09  active = 1;.....
21960 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21970 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
21980 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63  al = 0;........c
21990 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
219a0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
219b0 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f  r = strdup(pcsc_
219c0 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09  readers);.......
219d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
219e0 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72  rrslot].pcsc_car
219f0 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
21a00 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
21a10 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
21a20 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
21a30 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
21a40 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21a50 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot].transaction_
21a60 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
21a70 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63 61 63  ;........if (cac
21a80 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
21a90 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
21aa0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21ab0 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  currslot].token_
21ac0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
21ad0 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09  N_REQUIRED;.....
21ae0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
21af0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
21b00 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
21b10 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09  _flags = 0;.....
21b20 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b  ...}........cack
21b30 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
21b40 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  t].label = NULL;
21b50 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  .........cackey_
21b60 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
21b70 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  &cackey_slots[cu
21b80 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09  rrslot]);.......
21b90 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
21ba0 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65  ......if (!cacke
21bb0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21bc0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
21bd0 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c  .../* Artificial
21be0 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ly increase the 
21bf0 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65  number of active
21c00 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77   slots by what w
21c10 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76  ill become activ
21c20 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b  e */........CACK
21c30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21c40 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65  "Found in-active
21c50 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69   slot %lu, but i
21c60 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65  t will be active
21c70 20 61 66 74 65 72 20 61 20 72 65 73 65 74 20 2d   after a reset -
21c80 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74  - marking as act
21c90 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69  ive for accounti
21ca0 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75  ng purposes", (u
21cb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
21cc0 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09  rrslot);........
21cd0 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09  .slot_count++;..
21ce0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09  .....}......}...
21cf0 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
21d00 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
21d10 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
21d20 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
21d30 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
21d40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21d50 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c  NTF("Second call
21d60 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
21d70 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
21d80 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
21d90 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
21da0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
21db0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
21dc0 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
21dd0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
21de0 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66  ret);....}.....f
21df0 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73  ree(pcsc_readers
21e00 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  _s);...} else {.
21e10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21e20 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61  PRINTF("First ca
21e30 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52  ll to SCardListR
21e40 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72  eaders failed, r
21e50 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43  eturn %s/%li", C
21e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
21e70 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
21e80 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
21e90 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  rs_ret), (long) 
21ea0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
21eb0 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  s_ret);...}..}..
21ec0 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
21ed0 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   0; currslot < (
21ee0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
21ef0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
21f00 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
21f10 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
21f20 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
21f30 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
21f40 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ve) {....CACKEY_
21f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
21f60 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20  und active slot 
21f70 25 6c 75 2c 20 72 65 61 64 65 72 20 3d 20 25 73  %lu, reader = %s
21f80 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
21f90 67 29 20 63 75 72 72 73 6c 6f 74 2c 20 63 61 63  g) currslot, cac
21fa0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21fb0 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
21fc0 3b 0a 0a 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ;.....slot_count
21fd0 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  ++;...}..}...mut
21fe0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21ff0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22000 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22010 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22020 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22040 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
22050 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
22060 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22070 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22080 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20  ..if (pSlotList 
22090 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
220a0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
220b0 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  unt;....CACKEY_D
220c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
220d0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
220e0 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
220f0 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20  eaders, but not 
22100 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c  storing IDs (pSl
22110 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22  otList == NULL)"
22120 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67  , CKR_OK, (unsig
22130 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63  ned long) slot_c
22140 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
22150 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63  (CKR_OK);..}...c
22160 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74  ount = *pulCount
22170 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73  ;..if (count < s
22180 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43  lot_count) {...C
22190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
221a0 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
221b0 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
221c0 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61  tries, but we ha
221d0 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22  ve %lu entries."
221e0 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  , count, slot_co
221f0 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  unt);....CACKEY_
22200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22210 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
22220 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a  ER_TOO_SMALL");.
22230 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
22240 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
22250 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ...}...mutex_ret
22260 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22270 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
22280 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22290 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
222a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
222b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
222c0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
222d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
222e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
222f0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78  );..}...slot_idx
22300 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
22310 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73  slot = 0; (currs
22320 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
22330 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
22340 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
22350 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f  s[0]))); currslo
22360 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  t++) {...if (!ca
22370 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
22380 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
22390 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
223a0 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20  ...if (slot_idx 
223b0 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  >= count) {....C
223c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
223d0 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
223e0 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
223f0 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75  tries, but we ju
22400 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 74  st tried to writ
22410 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64  e to the %lu ind
22420 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c  ex -- ignoring",
22430 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78   count, slot_idx
22440 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
22450 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73  ...}....pSlotLis
22460 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75  t[slot_idx] = cu
22470 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69  rrslot;...slot_i
22480 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  dx++;..}...mutex
22490 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
224a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
224b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
224c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
224d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
224e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
224f0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
22500 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
22510 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22520 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
22530 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74  *pulCount = slot
22540 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59  _count;...CACKEY
22550 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22560 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
22570 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
22580 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f   readers.", CKR_
22590 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  OK, (unsigned lo
225a0 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  ng) slot_count);
225b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
225c0 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e  );...tokenPresen
225d0 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74  t = tokenPresent
225e0 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
225f0 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
22600 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45  ning */.}..CK_DE
22610 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22620 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e  _RV, C_GetSlotIn
22630 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
22640 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49  lotID, CK_SLOT_I
22650 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
22660 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
22670 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70  CHAR slotDescrip
22680 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
22690 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74   Slot";..int mut
226a0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
226b0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
226c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
226d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
226e0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
226f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
22700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22710 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
22720 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
22730 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
22740 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
22750 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22760 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22780 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22790 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
227a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
227b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
227c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
227d0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
227e0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
227f0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
22800 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
22810 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
22820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22830 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
22840 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
22850 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
22860 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
22870 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
22880 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
22890 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
228a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
228b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
228c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
228d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
228e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
228f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22900 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
22910 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
22920 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
22930 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
22940 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
22950 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
22960 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22970 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22980 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
22990 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
229a0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
229b0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
229c0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
229d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
229e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
229f0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
22a00 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
22a10 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
22a20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69  CKF_HW_SLOT;...i
22a30 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
22a40 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61  [slotID].interna
22a50 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  l) {...pInfo->fl
22a60 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56  ags |= CKF_REMOV
22a70 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a  ABLE_DEVICE;..}.
22a80 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
22a90 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
22aa0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22ab0 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) == CACKEY_PCSC
22ac0 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
22ad0 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
22ae0 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50  s |= CKF_TOKEN_P
22af0 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74  RESENT;..}...byt
22b00 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72  es_to_copy = str
22b10 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  len(cackey_slots
22b20 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
22b30 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65  ader);..if (size
22b40 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
22b50 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65  cturerID) < byte
22b60 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62  s_to_copy) {...b
22b70 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
22b80 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
22b90 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d  ufacturerID);..}
22ba0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
22bb0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
22bc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22bd0 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
22be0 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
22bf0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
22c00 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
22c10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22c20 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
22c30 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22c40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22c50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22c60 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
22c70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22c80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22c90 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  R);..}...memset(
22ca0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
22cb0 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a  iption, ' ', siz
22cc0 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  eof(pInfo->slotD
22cd0 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
22ce0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f  emcpy(pInfo->slo
22cf0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c  tDescription, sl
22d00 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
22d10 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69  izeof(slotDescri
22d20 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d  ption) - 1);...m
22d30 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
22d40 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
22d50 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
22d60 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
22d70 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
22d80 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
22d90 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
22da0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
22db0 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
22dc0 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
22dd0 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
22de0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
22df0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
22e00 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
22e10 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
22e20 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
22e30 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
22e40 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f   0x00;...CACKEY_
22e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22e60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22e70 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
22e80 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
22e90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22ea0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22eb0 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b  GetTokenInfo)(CK
22ec0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
22ed0 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50   CK_TOKEN_INFO_P
22ee0 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
22ef0 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
22f00 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d  manufacturerID[]
22f10 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d   = "U.S. Governm
22f20 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ent";..static CK
22f30 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c  _UTF8CHAR defaul
22f40 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e  tLabel[] = "Unkn
22f50 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61  own Token";..sta
22f60 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
22f70 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54  model[] = "CAC T
22f80 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63  oken";..struct c
22f90 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
22fa0 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
22fb0 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
22fc0 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  long num_certs;.
22fd0 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72  .ssize_t label_r
22fe0 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
22ff0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f  etval;..int use_
23000 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a  default_label;..
23010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23020 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
23030 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
23040 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
23050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23060 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
23070 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
23080 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
23090 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
230a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
230b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
230c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
230d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
230e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
230f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23100 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23110 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
23120 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
23130 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
23140 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
23150 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
23160 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
23170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23180 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
23190 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
231a0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
231b0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
231c0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
231d0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
231e0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
231f0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23200 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
23210 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
23220 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
23230 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
23240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23250 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
23260 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
23270 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23280 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
23290 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
232a0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
232b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
232c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
232d0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
232e0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
232f0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
23300 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
23310 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
23320 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23330 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
23340 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
23350 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
23360 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
23370 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
23380 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
23390 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
233a0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
233b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
233c0 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65  _PRINTF("No toke
233d0 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  n is present in 
233e0 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73  slotID = %lu", s
233f0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
23400 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23410 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23420 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
23430 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29  KEN_NOT_PRESENT)
23440 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
23450 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20  ine token label 
23460 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65  from certificate
23470 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e  s */..memset(pIn
23480 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20  fo->label, ' ', 
23490 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
234a0 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61  bel));..use_defa
234b0 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a  ult_label = 1;..
234c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
234d0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
234e0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73  == NULL) {...pcs
234f0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
23500 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
23510 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
23520 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e  lotID], NULL, &n
23530 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66 20  um_certs);...if 
23540 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
23550 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
23560 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30  f (num_certs > 0
23570 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65  ) {.....label_re
23580 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
23590 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
235a0 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  l(pcsc_identitie
235b0 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  s, pInfo->label,
235c0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
235d0 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20 28  abel));.....if (
235e0 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b  label_ret > 0) {
235f0 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c  ......use_defaul
23600 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09  t_label = 0;....
23610 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
23620 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20  slotID].label = 
23630 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49  malloc(sizeof(pI
23640 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09  nfo->label));...
23650 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
23660 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
23670 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61  label, pInfo->la
23680 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
23690 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  o->label));.....
236a0 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  }....}.....cacke
236b0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
236c0 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
236d0 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d  m_certs, 1);...}
236e0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
236f0 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  cpy(pInfo->label
23700 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
23710 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69  lotID].label, si
23720 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
23730 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61  l));....use_defa
23740 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09  ult_label = 0;..
23750 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
23760 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23770 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23780 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
23790 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
237a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
237b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
237c0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
237d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
237e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
237f0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  R);..}...if (use
23800 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20  _default_label) 
23810 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
23820 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74  ->label, default
23830 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65  Label, sizeof(de
23840 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29  faultLabel) - 1)
23850 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
23860 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
23870 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
23880 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
23890 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
238a0 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
238b0 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
238c0 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
238d0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
238e0 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
238f0 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27  Info->model, ' '
23900 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
23910 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79  model));..memcpy
23920 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d  (pInfo->model, m
23930 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64  odel, sizeof(mod
23940 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  el) - 1);...mems
23950 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  et(pInfo->serial
23960 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a  Number, ' ', siz
23970 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  eof(pInfo->seria
23980 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d  lNumber));...mem
23990 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  set(pInfo->utcTi
239a0 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  me, ' ', sizeof(
239b0 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29  pInfo->utcTime))
239c0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
239d0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
239e0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
239f0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
23a00 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
23a10 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
23a20 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
23a30 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
23a40 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
23a50 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
23a60 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
23a70 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
23a80 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
23a90 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0x00;...pInfo->
23aa0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54  flags = CKF_WRIT
23ab0 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b  E_PROTECTED | CK
23ac0 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49  F_USER_PIN_INITI
23ad0 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b  ALIZED | CKF_TOK
23ae0 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  EN_INITIALIZED |
23af0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
23b00 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
23b10 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  s;...if (cackey_
23b20 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
23b30 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  ULL) {...pInfo->
23b40 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f  flags |= CKF_PRO
23b50 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43  TECTED_AUTHENTIC
23b60 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a  ATION_PATH;..}..
23b70 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73  .pInfo->ulMaxSes
23b80 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a  sionCount = (siz
23b90 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
23ba0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
23bb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
23bc0 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e  )) - 1;..pInfo->
23bd0 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  ulSessionCount =
23be0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
23bf0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
23c00 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73  nfo->ulMaxRwSess
23c10 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70  ionCount = 0;..p
23c20 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f  Info->ulRwSessio
23c30 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
23c40 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
23c50 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
23c60 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a  axPinLen = 128;.
23c70 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e  .pInfo->ulMinPin
23c80 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  Len = 0;..pInfo-
23c90 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65  >ulTotalPublicMe
23ca0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
23cb0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
23cc0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
23cd0 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  ePublicMemory = 
23ce0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
23cf0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
23d00 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61  fo->ulTotalPriva
23d10 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
23d20 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
23d30 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
23d40 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f  lFreePrivateMemo
23d50 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
23d60 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
23d70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23d80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23d90 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
23da0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
23db0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
23dc0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23dd0 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f  (CK_RV, C_WaitFo
23de0 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46  rSlotEvent)(CK_F
23df0 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53  LAGS flags, CK_S
23e00 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
23e10 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ID, CK_VOID_PTR 
23e20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41  pReserved) {..CA
23e30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23e40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
23e50 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
23e60 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
23e70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23e80 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
23e90 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
23ea0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
23eb0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
23ec0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
23ed0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23ef0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23f00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23f10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23f20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23f30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23f40 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d  /* XXX: TODO: Im
23f50 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20  plement this... 
23f60 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  */..CACKEY_DEBUG
23f70 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23f80 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
23f90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
23fa0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
23fb0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23fc0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
23fd0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23fe0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
23ff0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24000 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e  _RV, C_GetMechan
24010 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54  ismList)(CK_SLOT
24020 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d  _ID slotID, CK_M
24030 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54  ECHANISM_TYPE_PT
24040 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  R pMechanismList
24050 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
24060 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
24070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24080 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24090 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
240a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
240b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
240c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
240d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
240e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
240f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24100 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
24110 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
24120 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24130 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24140 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
24150 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
24160 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
24170 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
24180 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e  chanismList == N
24190 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
241a0 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45  nt = 1;....CACKE
241b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
241c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
241d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
241e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
241f0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75  K);..}...if (*pu
24200 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09  lCount < 1) {...
24210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66  NTF("Error.  Buf
24230 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29  fer too small.")
24240 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24250 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
24260 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69  );..}...pMechani
24270 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f  smList[0] = CKM_
24280 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43  RSA_PKCS;..*pulC
24290 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  ount = 1;...CACK
242a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
242b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
242c0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
242d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
242e0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
242f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24300 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
24310 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
24320 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
24330 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20  NISM_TYPE type, 
24340 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46  CK_MECHANISM_INF
24350 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
24360 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
24370 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
24380 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24390 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
243a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
243b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
243c0 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
243d0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
243e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
243f0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
24400 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24410 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24430 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24440 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24450 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24460 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24470 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
24480 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
24490 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
244a0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
244b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
244c0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
244d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
244e0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
244f0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
24500 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
24510 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
24520 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
24530 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
24540 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
24550 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
24560 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
24570 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24580 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
24590 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
245a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
245b0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
245c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
245d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
245e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
245f0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
24600 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
24610 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24630 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
24640 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
24650 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
24660 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
24670 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
24680 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24690 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
246a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
246b0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
246c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
246d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
246e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
246f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
24700 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
24710 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24720 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24730 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
24740 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24750 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
24760 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
24770 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  (type) {...case 
24780 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
24790 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79  .pInfo->ulMinKey
247a0 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70  Size = 512;....p
247b0 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69  Info->ulMaxKeySi
247c0 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49  ze = 8192;....pI
247d0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
247e0 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50  _HW | CKF_ENCRYP
247f0 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20  T | CKF_DECRYPT 
24800 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46  | CKF_SIGN | CKF
24810 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61  _VERIFY;....brea
24820 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  k;..}...CACKEY_D
24830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24840 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
24850 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
24860 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
24870 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
24880 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
24890 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
248a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
248b0 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b   C_InitToken)(CK
248c0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
248d0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
248e0 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
248f0 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ulPinLen, CK_UTF
24900 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c  8CHAR_PTR pLabel
24910 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
24920 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24930 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24940 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
24950 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24960 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24970 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24980 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24990 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
249a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
249b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
249c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
249d0 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
249e0 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
249f0 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
24a00 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
24a10 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
24a20 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
24a30 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  D);.}../* We don
24a40 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
24a50 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
24a60 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24a70 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28  _RV, C_InitPIN)(
24a80 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
24a90 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
24aa0 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
24ab0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
24ac0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
24ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24ae0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
24af0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
24b00 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
24b10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24b20 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24b30 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24b40 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24b50 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24b60 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24b70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24b80 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
24b90 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
24ba0 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
24bb0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
24bc0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
24bd0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
24be0 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  CTED);.}..CK_DEF
24bf0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
24c00 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
24c10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
24c20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
24c30 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
24c40 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
24c50 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
24c60 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
24c70 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
24c80 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20  PinLen) {..char 
24c90 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e  oldpinbuf[64], n
24ca0 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63  ewpinbuf[64];..c
24cb0 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f 70 69  ackey_ret set_pi
24cc0 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72  n_ret, get_pin_r
24cd0 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  et;..CK_SLOT_ID 
24ce0 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
24cf0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
24d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24d10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24d20 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24d30 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24d40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24d50 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24d60 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24d70 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24d80 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24d90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ZED);..}...mutex
24da0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24db0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
24dc0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24dd0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24de0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24e00 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
24e10 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24e20 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24e30 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
24e40 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
24e50 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
24e60 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
24e70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24e80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
24e90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24ea0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
24eb0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
24ec0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24ed0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
24ee0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
24ef0 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
24f00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24f10 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
24f20 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
24f30 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
24f40 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
24f50 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
24f60 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
24f70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24f80 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
24f90 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
24fa0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
24fb0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
24fc0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
24fd0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24fe0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24ff0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
25000 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
25010 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
25020 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
25030 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
25040 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25050 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
25060 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
25070 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
25080 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
25090 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
250a0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
250b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
250c0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
250d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
250e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
250f0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
25100 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f  d != NULL) {.../
25110 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f  * Get old PIN */
25120 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d  ...get_pin_ret =
25130 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28   cackey_get_pin(
25140 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69  oldpinbuf);....i
25150 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (get_pin_ret !
25160 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
25170 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
25180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25190 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69 6e  ror while gettin
251a0 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74 75 72  g Old PIN, retur
251b0 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43  ning CKR_PIN_INC
251c0 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63  ORRECT.");.....c
251d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
251e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
251f0 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 72  k);........retur
25200 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
25210 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c  ECT);...}....pOl
25220 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43  dPin = (CK_UTF8C
25230 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62  HAR_PTR) oldpinb
25240 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65  uf;...ulOldPinLe
25250 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69  n = strlen(oldpi
25260 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74  nbuf);..../* Get
25270 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65   new PIN */...ge
25280 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
25290 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77 70 69  ey_get_pin(newpi
252a0 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65  nbuf);....if (ge
252b0 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  t_pin_ret != CAC
252c0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
252d0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
252e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20 77  _PRINTF("Error w
252f0 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e 65 77  hile getting New
25300 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20   PIN, returning 
25310 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e  CKR_PIN_INVALID.
25320 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d  ");.....cackey_m
25330 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25340 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
25350 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
25360 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d  IN_INVALID);...}
25370 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20 28 43  ....pNewPin = (C
25380 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20  K_UTF8CHAR_PTR) 
25390 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e  newpinbuf;...ulN
253a0 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ewPinLen = strle
253b0 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d  n(newpinbuf);..}
253c0 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d  ...if (pOldPin =
253d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
253e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
253f0 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65 20 69  "Old PIN value i
25400 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22  s wrong (null)."
25410 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
25420 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25430 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
25440 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
25450 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66  ORRECT);..}...if
25460 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d   (ulOldPinLen ==
25470 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65   0 || ulOldPinLe
25480 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45  n > 8) {...CACKE
25490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
254a0 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68 20 69  Old PIN length i
254b0 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20  s wrong: %lu.", 
254c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
254d0 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulOldPinLen);...
254e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
254f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25500 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
25510 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
25520 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65  T);..}...if (pNe
25530 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  wPin == NULL) {.
25540 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25550 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e 20 76  RINTF("New PIN v
25560 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28 65  alue is wrong (e
25570 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74  ither NULL, or t
25580 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22  oo long/short)."
25590 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
255a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
255b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
255c0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56  turn(CKR_PIN_INV
255d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
255e0 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20  ulNewPinLen < 5 
255f0 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e  || ulNewPinLen >
25600 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   8) {...CACKEY_D
25610 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 77  EBUG_PRINTF("New
25620 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77   PIN length is w
25630 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20  rong: %lu, must 
25640 62 65 20 61 74 6c 65 61 73 74 20 35 20 61 6e 64  be atleast 5 and
25650 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e   no more than 8.
25660 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
25670 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b  g) ulNewPinLen);
25680 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
25690 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
256a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
256b0 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52  rn(CKR_PIN_LEN_R
256c0 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f  ANGE);..}...set_
256d0 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  pin_ret = cackey
256e0 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b 65 79  _set_pin(&cackey
256f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
25700 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69  pOldPin, ulOldPi
25710 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75  nLen, pNewPin, u
25720 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69  lNewPinLen);...i
25730 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (set_pin_ret !
25740 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
25750 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  OK) {...if (cack
25760 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
25770 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63  = NULL) {....cac
25780 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
25790 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
257a0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
257b0 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  RED;...}....if (
257c0 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43  set_pin_ret == C
257d0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
257e0 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  KED) {....cackey
257f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
25800 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
25810 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
25820 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  D;...}..}...mute
25830 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25840 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25850 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25860 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25870 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25890 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
258a0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
258b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
258c0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
258d0 09 73 77 69 74 63 68 20 28 73 65 74 5f 70 69 6e  .switch (set_pin
258e0 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65 20 43  _ret) {...case C
258f0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a  ACKEY_PCSC_S_OK:
25900 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25910 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
25920 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e 22 29  fully set PIN.")
25930 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
25940 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43 41 43  _OK);...case CAC
25950 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
25960 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  N:....CACKEY_DEB
25970 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 77  UG_PRINTF("PIN w
25980 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a  as invalid.");..
25990 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
259a0 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61  N_INVALID);...ca
259b0 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  se CACKEY_PCSC_E
259c0 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b  _LOCKED:....CACK
259d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
259e0 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64  "Token is locked
259f0 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65 20   or this change 
25a00 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  is not permitted
25a10 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
25a20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
25a30 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43  ...default:....C
25a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25a50 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c  TF("Something el
25a60 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20 63 68  se went wrong ch
25a70 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e 3a 20  anging the PIN: 
25a80 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74  %i", set_pin_ret
25a90 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
25aa0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
25ab0 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ;..}...return(CK
25ac0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
25ad0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
25ae0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
25af0 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b  _OpenSession)(CK
25b00 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
25b10 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c   CK_FLAGS flags,
25b20 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70   CK_VOID_PTR pAp
25b30 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f  plication, CK_NO
25b40 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f  TIFY notify, CK_
25b50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50  SESSION_HANDLE_P
25b60 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a  TR phSession) {.
25b70 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
25b80 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
25b90 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e  etval;..int foun
25ba0 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a  d_session = 0;..
25bb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25bc0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
25bd0 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20  ...if ((flags & 
25be0 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49  CKF_SERIAL_SESSI
25bf0 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41  ON) != CKF_SERIA
25c00 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72  L_SESSION) {...r
25c10 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
25c20 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53  N_PARALLEL_NOT_S
25c30 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09  UPPORTED);..}...
25c40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
25c50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
25c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25c70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
25c80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
25c90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25ca0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25cb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
25cc0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
25cd0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
25ce0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
25cf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
25d00 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
25d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25d20 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
25d30 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
25d40 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
25d50 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
25d60 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
25d70 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
25d80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
25d90 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
25da0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
25db0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25dc0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25dd0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25de0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25df0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
25e00 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25e10 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25e20 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25e30 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
25e40 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
25e50 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
25e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25e70 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
25e80 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
25e90 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
25ea0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
25eb0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
25ec0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25ed0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25ee0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
25ef0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
25f00 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
25f10 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73  that the card is
25f20 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65   actually in the
25f30 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58   slot. */../* XX
25f40 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  X: Check to make
25f50 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e   sure this is in
25f60 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65   the PKCS#11 spe
25f70 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69  cification */..i
25f80 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
25f90 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
25fa0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
25fb0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
25fc0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
25fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25fe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43  RINTF("Error.  C
25ff0 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e  ard not present.
26000 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f    Returning CKR_
26010 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29  DEVICE_REMOVED")
26020 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
26030 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26040 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
26050 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52  urn(CKR_DEVICE_R
26060 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f  EMOVED);..}...fo
26070 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20  r (idx = 1; idx 
26080 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
26090 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
260a0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
260b0 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
260c0 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
260d0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
260e0 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e  ctive) {....foun
260f0 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a  d_session = 1;..
26100 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20  ...*phSession = 
26110 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  idx;.....cackey_
26120 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
26130 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63  tive = 1;....cac
26140 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
26150 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49  ].slotID = slotI
26160 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  D;....cackey_ses
26170 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65  sions[idx].state
26180 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
26190 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63  _SESSION;....cac
261a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
261b0 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ].flags = flags;
261c0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
261d0 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63  ons[idx].ulDevic
261e0 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63  eError = 0;....c
261f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
26200 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e  dx].pApplication
26210 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b   = pApplication;
26220 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26230 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20  ons[idx].Notify 
26240 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61  = notify;.....ca
26250 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26260 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  x].identities = 
26270 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f  NULL;....cackey_
26280 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
26290 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
262a0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
262b0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61  essions[idx].sea
262c0 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
262d0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
262e0 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63  ons[idx].sign_ac
262f0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
26300 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26310 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  x].decrypt_activ
26320 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
26330 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
26340 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
26350 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
26360 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
26370 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
26380 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
26390 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
263a0 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  t);......break;.
263b0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
263c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
263d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
263e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
263f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
26400 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
26410 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26420 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
26430 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
26440 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26450 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
26460 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e   (!found_session
26470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26480 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26490 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e  ning CKR_SESSION
264a0 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b  _COUNT (%i)", CK
264b0 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
264c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
264d0 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
264e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
264f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26500 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
26510 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
26520 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
26530 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
26540 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
26550 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53  eSession)(CK_SES
26560 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26570 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
26580 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
26590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
265a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
265b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
265c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
265d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
265e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
265f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26600 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26610 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26620 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
26630 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
26640 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
26650 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
26660 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
26670 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
26680 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
26690 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
266a0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
266b0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
266c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
266d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
266e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
266f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
26700 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
26710 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
26720 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
26730 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
26740 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
26750 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
26760 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
26770 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26780 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
26790 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
267a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
267b0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
267c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
267d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
267e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
267f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
26800 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
26810 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
26820 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
26830 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
26840 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26850 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
26860 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  ve = 0;..cackey_
26870 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
26880 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26890 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
268a0 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73  ties, cackey_ses
268b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
268c0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
268d0 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
268e0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
268f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26900 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
26910 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
26920 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26930 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26940 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
26950 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26960 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26970 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
26980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26990 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
269a0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
269b0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
269c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
269d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
269e0 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
269f0 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  s)(CK_SLOT_ID sl
26a00 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f  otID) {..uint32_
26a10 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
26a20 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
26a30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26a40 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
26a50 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
26a60 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
26a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26a80 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
26a90 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
26aa0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
26ab0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
26ac0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
26ad0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
26ae0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
26af0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
26b00 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
26b10 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
26b20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26b30 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
26b40 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
26b50 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
26b60 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
26b70 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
26b80 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
26b90 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
26ba0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
26bb0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
26bc0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26bd0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
26be0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
26bf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26c00 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
26c10 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
26c20 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26c30 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
26c40 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
26c50 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
26c60 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26c70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26c80 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
26c90 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
26ca0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
26cb0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
26cc0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
26cd0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26ce0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
26cf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
26d00 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
26d10 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
26d20 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
26d30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
26d40 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
26d50 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
26d60 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
26d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
26d80 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
26d90 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
26da0 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
26db0 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09   != slotID) {...
26dc0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
26dd0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
26de0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26df0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43  biglock);....C_C
26e00 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
26e10 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
26e20 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
26e30 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  glock);...}..}..
26e40 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
26e50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26e60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26e70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
26e80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
26e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26ea0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
26eb0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
26ec0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26ed0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
26ee0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26ef0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26f00 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
26f10 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
26f20 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
26f30 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
26f40 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
26f50 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f  SessionInfo)(CK_
26f60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
26f70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53  Session, CK_SESS
26f80 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  ION_INFO_PTR pIn
26f90 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  fo) {..int mutex
26fa0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
26fb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26fc0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
26fd0 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
26fe0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26ff0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27000 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
27010 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27020 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
27030 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
27040 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
27050 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27060 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
27070 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
27080 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27090 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
270a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
270b0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
270c0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
270d0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
270e0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
270f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
27100 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
27110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27120 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
27130 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
27140 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
27150 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
27160 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
27170 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
27180 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
27190 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
271a0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
271b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
271c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
271d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
271e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
271f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
27200 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
27210 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
27220 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27230 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
27240 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27250 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27260 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
27270 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27280 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
27290 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
272a0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
272b0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
272c0 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73  );..}...pInfo->s
272d0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
272e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
272f0 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f  ].slotID;..pInfo
27300 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79  ->state = cackey
27310 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27320 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66  on].state;..pInf
27330 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65  o->flags = cacke
27340 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27350 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e  ion].flags;..pIn
27360 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f  fo->ulDeviceErro
27370 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  r = cackey_sessi
27380 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c  ons[hSession].ul
27390 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d  DeviceError;...m
273a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
273b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
273c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
273d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
273e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
273f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27400 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
27410 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
27420 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
27430 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
27440 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27450 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27460 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
27470 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
27480 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
27490 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
274a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70  N(CK_RV, C_GetOp
274b0 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
274c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
274d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
274e0 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
274f0 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  State, CK_ULONG_
27500 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e  PTR pulOperation
27510 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43  StateLen) {..CAC
27520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27530 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27540 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27550 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27570 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27580 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27590 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
275a0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
275b0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
275c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
275d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
275e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
275f0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
27600 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27610 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
27620 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
27630 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
27640 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27650 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
27660 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29  tOperationState)
27670 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
27680 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
27690 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74  BYTE_PTR pOperat
276a0 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f  ionState, CK_ULO
276b0 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  NG ulOperationSt
276c0 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ateLen, CK_OBJEC
276d0 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70  T_HANDLE hEncryp
276e0 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  tionKey, CK_OBJE
276f0 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65  CT_HANDLE hAuthe
27700 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a  nticationKey) {.
27710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27720 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
27730 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
27740 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
27750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27760 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
27770 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
27780 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
27790 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
277a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
277b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
277c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
277d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
277e0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
277f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27800 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
27810 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
27820 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27830 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
27840 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
27850 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 29  C_LoginMutexArg)
27860 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
27870 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
27880 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
27890 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
278a0 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
278b0 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74  NG ulPinLen, int
278c0 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09   lock_mutex) {..
278d0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
278e0 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 67  D;..cackey_ret g
278f0 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68 61  et_pin_ret;..cha
27900 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 69  r pinbuf[64];..i
27910 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
27920 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61  ..int tries_rema
27930 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69  ining;..int logi
27940 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  n_ret;...CACKEY_
27950 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27960 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27970 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27980 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
279a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
279b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
279c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
279d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
279e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
279f0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
27a00 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
27a10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
27a20 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
27a30 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
27a40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27a50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27a60 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
27a70 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
27a80 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
27a90 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
27aa0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72  );..}...if (user
27ab0 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52  Type != CKU_USER
27ac0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27ad0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27ae0 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  .  We only suppo
27af0 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73  rt USER mode, as
27b00 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65  ked for %lu mode
27b10 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
27b20 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09  ng) userType)...
27b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52  .return(CKR_USER
27b40 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  _TYPE_INVALID);.
27b50 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75  .}...if (lock_mu
27b60 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72  tex) {...mutex_r
27b70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
27b80 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
27b90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20  _biglock);...if 
27ba0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
27bb0 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
27bc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27bd0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
27be0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
27bf0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27c00 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  ERROR);...}..}..
27c10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
27c20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27c30 61 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20 28  active) {...if (
27c40 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
27c50 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27c60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27c70 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  ock);...}....CAC
27c80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27c90 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27ca0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
27cb0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27cc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
27cd0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
27ce0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
27cf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27d00 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
27d10 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
27d20 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
27d30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
27d40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
27d50 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
27d60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27d70 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
27d80 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
27d90 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
27da0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
27db0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20   slotID);....if 
27dc0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
27dd0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
27de0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
27df0 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  lock);...}....re
27e00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
27e10 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
27e20 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
27e30 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
27e40 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
27e50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27e60 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
27e70 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
27e80 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
27e90 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
27ea0 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f  otID);....if (lo
27eb0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
27ec0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27ed0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27ee0 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  k);...}....retur
27ef0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27f00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
27f10 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
27f20 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  d != NULL) {...i
27f30 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29  f (pPin != NULL)
27f40 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
27f50 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 65  UG_PRINTF("Prote
27f60 63 74 65 64 20 61 75 74 68 65 6e 74 69 63 61 74  cted authenticat
27f70 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66 65  ion path in effe
27f80 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76 69  ct and PIN provi
27f90 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09  ded !?");...}...
27fa0 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63  .get_pin_ret = c
27fb0 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70 69  ackey_get_pin(pi
27fc0 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67 65  nbuf);....if (ge
27fd0 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  t_pin_ret != CAC
27fe0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
27ff0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28000 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
28010 67 65 74 5f 70 69 6e 28 29 20 72 65 74 75 72 6e  get_pin() return
28020 65 64 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 61  ed in failure, a
28030 73 73 75 6d 69 6e 67 20 74 68 65 20 50 49 4e 20  ssuming the PIN 
28040 77 61 73 20 69 6e 63 6f 72 72 65 63 74 2e 22 29  was incorrect.")
28050 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d  ;.....if (lock_m
28060 75 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b  utex) {.....cack
28070 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28080 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28090 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
280a0 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
280b0 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e  CT);...}....pPin
280c0 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f   = (CK_UTF8CHAR_
280d0 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09 75  PTR) pinbuf;...u
280e0 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  lPinLen = strlen
280f0 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c  (pinbuf);..}...l
28100 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  ogin_ret = cacke
28110 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f  y_login(&cackey_
28120 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70  slots[slotID], p
28130 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26  Pin, ulPinLen, &
28140 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 2c  tries_remaining,
28150 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f   3);..if (login_
28160 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
28170 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
28180 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
28190 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
281a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
281b0 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  lock);...}....if
281c0 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
281d0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
281e0 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  KED) {....CACKEY
281f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28200 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20  rror.  Token is 
28210 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63  locked.");.....c
28220 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
28230 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
28240 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
28250 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b  LOCKED;.....CACK
28260 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28270 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50  "Returning CKR_P
28280 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c  IN_LOCKED (%i)",
28290 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c   (int) CKR_PIN_L
282a0 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74 75  OCKED);.....retu
282b0 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  rn(CKR_PIN_LOCKE
282c0 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  D);...} else if 
282d0 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
282e0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
282f0 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  IN) {....CACKEY_
28300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28310 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49  ror.  Invalid PI
28320 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  N.");.....cackey
28330 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
28340 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
28350 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
28360 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72  _LOW;.....if (tr
28370 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  ies_remaining ==
28380 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79   1) {.....cackey
28390 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
283a0 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
283b0 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c  F_USER_PIN_FINAL
283c0 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43  _TRY;....}.....C
283d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
283e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
283f0 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20  R_PIN_INCORRECT 
28400 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52  (%i)", (int) CKR
28410 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
28420 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28430 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
28440 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
28450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28460 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f  r.  Unknown erro
28470 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  r returned from 
28480 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28  cackey_login() (
28490 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29  %i)", login_ret)
284a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
284b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
284c0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .}...cackey_slot
284d0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
284e0 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55  flags &= ~(CKF_U
284f0 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c  SER_PIN_LOCKED |
28500 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f   CKF_USER_PIN_CO
28510 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f  UNT_LOW | CKF_LO
28520 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43  GIN_REQUIRED | C
28530 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
28540 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79  L_TRY);...cackey
28550 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28560 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
28570 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e  RO_USER_FUNCTION
28580 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75  S;...if (lock_mu
28590 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72  tex) {...mutex_r
285a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
285b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
285c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69  ey_biglock);...i
285d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
285e0 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
285f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28600 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
28610 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28620 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28630 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a  RAL_ERROR);...}.
28640 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
28650 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28660 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
28670 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
28680 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
28690 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
286a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69  ON(CK_RV, C_Logi
286b0 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
286c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
286d0 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72  K_USER_TYPE user
286e0 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41  Type, CK_UTF8CHA
286f0 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
28700 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
28710 0a 09 72 65 74 75 72 6e 28 43 5f 4c 6f 67 69 6e  ..return(C_Login
28720 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f  MutexArg(hSessio
28730 6e 2c 20 75 73 65 72 54 79 70 65 2c 20 70 50 69  n, userType, pPi
28740 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29  n, ulPinLen, 1))
28750 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
28760 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
28770 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53  _Logout)(CK_SESS
28780 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
28790 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  ion) {..CK_SLOT_
287a0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20  ID slotID;..int 
287b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
287c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
287d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
287e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
287f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
28800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28810 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
28820 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
28830 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
28840 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
28850 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
28860 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
28870 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
28880 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28890 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
288a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
288b0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
288c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
288d0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
288e0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
288f0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28900 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28910 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
28920 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28930 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
28940 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28950 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
28960 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
28970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28980 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
28990 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
289a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
289b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
289c0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
289d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
289e0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
289f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28a00 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28a10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28a20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28a30 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
28a40 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
28a50 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28a60 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28a70 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
28a80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28a90 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
28aa0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
28ab0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
28ac0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
28ad0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
28ae0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
28af0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28b00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28b10 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
28b20 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
28b30 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
28b40 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
28b50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28b60 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28b70 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
28b80 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
28b90 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
28ba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28bb0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
28bc0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
28bd0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
28be0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
28bf0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
28c00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
28c10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28c20 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
28c30 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
28c40 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
28c50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28c60 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
28c70 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a  PUBLIC_SESSION;.
28c80 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
28c90 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c  _command == NULL
28ca0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ) {...cackey_slo
28cb0 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
28cc0 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
28cd0 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20  IN_REQUIRED;..} 
28ce0 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f  else {...cackey_
28cf0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
28d00 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
28d10 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
28d20 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
28d30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28d40 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
28d50 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
28d60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28d70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28d80 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
28d90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28da0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
28db0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
28dc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28dd0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
28de0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
28df0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
28e00 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
28e10 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
28e20 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b  CreateObject)(CK
28e30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
28e40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
28e50 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
28e60 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
28e70 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
28e80 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
28e90 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
28ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
28eb0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
28ec0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
28ed0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
28ee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28ef0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
28f00 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
28f10 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
28f20 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
28f30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
28f40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
28f50 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
28f60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
28f70 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
28f80 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28f90 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
28fa0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
28fb0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
28fc0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
28fd0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f  N(CK_RV, C_CopyO
28fe0 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
28ff0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
29000 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
29010 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
29020 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
29030 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
29040 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
29050 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
29060 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09  phNewObject) {..
29070 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29080 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
29090 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
290a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
290b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
290c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
290d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
290e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
290f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
29100 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
29110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29120 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29130 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29140 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
29150 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29160 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
29170 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
29180 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29190 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
291a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
291b0 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28  _DestroyObject)(
291c0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
291d0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
291e0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
291f0 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
29200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29210 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29220 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29230 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29250 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29260 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29270 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29280 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29290 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
292a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
292b0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
292c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
292d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
292e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
292f0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
29300 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29310 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29320 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29330 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a  (CK_RV, C_GetObj
29340 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53  ectSize)(CK_SESS
29350 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
29360 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
29370 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
29380 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
29390 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ize) {..CACKEY_D
293a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
293b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
293c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
293d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
293e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
293f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29400 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29410 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29420 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29430 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29440 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29450 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29460 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
29470 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
29480 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29490 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
294a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
294b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
294c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
294d0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72  CK_RV, C_GetAttr
294e0 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
294f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29500 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
29510 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
29520 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
29530 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
29540 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
29550 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
29560 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72  *curr_attr;..str
29570 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
29580 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09  ity *identity;..
29590 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
295a0 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72  entity_idx, attr
295b0 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f  _idx, sess_attr_
295c0 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69  idx, num_ids;..i
295d0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
295e0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
295f0 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49   CKR_OK;..CK_VOI
29600 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
29610 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
29620 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  en;...CACKEY_DEB
29630 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
29640 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
29650 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29660 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29670 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29680 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29690 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
296a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
296b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
296c0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
296d0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
296e0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
296f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
29700 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
29710 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
29720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29730 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
29740 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
29750 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
29760 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
29770 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
29780 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74  .}...if (hObject
29790 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
297a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
297b0 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
297c0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
297d0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
297e0 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
297f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29800 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  }...if (ulCount 
29810 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
29820 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
29830 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
29840 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
29850 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
29860 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41  ediately */...CA
29870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29880 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29890 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
298a0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
298b0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
298c0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
298d0 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c  pTemplate == NUL
298e0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
298f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29900 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  r.  pTemplate is
29910 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
29920 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
29930 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  S_BAD);..}...ide
29940 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a  ntity_idx = hObj
29950 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78  ect - 1;...mutex
29960 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
29970 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
29980 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
29990 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
299a0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
299b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
299c0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
299d0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
299e0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
299f0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
29a00 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
29a10 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
29a20 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29a30 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29a40 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29a60 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
29a70 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
29a80 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
29a90 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
29aa0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29ab0 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65  .num_ids = cacke
29ac0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29ad0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
29ae0 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65  count;...if (ide
29af0 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d  ntity_idx >= num
29b00 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79  _ids) {...cackey
29b10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29b20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29b30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29b40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
29b50 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
29b60 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e   of range.  iden
29b70 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20  tity_idx = %lu, 
29b80 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c  num_ids = %lu.",
29b90 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
29ba0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28   identity_idx, (
29bb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e  unsigned long) n
29bc0 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75  um_ids);....retu
29bd0 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
29be0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29bf0 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26  }...identity = &
29c00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29c10 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
29c20 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64  ties[identity_id
29c30 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f  x];...for (attr_
29c40 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
29c50 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74  x < ulCount; att
29c60 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  r_idx++) {...cur
29c70 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c  r_attr = &pTempl
29c80 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  ate[attr_idx];..
29c90 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
29ca0 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
29cb0 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
29cc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29cd0 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f  INTF("Looking fo
29ce0 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30  r attribute 0x%0
29cf0 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c  8lx (identity:%l
29d00 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  u) ...", (unsign
29d10 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
29d20 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67  tr->type, (unsig
29d30 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
29d40 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20  ty_idx);....for 
29d50 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d  (sess_attr_idx =
29d60 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64   0; sess_attr_id
29d70 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  x < identity->at
29d80 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
29d90 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
29da0 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69   {....if (identi
29db0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
29dc0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79  ess_attr_idx].ty
29dd0 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d  pe == curr_attr-
29de0 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43  >type) {.....CAC
29df0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29e00 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c  (" ... found it,
29e10 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c   pValue = %p, ul
29e20 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c  ValueLen = %lu",
29e30 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
29e40 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
29e50 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65  idx].pValue, ide
29e60 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
29e70 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
29e80 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
29e90 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
29ea0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
29eb0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
29ec0 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09  dx].pValue;.....
29ed0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65  ulValueLen = ide
29ee0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
29ef0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
29f00 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  .ulValueLen;....
29f10 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72  }...}....if (cur
29f20 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26  r_attr->pValue &
29f30 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69  & pValue) {....i
29f40 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
29f50 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61  ValueLen >= ulVa
29f60 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65  lueLen) {.....me
29f70 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e  mcpy(curr_attr->
29f80 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
29f90 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
29fa0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56  } else {.....ulV
29fb0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
29fc0 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74  NG) -1;......ret
29fd0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
29fe0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
29ff0 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74  ...}....curr_att
2a000 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  r->ulValueLen = 
2a010 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a  ulValueLen;..}..
2a020 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2a030 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2a040 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2a050 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2a060 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2a070 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a080 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2a090 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2a0a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a0b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2a0c0 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ..}...if (retval
2a0d0 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54   == CKR_ATTRIBUT
2a0e0 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20  E_TYPE_INVALID) 
2a0f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a100 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2a110 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  ng CKR_ATTRIBUTE
2a120 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25  _TYPE_INVALID (%
2a130 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
2a140 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  l);..} else if (
2a150 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55  retval == CKR_BU
2a160 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
2a170 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a180 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2a190 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ng CKR_BUFFER_TO
2a1a0 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28  O_SMALL (%i)", (
2a1b0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
2a1c0 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
2a1d0 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
2a1e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a1f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2a200 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e  KR_OK (%i)", (in
2a210 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
2a220 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  lse {...CACKEY_D
2a230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a240 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
2a250 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  ) retval);..}...
2a260 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2a270 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a280 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2a290 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
2a2a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2a2b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2a2c0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2a2d0 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
2a2e0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
2a2f0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
2a300 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
2a310 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2a320 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2a330 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2a340 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2a350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a360 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2a370 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2a380 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2a390 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a3a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2a3b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2a3c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2a3d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a3e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2a3f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a400 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2a410 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a420 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2a430 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2a440 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
2a450 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45  jectsInit)(CK_SE
2a460 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2a470 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
2a480 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
2a490 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
2a4a0 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  unt) {..CK_SLOT_
2a4b0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55  ID slotID;..CK_U
2a4c0 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
2a4d0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2a4e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a4f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2a500 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2a510 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2a520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a530 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2a540 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2a550 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2a560 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2a570 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2a580 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2a590 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2a5a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2a5b0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2a5c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a5d0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2a5e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a5f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2a600 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2a610 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a620 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2a630 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
2a640 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2a650 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2a660 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a670 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2a680 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2a690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a6a0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2a6b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2a6c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a6d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2a6e0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2a6f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
2a700 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2a710 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2a720 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2a730 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a740 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2a750 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2a760 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2a770 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2a780 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2a790 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
2a7a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a7b0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
2a7c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2a7d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2a7e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2a7f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a800 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
2a810 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
2a820 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2a830 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
2a840 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  TIVE);..}...slot
2a850 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
2a860 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2a870 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
2a880 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
2a890 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
2a8a0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
2a8b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2a8c0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2a8d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a8e0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2a8f0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2a900 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
2a910 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
2a920 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
2a930 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2a940 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2a950 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2a960 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
2a970 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a980 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a990 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2a9a0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
2a9b0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
2a9c0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
2a9d0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
2a9e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2a9f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
2aa00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2aa10 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2aa20 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
2aa30 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
2aa40 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
2aa50 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20  BUG_PRINTF("The 
2aa60 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65  slot has been re
2aa70 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73  set since we las
2aa80 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65  t looked for ide
2aa90 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61  ntities -- resca
2aaa0 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28  nning");....if (
2aab0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2aac0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2aad0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
2aae0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ...cackey_free_i
2aaf0 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
2ab00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ab10 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
2ab20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ab30 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2ab40 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
2ab50 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2ab60 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2ab70 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
2ab80 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2ab90 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2aba0 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
2abb0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
2abc0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2abd0 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  .label != NULL) 
2abe0 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
2abf0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
2ac00 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79  abel);....cackey
2ac10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
2ac20 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
2ac30 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
2ac40 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
2ac50 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2ac60 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  );...cackey_slot
2ac70 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
2ac80 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  eset = 0;..}...i
2ac90 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
2aca0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2acb0 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
2acc0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
2acd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2ace0 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
2acf0 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
2ad00 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
2ad10 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
2ad20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ad30 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2ad40 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  count);..}...if 
2ad50 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55  (pTemplate != NU
2ad60 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  LL) {...if (ulCo
2ad70 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
2ad80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ad90 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2ada0 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c  query_count = ul
2adb0 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79  Count;....cackey
2adc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2add0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2ade0 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e   = malloc(ulCoun
2adf0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
2ae00 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d  plate));.....mem
2ae10 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
2ae20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ae30 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d  arch_query, pTem
2ae40 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a  plate, ulCount *
2ae50 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
2ae60 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64  te));....for (id
2ae70 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43  x = 0; idx < ulC
2ae80 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
2ae90 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
2aea0 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
2aeb0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61   == 0) {......ca
2aec0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2aed0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2aee0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
2aef0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63   = NULL;.......c
2af00 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a  ontinue;.....}..
2af10 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2af20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2af30 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
2af40 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
2af50 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
2af60 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
2af70 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2af80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2af90 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
2afa0 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  .pValue) {......
2afb0 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
2afc0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2afd0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
2afe0 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
2aff0 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65  late[idx].pValue
2b000 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
2b010 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
2b020 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  ..}....}...} els
2b030 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  e {....cackey_se
2b040 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b050 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
2b060 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  unt = 0;....cack
2b070 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b080 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2b090 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ry = NULL;...}..
2b0a0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75  } else {...if (u
2b0b0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
2b0c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2b0d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2b0e0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
2b0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b100 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71  Error.  Search q
2b110 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61  uery specified a
2b120 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62  s NULL, but numb
2b130 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d  er of query term
2b140 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
2b150 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74  as 0.");.....ret
2b160 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2b170 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  S_BAD);...}....c
2b180 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b190 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b1a0 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
2b1b0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b1c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2b1d0 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
2b1e0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
2b1f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b200 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
2b210 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   1;..cackey_sess
2b220 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b230 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
2b240 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  0;...mutex_retva
2b250 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2b260 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2b270 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2b280 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2b290 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b2a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b2b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2b2c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b2d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b2e0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2b2f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b300 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2b310 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2b320 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2b330 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2b340 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f  cackey_pkcs11_co
2b350 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73  mpare_attributes
2b360 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  (CK_ATTRIBUTE *a
2b370 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  , CK_ATTRIBUTE *
2b380 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  b) {..unsigned c
2b390 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a  har *smallbuf, *
2b3a0 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f  largebuf;..size_
2b3b0 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20  t smallbuf_len, 
2b3c0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09  largebuf_len;...
2b3d0 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62  if (a->type != b
2b3e0 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75  ->type) {...retu
2b3f0 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  rn(0);..}...CACK
2b400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b410 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
2b420 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
2b430 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
2b440 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
2b450 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22   ... our value:"
2b460 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e  , a->pValue, a->
2b470 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69  ulValueLen);...i
2b480 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20  f (b->pValue == 
2b490 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2b4a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
2b4b0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
2b4c0 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29  wildcard match")
2b4d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
2b4e0 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c  .}...if (a->pVal
2b4f0 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ue == NULL) {...
2b500 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20  return(0);..}.. 
2b510 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c  .if (b->ulValueL
2b520 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65  en == a->ulValue
2b530 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d  Len && memcmp(a-
2b540 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c  >pValue, b->pVal
2b550 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, b->ulValueLe
2b560 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  n) == 0) {...CAC
2b570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b580 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
2b590 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29  nd exact match")
2b5a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
2b5b0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e  .}...switch (a->
2b5c0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
2b5d0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69  KA_MODULUS:....i
2b5e0 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  f (a->ulValueLen
2b5f0 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65   == b->ulValueLe
2b600 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
2b610 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e  ...}.....if (a->
2b620 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e  ulValueLen > b->
2b630 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
2b640 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e  ..smallbuf = b->
2b650 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c  pValue;.....smal
2b660 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c  lbuf_len = b->ul
2b670 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c  ValueLen;......l
2b680 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61  argebuf = a->pVa
2b690 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75  lue;.....largebu
2b6a0 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c  f_len = a->ulVal
2b6b0 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65  ueLen;....} else
2b6c0 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20   {.....smallbuf 
2b6d0 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = a->pValue;....
2b6e0 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20  .smallbuf_len = 
2b6f0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  a->ulValueLen;..
2b700 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62  ....largebuf = b
2b710 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61  ->pValue;.....la
2b720 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e  rgebuf_len = b->
2b730 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
2b740 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67  .....for (; larg
2b750 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c  ebuf_len != smal
2b760 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62  lbuf_len; largeb
2b770 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65  uf++,largebuf_le
2b780 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c  n--) {.....if (l
2b790 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29  argebuf[0] != 0)
2b7a0 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
2b7b0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
2b7c0 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21   (largebuf_len !
2b7d0 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  = smallbuf_len) 
2b7e0 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
2b7f0 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70  }.....if (memcmp
2b800 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c  (largebuf, small
2b810 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  buf, smallbuf_le
2b820 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43  n) == 0) {.....C
2b830 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b840 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
2b850 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65  ound approximate
2b860 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72   match");......r
2b870 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a  eturn(1);....}..
2b880 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
2b890 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f  eturn(0);.}..CK_
2b8a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2b8b0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
2b8c0 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ects)(CK_SESSION
2b8d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2b8e0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2b8f0 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c  LE_PTR phObject,
2b900 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f   CK_ULONG ulMaxO
2b910 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55  bjectCount, CK_U
2b920 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65  LONG_PTR pulObje
2b930 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75  ctCount) {..stru
2b940 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
2b950 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b  ty *curr_id;..CK
2b960 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
2b970 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _attr;..CK_ULONG
2b980 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75   curr_id_idx, cu
2b990 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63  rr_out_id_idx, c
2b9a0 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65  urr_attr_idx, se
2b9b0 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b  ss_attr_idx;..CK
2b9c0 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63  _ULONG matched_c
2b9d0 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68  ount, prev_match
2b9e0 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d  ed_count;..int m
2b9f0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66  utex_retval;.#if
2ba00 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
2ba10 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
2ba20 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76 61  T..struct timeva
2ba30 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75  l start, end;..u
2ba40 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e  int64_t start_in
2ba50 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64  t, end_int;.#end
2ba60 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
2ba70 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2ba80 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2ba90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2baa0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2bab0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2bac0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2bad0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2bae0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2baf0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2bb00 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74  ...if (pulObject
2bb10 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
2bb20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bb30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2bb40 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69  pulObjectCount i
2bb50 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2bb60 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2bb70 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2bb80 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
2bb90 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  LL && ulMaxObjec
2bba0 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  tCount == 0) {..
2bbb0 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
2bbc0 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
2bbd0 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
2bbe0 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
2bbf0 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
2bc00 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43  */...*pulObjectC
2bc10 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43  ount = 0;....CAC
2bc20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bc30 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2bc40 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
2bc50 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
2bc60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2bc70 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
2bc80 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29  hObject == NULL)
2bc90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bca0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bcb0 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55    phObject is NU
2bcc0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2bcd0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2bce0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
2bcf0 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  MaxObjectCount =
2bd00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2bd10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2bd20 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75  ror.  Maximum nu
2bd30 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
2bd40 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72  specified as zer
2bd50 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  o.");....return(
2bd60 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2bd70 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2bd80 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2bd90 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2bda0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2bdb0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2bdc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2bdd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2bde0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bdf0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2be00 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2be10 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2be20 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2be30 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
2be40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2be50 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2be60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2be70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2be80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2be90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bea0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2beb0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2bec0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2bed0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2bee0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bef0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2bf00 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2bf10 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2bf20 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2bf30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bf40 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2bf50 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2bf60 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2bf70 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2bf80 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2bf90 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2bfa0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2bfb0 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
2bfc0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2bfd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2bfe0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2bff0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c000 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
2c010 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2c020 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2c030 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2c040 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66  ALIZED);..}..#if
2c050 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
2c060 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
2c070 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
2c080 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23  &start, NULL);.#
2c090 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74  endif...curr_out
2c0a0 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  _id_idx = 0;..fo
2c0b0 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d  r (curr_id_idx =
2c0c0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2c0d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2c0e0 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f  h_curr_id; curr_
2c0f0 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  id_idx < cackey_
2c100 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c110 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
2c120 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  unt && ulMaxObje
2c130 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64  ctCount; curr_id
2c140 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
2c150 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  _id = &cackey_se
2c160 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c170 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72  .identities[curr
2c180 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43  _id_idx];....CAC
2c190 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c1a0 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65  ("Processing ide
2c1b0 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73  ntity:%lu", (uns
2c1c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
2c1d0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74  _id_idx);....mat
2c1e0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ched_count = 0;.
2c1f0 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
2c200 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f  r_idx = 0; curr_
2c210 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65  attr_idx < cacke
2c220 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c230 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2c240 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74  y_count; curr_at
2c250 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70  tr_idx++) {....p
2c260 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
2c270 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  t = matched_coun
2c280 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  t;.....curr_attr
2c290 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
2c2a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2c2b0 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f  arch_query[curr_
2c2c0 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43  attr_idx];.....C
2c2d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c2e0 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66  TF("  Checking f
2c2f0 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20  or attribute %s 
2c300 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65  (0x%08lx) in ide
2c310 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41  ntity:%i...", CA
2c320 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2c330 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
2c340 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65  (curr_attr->type
2c350 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
2c360 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
2c370 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  pe, (int) curr_i
2c380 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45  d_idx);....CACKE
2c390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
2c3a0 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b  ("    Value look
2c3b0 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f  ing for:", curr_
2c3c0 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
2c3d0 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
2c3e0 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73  Len);.....for (s
2c3f0 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
2c400 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
2c410 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  < curr_id->attri
2c420 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
2c430 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
2c440 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ....if (cackey_p
2c450 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74  kcs11_compare_at
2c460 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69  tributes(&curr_i
2c470 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
2c480 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75  ss_attr_idx], cu
2c490 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09  rr_attr)) {.....
2c4a0 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b  .matched_count++
2c4b0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
2c4c0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
2c4d0 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74   If the attribut
2c4e0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d  e could not be m
2c4f0 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74  atched, do not t
2c500 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69  ry to match addi
2c510 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65  tional attribute
2c520 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76  s */....if (prev
2c530 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
2c540 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29  = matched_count)
2c550 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
2c560 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61  .}...}....if (ma
2c570 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63  tched_count == c
2c580 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c590 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2c5a0 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09  query_count) {..
2c5b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c5c0 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c  RINTF("  ... All
2c5d0 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63   %i attributes c
2c5e0 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
2c5f0 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  , adding identit
2c600 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64  y:%i to returned
2c610 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61   list", (int) ca
2c620 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c630 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2c640 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
2c650 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
2c660 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72  ....phObject[cur
2c670 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20  r_out_id_idx] = 
2c680 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b  curr_id_idx + 1;
2c690 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74  .....ulMaxObject
2c6a0 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72  Count--;.....cur
2c6b0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a  r_out_id_idx++;.
2c6c0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
2c6d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c6e0 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c  F("  ... Not all
2c6f0 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20   %i (only found 
2c700 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63  %i) attributes c
2c710 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
2c720 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65  , not adding ide
2c730 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29  ntity:%i", (int)
2c740 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2c750 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2c760 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
2c770 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75  int) matched_cou
2c780 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  nt, (int) curr_i
2c790 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09  d_idx);...}..}..
2c7a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c7b0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2c7c0 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f  _curr_id = curr_
2c7d0 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a  id_idx;..*pulObj
2c7e0 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f  ectCount = curr_
2c7f0 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66  out_id_idx;..#if
2c800 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
2c810 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
2c820 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
2c830 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74  &end, NULL);..st
2c840 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74  art_int = (start
2c850 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
2c860 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73  0) + start.tv_us
2c870 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28  ec;..end_int = (
2c880 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  end.tv_sec * 100
2c890 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75  0000) + end.tv_u
2c8a0 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  sec;..fprintf(st
2c8b0 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f  derr, "Search to
2c8c0 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f  ok %lu microseco
2c8d0 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65  nds\n", (unsigne
2c8e0 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74  d long) (end_int
2c8f0 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a   - start_int));.
2c900 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72  #endif...mutex_r
2c910 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2c920 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2c930 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2c940 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2c950 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2c960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c970 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2c980 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2c990 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2c9a0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...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 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c9d0 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62  _OK (%i), num ob
2c9e0 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b  jects = %lu", CK
2c9f0 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74  R_OK, *pulObject
2ca00 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  Count);...return
2ca10 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2ca20 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2ca30 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
2ca40 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ectsFinal)(CK_SE
2ca50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2ca60 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  ssion) {..CK_ULO
2ca70 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  NG idx;..int mut
2ca80 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2ca90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2caa0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2cab0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2cac0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2cad0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cae0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2caf0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2cb00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2cb10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2cb20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2cb30 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2cb40 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2cb50 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2cb60 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2cb70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2cb80 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2cb90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2cba0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2cbb0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2cbc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2cbd0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2cbe0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2cbf0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2cc00 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2cc10 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2cc20 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2cc30 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2cc40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2cc50 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2cc60 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2cc70 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2cc80 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2cc90 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2cca0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2ccb0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2ccc0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2ccd0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2cce0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ccf0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2cd00 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2cd10 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2cd20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2cd30 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2cd40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2cd50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cd60 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
2cd70 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2cd80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2cd90 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2cda0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cdb0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
2cdc0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2cdd0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2cde0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2cdf0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2ce00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ce10 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2ce20 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66  _active = 0;...f
2ce30 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
2ce40 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
2ce50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2ce60 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
2ce70 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
2ce80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ce90 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2cea0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
2ceb0 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  ue) {....free(ca
2cec0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ced0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2cee0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
2cef0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
2cf00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cf10 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2cf20 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65  _query) {...free
2cf30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2cf40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2cf50 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d  h_query);..}...m
2cf60 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2cf70 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2cf80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2cf90 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2cfa0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2cfb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cfc0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2cfd0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2cfe0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2cff0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2d000 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d010 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d020 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2d030 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2d040 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2d050 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d060 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2d070 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
2d080 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2d090 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2d0a0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2d0b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2d0c0 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
2d0d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d0e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2d0f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2d100 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2d110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d120 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2d130 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2d140 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2d150 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2d160 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2d170 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2d180 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2d190 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d1a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2d1b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d1c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2d1d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d1e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2d1f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d200 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
2d210 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
2d220 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2d230 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2d240 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
2d250 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
2d260 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
2d270 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
2d280 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74   pulEncryptedDat
2d290 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
2d2a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d2b0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d2c0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d2d0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d2e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d2f0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d300 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d310 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d320 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d330 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d340 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d350 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d360 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d370 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d380 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d390 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d3a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d3b0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d3c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d3d0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
2d3e0 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
2d3f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d400 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2d410 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2d420 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
2d430 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2d440 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2d450 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
2d460 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
2d470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d480 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2d490 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2d4a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2d4b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d4c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2d4d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2d4e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2d4f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2d500 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2d510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d520 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2d530 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d540 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2d550 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d560 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2d570 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2d580 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2d590 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2d5a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
2d5b0 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
2d5c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d5d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2d5e0 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74  PTR pLastEncrypt
2d5f0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2d600 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72  _PTR pulLastEncr
2d610 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
2d620 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d630 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2d640 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2d650 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2d660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d670 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2d680 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2d690 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2d6a0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2d6b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2d6c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d6d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2d6e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d6f0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2d700 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d710 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2d720 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2d730 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d740 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2d750 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2d760 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43  C_DecryptInit)(C
2d770 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d780 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2d790 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2d7a0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2d7b0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2d7c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2d7d0 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
2d7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d7f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2d800 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2d810 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2d820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d830 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2d840 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2d850 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2d860 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2d870 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2d880 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
2d890 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2d8a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d8b0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
2d8c0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2d8d0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2d8e0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2d8f0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
2d900 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
2d910 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
2d920 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d930 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
2d940 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
2d950 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
2d960 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
2d970 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d980 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
2d990 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2d9a0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2d9b0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2d9c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2d9d0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2d9e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2d9f0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2da00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2da10 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2da20 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2da30 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2da40 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2da50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2da60 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2da70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2da80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2da90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2daa0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2dab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dac0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2dad0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2dae0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2daf0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2db00 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2db10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2db20 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2db30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2db40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2db50 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2db60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2db70 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2db80 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2db90 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2dba0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2dbb0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2dbc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2dbd0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2dbe0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2dbf0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2dc00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2dc10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dc20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
2dc30 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20  rypt already in 
2dc40 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
2dc50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2dc60 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
2dc70 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
2dc80 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2dc90 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2dca0 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
2dcb0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2dcc0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2dcd0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2dce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2dcf0 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
2dd00 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
2dd10 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
2dd20 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
2dd30 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
2dd40 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2dd50 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
2dd60 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
2dd70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2dd80 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2dd90 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
2dda0 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
2ddb0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
2ddc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ddd0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2dde0 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
2ddf0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2de00 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2de10 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
2de20 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
2de30 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  sm;..cackey_sess
2de40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2de50 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
2de60 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70   = pMechanism->p
2de70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b  Parameter;..cack
2de80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2de90 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
2dea0 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65  ch_parmlen = pMe
2deb0 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d  chanism->ulParam
2dec0 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79  eterLen;..cackey
2ded0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2dee0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
2def0 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
2df00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2df10 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
2df20 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
2df30 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2df40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2df50 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2df60 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2df70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2df80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2df90 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2dfa0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2dfb0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2dfc0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2dfd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dfe0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2dff0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2e000 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2e010 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2e020 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2e030 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45  C_Decrypt)(CK_SE
2e040 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2e050 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2e060 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
2e070 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  a, CK_ULONG ulEn
2e080 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
2e090 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2e0a0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2e0b0 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
2e0c0 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f  K_ULONG datalen_
2e0d0 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f  update, datalen_
2e0e0 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65  final;..CK_RV de
2e0f0 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20  crypt_ret;..int 
2e100 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2e110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e120 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e130 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e140 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e160 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e170 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e180 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e190 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e1a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2e1b0 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20   (pulDataLen == 
2e1c0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2e1d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e1e0 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e  rror. pulDataLen
2e1f0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2e200 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2e210 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2e220 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d  datalen_update =
2e230 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09   *pulDataLen;...
2e240 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
2e250 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53  DecryptUpdate(hS
2e260 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74  ession, pEncrypt
2e270 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70  edData, ulEncryp
2e280 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74  tedDataLen, pDat
2e290 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61  a, &datalen_upda
2e2a0 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  te);..if (decryp
2e2b0 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
2e2c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e2d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e2e0 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28    DecryptUpdate(
2e2f0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
2e300 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
2e310 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2e320 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
2e330 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
2e340 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t != CKR_BUFFER_
2e350 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
2e360 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63  /* Terminate dec
2e370 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ryption operatio
2e380 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72  n */.....mutex_r
2e390 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2e3a0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2e3b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
2e3c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2e3d0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2e3e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e3f0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2e400 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
2e410 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2e420 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
2e430 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2e440 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e450 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
2e460 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2e470 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2e480 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
2e490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e4a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2e4b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2e4c0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2e4d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2e4e0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
2e4f0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2e500 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e510 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
2e520 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
2e530 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2e540 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2e550 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e560 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2e570 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
2e580 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
2e590 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2e5a0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2e5b0 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  D);....}.....cac
2e5c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e5d0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
2e5e0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d  ctive = 0;.....m
2e5f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2e600 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2e610 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2e620 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
2e630 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2e640 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e650 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e660 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2e670 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
2e680 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2e690 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  OR);....}...}...
2e6a0 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
2e6b0 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
2e6c0 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20  Data) {...pData 
2e6d0 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  += datalen_updat
2e6e0 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66  e;..}..datalen_f
2e6f0 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c  inal = *pulDataL
2e700 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en - datalen_upd
2e710 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  ate;...decrypt_r
2e720 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  et = C_DecryptFi
2e730 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  nal(hSession, pD
2e740 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69  ata, &datalen_fi
2e750 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79  nal);..if (decry
2e760 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
2e770 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e780 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e790 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28  .  DecryptFinal(
2e7a0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
2e7b0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
2e7c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2e7d0 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
2e7e0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
2e7f0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  _ret);..}...*pul
2e800 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65  DataLen = datale
2e810 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c  n_update + datal
2e820 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b  en_final;...CACK
2e830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e840 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2e850 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2e860 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2e870 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2e880 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e890 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
2e8a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2e8b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2e8c0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2e8d0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2e8e0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
2e8f0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
2e900 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2e910 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
2e920 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
2e930 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b  BYTE buf[16384];
2e940 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  ..ssize_t buflen
2e950 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ;..CK_SLOT_ID sl
2e960 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74  otID;..CK_RV ret
2e970 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2e980 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75  L_ERROR;..int mu
2e990 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2e9a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e9b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2e9c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2e9d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2e9e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e9f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2ea00 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2ea10 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2ea20 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2ea30 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2ea40 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2ea50 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2ea60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2ea70 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2ea80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2ea90 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2eaa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2eab0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2eac0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2ead0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2eae0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2eaf0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2eb00 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
2eb10 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63  == NULL && ulEnc
2eb20 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
2eb30 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
2eb40 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
2eb50 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72  re asked to decr
2eb60 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ypt nothing... *
2eb70 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
2eb80 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2eb90 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
2eba0 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
2ebb0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
2ebc0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
2ebd0 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64  ..if (pEncrypted
2ebe0 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
2ebf0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ec00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45  RINTF("Error. pE
2ec10 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73 20  ncryptedPart is 
2ec20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72  NULL, but ulEncr
2ec30 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
2ec40 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
2ec50 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2ec60 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2ec70 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  (ulEncryptedPart
2ec80 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  Len == 0) {...CA
2ec90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2eca0 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72  F("Error. ulEncr
2ecb0 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
2ecc0 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
2ecd0 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
2ece0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2ecf0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2ed00 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d  if (pulPartLen =
2ed10 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2ed20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ed30 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c  "Error. pulPartL
2ed40 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
2ed50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2ed60 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2ed70 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2ed80 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2ed90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2eda0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2edb0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2edc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2edd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2ede0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2edf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2ee00 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2ee10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2ee20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ee30 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
2ee40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2ee50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2ee60 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2ee70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ee80 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2ee90 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2eea0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2eeb0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2eec0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2eed0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2eee0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
2eef0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2ef00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ef10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ef20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ef30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ef40 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
2ef50 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2ef60 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2ef70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2ef80 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
2ef90 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2efa0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
2efb0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
2efc0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
2efd0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2efe0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
2eff0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
2f000 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2f010 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f020 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
2f030 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
2f040 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
2f050 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
2f060 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2f070 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2f080 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2f090 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
2f0a0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
2f0b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f0c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
2f0d0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
2f0e0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
2f0f0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
2f100 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
2f110 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2f120 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2f130 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
2f140 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2f150 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
2f160 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2f170 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2f180 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ypt_mechanism) {
2f190 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
2f1a0 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20  PKCS:..../* Ask 
2f1b0 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20  card to decrypt 
2f1c0 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63  */....buflen = c
2f1d0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
2f1e0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
2f1f0 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
2f200 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f210 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
2f220 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50  ity, pEncryptedP
2f230 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  art, ulEncrypted
2f240 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69  PartLen, buf, si
2f250 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29  zeof(buf), 0, 1)
2f260 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  ;.....if (buflen
2f270 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2f280 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63  E_NEEDLOGIN && c
2f290 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
2f2a0 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  d != NULL) {....
2f2b0 09 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65  .if (C_LoginMute
2f2c0 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43  xArg(hSession, C
2f2d0 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30  KU_USER, NULL, 0
2f2e0 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  , 0) == CKR_OK) 
2f2f0 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d 20  {......buflen = 
2f300 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
2f310 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
2f320 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
2f330 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2f340 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
2f350 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
2f360 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
2f370 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
2f380 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
2f390 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
2f3a0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30  ..if (buflen < 0
2f3b0 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
2f3c0 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f  ption failed. */
2f3d0 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2f3e0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2f3f0 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
2f400 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2f410 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
2f420 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
2f430 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
2f440 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
2f450 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
2f460 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
2f470 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
2f480 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41  } else {......CA
2f490 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f4a0 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e  F("Failed to sen
2f4b0 64 20 41 50 44 55 2c 20 65 72 72 6f 72 20 3d 20  d APDU, error = 
2f4c0 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69 6e 74 29  %li", (long int)
2f4d0 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09   buflen);.......
2f4e0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2f4f0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
2f500 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
2f510 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
2f520 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50   buflen) > *pulP
2f530 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29  artLen && pPart)
2f540 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
2f550 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ted data too lar
2f560 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c  ge */.....retval
2f570 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
2f580 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c  O_SMALL;....} el
2f590 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61  se {.....if (pPa
2f5a0 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  rt) {......memcp
2f5b0 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75  y(pPart, buf, bu
2f5c0 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  flen);.....}....
2f5d0 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20  ..*pulPartLen = 
2f5e0 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
2f5f0 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
2f600 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
2f610 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2f620 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2f630 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2f640 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2f650 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2f660 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f670 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2f680 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2f690 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f6a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2f6b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2f6c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2f6d0 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
2f6e0 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74  ) retval);...ret
2f6f0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
2f700 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2f710 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2f720 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  yptFinal)(CK_SES
2f730 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2f740 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2f750 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f  R pLastPart, CK_
2f760 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
2f770 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  tPartLen) {..int
2f780 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
2f790 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65  int terminate_de
2f7a0 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43  crypt = 1;...CAC
2f7b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f7c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2f7d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2f7e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2f7f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f800 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2f810 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2f820 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2f830 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2f840 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2f850 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2f860 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2f870 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2f880 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2f890 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2f8a0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2f8b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f8c0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2f8d0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2f8e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2f8f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2f900 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2f910 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
2f920 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2f930 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f940 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50  "Error. pulLastP
2f950 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
2f960 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2f970 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2f980 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2f990 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2f9a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2f9b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2f9c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2f9d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f9f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2fa00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2fa10 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2fa20 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2fa30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2fa40 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2fa50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2fa60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2fa70 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2fa80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2fa90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2faa0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2fab0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2fac0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2fad0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2fae0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2faf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2fb00 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
2fb10 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2fb20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2fb30 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2fb40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fb50 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
2fb60 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2fb70 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2fb80 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2fb90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  IZED);..}...*pul
2fba0 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b  LastPartLen = 0;
2fbb0 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74  ...if (pLastPart
2fbc0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65   == NULL) {...te
2fbd0 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
2fbe0 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  = 0;..}...if (te
2fbf0 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29  rminate_decrypt)
2fc00 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
2fc10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2fc20 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
2fc30 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
2fc40 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2fc50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2fc60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2fc70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2fc80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2fc90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fca0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2fcb0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2fcc0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2fcd0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2fce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fcf0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2fd00 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2fd10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2fd20 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2fd30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2fd40 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28  , C_DigestInit)(
2fd50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2fd60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2fd70 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2fd80 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b  chanism) {..CACK
2fd90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fda0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2fdb0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2fdc0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2fdd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fde0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2fdf0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2fe00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2fe10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2fe20 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2fe30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2fe40 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2fe50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2fe60 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2fe70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2fe80 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2fe90 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2fea0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2feb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2fec0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2fed0 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  est)(CK_SESSION_
2fee0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2fef0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2ff00 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
2ff10 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
2ff20 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
2ff30 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
2ff40 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
2ff50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ff60 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2ff70 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2ff80 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2ff90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ffa0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2ffb0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2ffc0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2ffd0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2ffe0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2fff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
30000 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
30010 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30020 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
30030 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30040 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
30050 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30060 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
30070 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30080 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
30090 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
300a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
300b0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
300c0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
300d0 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09  G ulPartLen) {..
300e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
300f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30100 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
30110 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
30120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30130 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
30140 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
30150 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30160 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30170 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
30180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30190 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
301a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
301b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
301c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
301d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
301e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
301f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30200 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
30210 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
30220 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53  _DigestKey)(CK_S
30230 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
30240 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
30250 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
30260 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30270 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
30280 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
30290 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
302a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
302b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
302c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
302d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
302e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
302f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
30300 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30310 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
30320 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30330 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
30340 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30350 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
30360 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
30370 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30380 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
30390 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
303a0 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28   C_DigestFinal)(
303b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
303c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
303d0 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c  YTE_PTR pDigest,
303e0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
303f0 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43  lDigestLen) {..C
30400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30410 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30420 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
30430 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
30440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30450 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30460 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30470 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30480 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30490 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
304a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
304b0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
304c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
304d0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
304e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
304f0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
30500 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30510 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30520 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
30530 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
30540 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53  SignInit)(CK_SES
30550 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
30560 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
30570 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
30580 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
30590 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
305a0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
305b0 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
305c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
305d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
305e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
305f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
30600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30610 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
30620 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
30630 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
30640 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
30650 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
30660 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
30670 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
30680 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30690 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
306a0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
306b0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
306c0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
306d0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
306e0 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
306f0 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
30700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30710 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
30720 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
30730 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
30740 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
30750 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
30760 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
30770 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
30780 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
30790 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
307a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
307b0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
307c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
307d0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
307e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
307f0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
30800 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
30810 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
30820 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
30830 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
30840 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
30850 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
30860 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
30870 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
30880 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
30890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
308a0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
308b0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
308c0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
308d0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
308e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
308f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
30900 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
30910 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
30920 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
30930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30940 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
30950 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
30960 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
30970 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
30980 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
30990 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
309a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
309b0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
309c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
309d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
309e0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
309f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30a00 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64  or.  Sign alread
30a10 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
30a20 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
30a30 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
30a40 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
30a50 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
30a60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30a70 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
30a80 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
30a90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
30aa0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
30ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30ac0 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
30ad0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
30ae0 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
30af0 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
30b00 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
30b10 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
30b20 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
30b30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
30b40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30b50 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
30b60 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
30b70 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
30b80 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
30b90 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
30ba0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30bb0 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a  gn_active = 1;..
30bc0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
30bd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
30be0 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63  mechanism = pMec
30bf0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
30c00 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  m;...cackey_sess
30c10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
30c20 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38  ign_buflen = 128
30c30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
30c40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30c50 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09  n_bufused = 0;..
30c60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30c70 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
30c80 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  uf = malloc(size
30c90 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
30ca0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
30cb0 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
30cc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30cd0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
30ce0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
30cf0 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e  _PRINTF("Session
30d00 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69   %lu sign_identi
30d10 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69  ty is %p (identi
30d20 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69  ty #%lu)", (unsi
30d30 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73  gned long) hSess
30d40 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63  ion, (void *) &c
30d50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30d60 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
30d70 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69  ies[hKey], (unsi
30d80 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29  gned long) hKey)
30d90 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
30da0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30db0 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  n_identity = &ca
30dc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30dd0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
30de0 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65  es[hKey];...mute
30df0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
30e00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
30e10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
30e20 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
30e30 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
30e40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30e50 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
30e60 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
30e70 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
30e80 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
30e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30ea0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30eb0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
30ec0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
30ed0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
30ee0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
30ef0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b  K_RV, C_Sign)(CK
30f00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
30f10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
30f20 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
30f30 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
30f40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
30f50 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
30f60 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75  G_PTR pulSignatu
30f70 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  reLen) {..unsign
30f80 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69  ed long start_si
30f90 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f  gn_bufused;..CK_
30fa0 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e  RV sign_ret;..in
30fb0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
30fc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30fd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
30fe0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
30ff0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
31000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31010 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
31020 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
31030 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
31040 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
31050 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
31060 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
31070 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
31080 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
31090 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
310a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
310b0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
310c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
310d0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
310e0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
310f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
31100 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
31110 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
31120 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75  .start_sign_bufu
31130 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  sed = cackey_ses
31140 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31150 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
31160 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
31170 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  nUpdate(hSession
31180 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c  , pData, ulDataL
31190 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
311a0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
311b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
311c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
311d0 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75  ignUpdate() retu
311e0 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
311f0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
31200 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
31210 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67  ret);....if (sig
31220 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  n_ret != CKR_BUF
31230 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
31240 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
31250 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
31260 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31270 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
31280 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
31290 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
312a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
312b0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
312c0 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
312d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
312e0 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
312f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
31300 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
31310 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
31320 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
31330 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
31340 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
31350 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31360 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
31370 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
31380 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
31390 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
313a0 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
313b0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
313c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
313d0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  n_active) {.....
313e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
313f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
31400 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ck);......CACKEY
31410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31420 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
31430 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
31440 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
31450 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
31460 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
31470 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
31480 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31490 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
314a0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
314b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
314c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
314d0 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
314e0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
314f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
31500 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31510 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
31520 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
31530 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
31540 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  RROR);....}...}.
31550 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
31560 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72  et);..}...sign_r
31570 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c  et = C_SignFinal
31580 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e  (hSession, pSign
31590 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74  ature, pulSignat
315a0 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69  ureLen);..if (si
315b0 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  gn_ret != CKR_OK
315c0 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  ) {...if (sign_r
315d0 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  et == CKR_BUFFER
315e0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
315f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31600 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28  INTF("SignFinal(
31610 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42  ) returned CKR_B
31620 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20  UFFER_TOO_SMALL 
31630 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f  (rv = %lu), undo
31640 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
31650 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ()", (unsigned l
31660 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
31670 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
31680 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31690 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
316a0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
316b0 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e  .....return(sign
316c0 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  _ret);...}....CA
316d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
316e0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46  F("Error.  SignF
316f0 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
31700 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
31710 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
31720 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
31730 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
31740 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
31750 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c  Signature == NUL
31760 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
31770 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67  BUG_PRINTF("pSig
31780 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64  nature specified
31790 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e   as NULL, undoin
317a0 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
317b0 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ");....cackey_se
317c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
317d0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  .sign_bufused = 
317e0 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
317f0 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  ed;....return(si
31800 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
31810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31820 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
31830 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
31840 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
31850 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
31860 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
31870 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
31880 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
31890 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
318a0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
318b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
318c0 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
318d0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 72 65  _retval;..int re
318e0 73 69 7a 65 52 65 74 72 79 3b 0a 09 69 6e 74 20  sizeRetry;..int 
318f0 6e 65 65 64 52 65 73 69 7a 65 3b 0a 0a 09 43 41  needResize;...CA
31900 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31910 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
31920 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
31930 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
31940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31950 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
31960 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
31970 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
31980 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
31990 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
319a0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
319b0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
319c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
319d0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
319e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
319f0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
31a00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31a10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
31a20 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
31a30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
31a40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
31a50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
31a60 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26  (pPart == NULL &
31a70 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30  & ulPartLen == 0
31a80 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
31a90 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65  ircuit if we are
31aa0 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e   asked to sign n
31ab0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
31ac0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31ad0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
31ae0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
31af0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
31b00 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
31b10 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
31b20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (pPart == NULL) 
31b30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
31b40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
31b50 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  pPart is NULL, b
31b60 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  ut ulPartLen is 
31b70 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
31b80 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
31b90 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
31ba0 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  (ulPartLen == 0)
31bb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
31bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31bd0 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c   ulPartLen is 0,
31be0 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f   but pPart is no
31bf0 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
31c00 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
31c10 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
31c20 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
31c30 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
31c40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
31c50 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
31c60 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
31c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31c80 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
31c90 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
31ca0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
31cb0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
31cc0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
31cd0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
31ce0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
31cf0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
31d00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
31d10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31d20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
31d30 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
31d40 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
31d50 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
31d60 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
31d70 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
31d80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31d90 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
31da0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
31db0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
31dc0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
31dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31de0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
31df0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
31e00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
31e10 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
31e20 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77  ALIZED);..}...sw
31e30 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
31e40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31e50 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
31e60 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
31e70 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63  _PKCS:..../* Acc
31e80 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79  umulate directly
31e90 20 2a 2f 0a 09 09 09 66 6f 72 20 28 72 65 73 69   */....for (resi
31ea0 7a 65 52 65 74 72 79 20 3d 20 30 3b 20 72 65 73  zeRetry = 0; res
31eb0 69 7a 65 52 65 74 72 79 20 3c 20 31 31 3b 20 72  izeRetry < 11; r
31ec0 65 73 69 7a 65 52 65 74 72 79 2b 2b 29 20 7b 0a  esizeRetry++) {.
31ed0 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65 20 3d  ....needResize =
31ee0 20 30 3b 0a 09 09 09 09 69 66 20 28 28 63 61 63   0;.....if ((cac
31ef0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
31f00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
31f10 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29  sed + ulPartLen)
31f20 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   > cackey_sessio
31f30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31f40 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09  n_buflen) {.....
31f50 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 31 3b  .needResize = 1;
31f60 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
31f70 21 6e 65 65 64 52 65 73 69 7a 65 29 20 7b 0a 09  !needResize) {..
31f80 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
31f90 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
31fa0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 69 7a  UG_PRINTF("Resiz
31fb0 69 6e 67 20 73 69 67 6e 69 6e 67 20 62 75 66 66  ing signing buff
31fc0 65 72 20 28 74 72 79 20 23 25 69 20 6f 66 20 31  er (try #%i of 1
31fd0 30 20 2d 2d 20 31 31 74 68 20 69 73 20 66 61 74  0 -- 11th is fat
31fe0 61 6c 29 22 2c 20 72 65 73 69 7a 65 52 65 74 72  al)", resizeRetr
31ff0 79 29 3b 0a 0a 09 09 09 09 69 66 20 28 72 65 73  y);......if (res
32000 69 7a 65 52 65 74 72 79 20 3d 3d 20 31 30 29 20  izeRetry == 10) 
32010 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b  {......free(cack
32020 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32030 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b  sion].sign_buf);
32040 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  .......cackey_se
32050 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32060 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 30  .sign_buflen = 0
32070 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  ;......cackey_se
32080 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32090 2e 73 69 67 6e 5f 62 75 66 20 3d 20 4e 55 4c 4c  .sign_buf = NULL
320a0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
320b0 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
320c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
320d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
320e0 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65  *= 2;......cacke
320f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32100 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
32110 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73  realloc(cackey_s
32120 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32130 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65  ].sign_buf, size
32140 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
32150 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32160 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
32170 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
32180 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
32190 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63  ;....}.....if (c
321a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
321b0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
321c0 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  f == NULL) {....
321d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
321e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
321f0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
32200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32210 45 72 72 6f 72 2e 20 20 53 69 67 6e 69 6e 67 20  Error.  Signing 
32220 62 75 66 66 65 72 20 69 73 20 4e 55 4c 4c 2e 22  buffer is NULL."
32230 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
32240 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
32250 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
32260 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
32270 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
32280 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73  n_buf + cackey_s
32290 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
322a0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
322b0 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e  pPart, ulPartLen
322c0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
322d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
322e0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d  .sign_bufused +=
322f0 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09   ulPartLen;.....
32300 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  break;..}...mute
32310 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
32320 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
32330 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
32340 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
32350 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
32360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32370 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
32380 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
32390 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
323a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
323b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
323c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
323d0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
323e0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
323f0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
32400 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
32410 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61  K_RV, C_SignFina
32420 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
32430 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
32440 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
32450 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
32460 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
32470 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
32480 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30  K_BYTE sigbuf[10
32490 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69  24];..ssize_t si
324a0 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f  gbuflen;..CK_SLO
324b0 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b  T_ID slotID;..CK
324c0 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52  _RV retval = CKR
324d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
324e0 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73  .int terminate_s
324f0 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75  ign = 1;..int mu
32500 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
32510 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32520 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
32530 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
32540 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
32550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32560 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
32570 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
32580 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
32590 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
325a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
325b0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
325c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
325d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
325e0 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e  ("Error. pulSign
325f0 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c  atureLen is NULL
32600 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
32610 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
32620 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
32630 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
32640 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
32650 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
32660 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
32670 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
32680 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
32690 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
326a0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
326b0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
326c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
326d0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
326e0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
326f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
32700 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
32710 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
32720 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
32730 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
32740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
32750 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
32760 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
32770 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
32780 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
32790 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
327a0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
327b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
327c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
327d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
327e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
327f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
32800 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
32810 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
32820 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
32830 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
32840 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
32850 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32860 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
32870 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
32880 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
32890 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
328a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
328b0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
328c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
328d0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
328e0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
328f0 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
32900 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
32910 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
32920 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
32930 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
32940 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
32950 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
32960 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
32970 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
32980 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32990 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
329a0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
329b0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
329c0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
329d0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
329e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
329f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
32a00 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
32a10 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
32a20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32a30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
32a40 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
32a50 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
32a60 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
32a70 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
32a80 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
32a90 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
32aa0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
32ab0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
32ac0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
32ad0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
32ae0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
32af0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
32b00 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
32b10 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61  CS:..../* Ask ca
32b20 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09  rd to sign */...
32b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
32b40 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20  INTF("Asking to 
32b50 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69  sign from identi
32b60 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e  ty %p in session
32b70 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20   %lu", (void *) 
32b80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32b90 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
32ba0 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e  dentity, (unsign
32bb0 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
32bc0 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e  n);....sigbuflen
32bd0 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
32be0 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
32bf0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
32c00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32c10 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
32c20 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73  tity, cackey_ses
32c30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
32c40 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79  sign_buf, cackey
32c50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
32c60 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
32c70 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66  , sigbuf, sizeof
32c80 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b  (sigbuf), 1, 0);
32c90 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
32ca0 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
32cb0 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26  C_E_NEEDLOGIN &&
32cc0 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
32cd0 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and != NULL) {..
32ce0 09 09 09 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75  ...if (C_LoginMu
32cf0 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c  texArg(hSession,
32d00 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c   CKU_USER, NULL,
32d10 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b   0, 0) == CKR_OK
32d20 29 20 7b 0a 09 09 09 09 09 73 69 67 62 75 66 6c  ) {......sigbufl
32d30 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
32d40 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
32d50 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63  slots[slotID], c
32d60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32d70 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
32d80 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73  entity, cackey_s
32d90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32da0 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b  ].sign_buf, cack
32db0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32dc0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
32dd0 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65  ed, sigbuf, size
32de0 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30  of(sigbuf), 1, 0
32df0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
32e00 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
32e10 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  < 0) {...../* Si
32e20 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f  gning failed. */
32e30 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
32e40 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
32e50 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b  C_E_NEEDLOGIN) {
32e60 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
32e70 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47  KR_USER_NOT_LOGG
32e80 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73  ED_IN;.....} els
32e90 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  e if (sigbuflen 
32ea0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
32eb0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a  _TOKENABSENT) {.
32ec0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
32ed0 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
32ee0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
32ef0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
32f00 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
32f10 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
32f20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  if (((unsigned l
32f30 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20  ong) sigbuflen) 
32f40 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  > *pulSignatureL
32f50 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65  en && pSignature
32f60 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65  ) {...../* Signe
32f70 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
32f80 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44   */.....CACKEY_D
32f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74  EBUG_PRINTF("ret
32fa0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
32fb0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67  _TOO_SMALL;  sig
32fc0 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75  buflen = %lu, pu
32fd0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
32fe0 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
32ff0 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c  long) sigbuflen,
33000 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
33010 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
33020 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  n);......retval 
33030 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
33040 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72  _SMALL;......ter
33050 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
33060 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
33070 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
33080 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53  = 0;......if (pS
33090 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
330a0 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75  .memcpy(pSignatu
330b0 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62  re, sigbuf, sigb
330c0 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65  uflen);.......te
330d0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
330e0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
330f0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
33100 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  sigbuflen;......
33110 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
33120 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
33130 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
33140 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66  ate_sign) {...if
33150 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
33160 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
33170 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28  _buf) {....free(
33180 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
33190 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
331a0 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  uf);...}....cack
331b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
331c0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
331d0 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65  e = 0;..}...mute
331e0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
331f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
33200 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
33210 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
33220 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
33230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33240 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
33250 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
33260 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
33270 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
33280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33290 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
332a0 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
332b0 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
332c0 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
332d0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
332e0 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  V, C_SignRecover
332f0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
33300 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33310 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
33320 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
33330 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
33340 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
33350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
33360 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
33370 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
33380 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
33390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
333a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
333b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
333c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
333d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
333e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
333f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
33400 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
33410 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33420 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
33430 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33440 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
33450 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33460 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
33470 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
33480 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
33490 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
334a0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
334b0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
334c0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
334d0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
334e0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
334f0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
33500 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
33510 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
33520 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33530 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
33540 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
33550 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33560 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33570 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33580 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33590 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
335a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
335b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
335c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
335d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
335e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
335f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
33600 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
33610 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
33620 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33630 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
33640 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
33650 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28  , C_VerifyInit)(
33660 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
33670 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
33680 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
33690 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
336a0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
336b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
336c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
336d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
336e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
336f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33700 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33710 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33720 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33730 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33740 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33760 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33770 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33780 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
33790 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
337a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
337b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
337c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
337d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
337e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
337f0 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53  , C_Verify)(CK_S
33800 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33810 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
33820 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
33830 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
33840 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
33850 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
33860 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
33870 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
33880 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
33890 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
338a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
338b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
338c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
338d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
338e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
338f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33900 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33920 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33930 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33940 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
33950 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
33960 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
33970 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
33980 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33990 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
339a0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
339b0 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  , C_VerifyUpdate
339c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
339d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
339e0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
339f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
33a00 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
33a10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
33a20 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
33a30 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
33a40 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
33a50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
33a60 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
33a70 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
33a80 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
33a90 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
33aa0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
33ab0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
33ac0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
33ad0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
33ae0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
33af0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33b00 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
33b10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33b20 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
33b30 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
33b40 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46  CK_RV, C_VerifyF
33b50 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
33b60 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33b70 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
33b80 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
33b90 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
33ba0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
33bb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
33bc0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
33bd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
33be0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
33bf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
33c00 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
33c10 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
33c20 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
33c30 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
33c40 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
33c50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
33c60 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
33c70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
33c80 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
33c90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33ca0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
33cb0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33cc0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
33cd0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
33ce0 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63  _RV, C_VerifyRec
33cf0 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
33d00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33d10 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
33d20 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
33d30 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
33d40 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
33d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33d60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
33d70 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
33d80 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
33d90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33da0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
33db0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
33dc0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
33dd0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
33de0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
33df0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33e00 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
33e10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33e20 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
33e30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33e40 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
33e50 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
33e60 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
33e70 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
33e80 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
33e90 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f  rifyRecover)(CK_
33ea0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
33eb0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
33ec0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
33ed0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
33ee0 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54  atureLen, CK_BYT
33ef0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
33f00 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
33f10 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
33f20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
33f30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
33f40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
33f50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
33f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
33f70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
33f80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
33f90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
33fa0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
33fb0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
33fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
33fd0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
33fe0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33ff0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
34000 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34010 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
34020 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34030 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
34040 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
34050 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
34060 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43  EncryptUpdate)(C
34070 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
34080 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
34090 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
340a0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
340b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
340c0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
340d0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
340e0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
340f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
34100 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
34110 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
34120 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
34130 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34140 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
34150 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
34160 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
34170 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
34180 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
34190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
341a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
341b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
341c0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
341d0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
341e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
341f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
34200 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34210 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
34220 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
34230 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73  , C_DecryptDiges
34240 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
34250 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
34260 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
34270 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
34280 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
34290 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
342a0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
342b0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
342c0 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
342d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
342e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
342f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
34300 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
34310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34320 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
34330 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
34340 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
34350 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
34360 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
34370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34380 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
34390 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
343a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
343b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
343c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
343d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
343e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
343f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
34400 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
34410 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  gnEncryptUpdate)
34420 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
34430 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
34440 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
34450 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
34460 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
34470 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
34480 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
34490 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
344a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
344b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
344c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
344d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
344e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
344f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
34500 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
34510 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
34520 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
34530 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
34540 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34550 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
34560 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
34570 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
34580 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
34590 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
345a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
345b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
345c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
345d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
345e0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72  RV, C_DecryptVer
345f0 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ifyUpdate)(CK_SE
34600 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
34610 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
34620 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
34630 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
34640 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
34650 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
34660 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
34670 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
34680 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34690 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
346a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
346b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
346c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
346d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
346e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
346f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
34700 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
34710 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
34720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34730 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
34740 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34750 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
34760 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34770 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
34780 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
34790 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
347a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
347b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
347c0 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f  GenerateKey)(CK_
347d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
347e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
347f0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
34800 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55  nism, CK_ATTRIBU
34810 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
34820 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
34830 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
34840 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
34850 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
34860 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
34870 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
34880 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
34890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
348a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
348b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
348c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
348d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
348e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
348f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34900 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
34910 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34920 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
34930 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
34940 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
34950 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
34960 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34970 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
34980 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
34990 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  , C_GenerateKeyP
349a0 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  air)(CK_SESSION_
349b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
349c0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
349d0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
349e0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
349f0 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74  PublicKeyTemplat
34a00 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75  e, CK_ULONG ulPu
34a10 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65  blicKeyAttribute
34a20 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42  Count, CK_ATTRIB
34a30 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65  UTE_PTR pPrivate
34a40 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
34a50 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b  ULONG ulPrivateK
34a60 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  eyAttributeCount
34a70 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
34a80 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b  LE_PTR phPublicK
34a90 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
34aa0 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61  NDLE_PTR phPriva
34ab0 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  teKey) {..CACKEY
34ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
34ad0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
34ae0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
34af0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
34b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
34b10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
34b20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
34b30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
34b40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
34b50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
34b60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
34b70 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
34b80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34b90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
34ba0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34bb0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
34bc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34bd0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
34be0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
34bf0 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b  N(CK_RV, C_WrapK
34c00 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
34c10 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
34c20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
34c30 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
34c40 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57  OBJECT_HANDLE hW
34c50 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f  rappingKey, CK_O
34c60 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
34c70 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
34c80 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
34c90 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70  LONG_PTR pulWrap
34ca0 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41  pedKeyLen) {..CA
34cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34cc0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
34cd0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
34ce0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
34cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34d00 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
34d10 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
34d20 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
34d30 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
34d40 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
34d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34d60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
34d70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34d80 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
34d90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34da0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
34db0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
34dc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34dd0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
34de0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55  CTION(CK_RV, C_U
34df0 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  nwrapKey)(CK_SES
34e00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
34e10 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
34e20 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
34e30 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
34e40 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b  DLE hUnwrappingK
34e50 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
34e60 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
34e70 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b  ULONG ulWrappedK
34e80 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42  eyLen, CK_ATTRIB
34e90 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
34ea0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
34eb0 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
34ec0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
34ed0 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
34ee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34ef0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
34f00 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
34f10 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
34f20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34f30 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
34f40 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
34f50 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
34f60 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
34f70 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
34f80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34f90 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
34fa0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34fb0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
34fc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34fd0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
34fe0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
34ff0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
35000 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
35010 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
35020 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  riveKey)(CK_SESS
35030 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
35040 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
35050 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
35060 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
35070 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f  LE hBaseKey, CK_
35080 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
35090 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
350a0 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
350b0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
350c0 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
350d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
350e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
350f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
35100 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
35110 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35120 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
35130 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
35140 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
35150 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
35160 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
35170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35180 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
35190 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
351a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
351b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
351c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
351d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
351e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
351f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
35200 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
35210 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28  , C_SeedRandom)(
35220 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
35230 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
35240 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43  YTE_PTR pSeed, C
35250 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65  K_ULONG ulSeedLe
35260 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
35270 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
35280 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
35290 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
352a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
352b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
352c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
352d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
352e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
352f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
35300 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
35310 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
35320 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
35330 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
35340 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
35350 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
35360 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
35370 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
35380 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
35390 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
353a0 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52  _RV, C_GenerateR
353b0 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f  andom)(CK_SESSIO
353c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
353d0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
353e0 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55  RandomData, CK_U
353f0 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e  LONG ulRandomLen
35400 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
35410 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
35420 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
35430 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
35440 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
35450 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
35460 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
35470 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
35480 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
35490 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
354a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
354b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
354c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
354d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
354e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
354f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
35500 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
35510 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
35520 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70  RTED);.}../* Dep
35530 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
35540 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
35550 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
35560 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
35570 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
35580 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
35590 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
355a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
355b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
355c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
355d0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
355e0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69  NOT_PARALLEL (%i
355f0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
35600 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
35610 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
35620 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
35630 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20  EL);...hSession 
35640 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53  = hSession; /* S
35650 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
35660 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
35670 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74  /.}../* Deprecat
35680 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43  ed Function */.C
35690 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
356a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65  N(CK_RV, C_Cance
356b0 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45  lFunction)(CK_SE
356c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
356d0 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59  ssion) {..CACKEY
356e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
356f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
35700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
35710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
35720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
35730 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f  LLEL (%i)", CKR_
35740 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
35750 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e  ALLEL);...return
35760 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
35770 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68  T_PARALLEL);...h
35780 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69  Session = hSessi
35790 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  on; /* Supress u
357a0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
357b0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
357c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
357d0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63  CK_RV, C_GetFunc
357e0 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e  tionList)(CK_FUN
357f0 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50  CTION_LIST_PTR_P
35800 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  TR ppFunctionLis
35810 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  t) {..static CK_
35820 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
35830 52 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  R spFunctionList
35840 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 46 55 4e   = NULL;..CK_FUN
35850 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70  CTION_LIST_PTR p
35860 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
35870 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
35880 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
35890 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e  ..if (ppFunction
358a0 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
358b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
358c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70  RINTF("Error. pp
358d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20  FunctionList is 
358e0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
358f0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
35900 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
35910 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 21  spFunctionList !
35920 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 70 46  = NULL) {...*ppF
35930 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 73 70  unctionList = sp
35940 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
35950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35960 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
35970 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
35980 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
35990 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 70  (CKR_OK);..}...p
359a0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d  FunctionList = m
359b0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46  alloc(sizeof(*pF
359c0 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a  unctionList));..
359d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
359e0 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  version.major = 
359f0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
35a00 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
35a10 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
35a20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
35a30 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
35a40 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
35a50 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
35a60 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70  > 8) & 0xff;...p
35a70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35a80 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49  Initialize = C_I
35a90 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e  nitialize;..pFun
35aa0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
35ab0 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69  alize = C_Finali
35ac0 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
35ad0 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20  st->C_GetInfo = 
35ae0 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  C_GetInfo;..pFun
35af0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
35b00 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74  SlotList = C_Get
35b10 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63  SlotList;..pFunc
35b20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
35b30 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  lotInfo = C_GetS
35b40 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  lotInfo;..pFunct
35b50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f  ionList->C_GetTo
35b60 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54  kenInfo = C_GetT
35b70 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  okenInfo;..pFunc
35b80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74  tionList->C_Wait
35b90 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43  ForSlotEvent = C
35ba0 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
35bb0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
35bc0 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  t->C_GetMechanis
35bd0 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63  mList = C_GetMec
35be0 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75  hanismList;..pFu
35bf0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
35c00 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d  tMechanismInfo =
35c10 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
35c20 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
35c30 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e  ist->C_InitToken
35c40 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a   = C_InitToken;.
35c50 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35c60 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e  C_InitPIN = C_In
35c70 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  itPIN;..pFunctio
35c80 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20  nList->C_SetPIN 
35c90 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75  = C_SetPIN;..pFu
35ca0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70  nctionList->C_Op
35cb0 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70  enSession = C_Op
35cc0 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  enSession;..pFun
35cd0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
35ce0 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c  seSession = C_Cl
35cf0 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75  oseSession;..pFu
35d00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c  nctionList->C_Cl
35d10 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d  oseAllSessions =
35d20 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69   C_CloseAllSessi
35d30 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ons;..pFunctionL
35d40 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f  ist->C_GetSessio
35d50 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73  nInfo = C_GetSes
35d60 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  sionInfo;..pFunc
35d70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f  tionList->C_GetO
35d80 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
35d90 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
35da0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
35db0 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74  ist->C_SetOperat
35dc0 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74  ionState = C_Set
35dd0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
35de0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35df0 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69  C_Login = C_Logi
35e00 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
35e10 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f  t->C_Logout = C_
35e20 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69  Logout;..pFuncti
35e30 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65  onList->C_Create
35e40 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74  Object = C_Creat
35e50 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  eObject;..pFunct
35e60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f  ionList->C_CopyO
35e70 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62  bject = C_CopyOb
35e80 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
35e90 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f  List->C_DestroyO
35ea0 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f  bject = C_Destro
35eb0 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  yObject;..pFunct
35ec0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62  ionList->C_GetOb
35ed0 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74  jectSize = C_Get
35ee0 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75  ObjectSize;..pFu
35ef0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
35f00 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
35f10 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  = C_GetAttribute
35f20 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
35f30 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72  nList->C_SetAttr
35f40 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53  ibuteValue = C_S
35f50 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
35f60 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35f70 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  ->C_FindObjectsI
35f80 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  nit = C_FindObje
35f90 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ctsInit;..pFunct
35fa0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
35fb0 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f  bjects = C_FindO
35fc0 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69  bjects;..pFuncti
35fd0 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
35fe0 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46  jectsFinal = C_F
35ff0 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b  indObjectsFinal;
36000 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
36010 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d  >C_EncryptInit =
36020 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a   C_EncryptInit;.
36030 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
36040 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e  C_Encrypt = C_En
36050 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f  crypt;..pFunctio
36060 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
36070 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79  Update = C_Encry
36080 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
36090 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
360a0 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63  yptFinal = C_Enc
360b0 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ryptFinal;..pFun
360c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
360d0 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63  ryptInit = C_Dec
360e0 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ryptInit;..pFunc
360f0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
36100 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b  ypt = C_Decrypt;
36110 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
36120 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65  >C_DecryptUpdate
36130 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61   = C_DecryptUpda
36140 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunct