Hex Artifact Content

Artifact efec2691f8128c96aec16a1af3ad5c4813d3a19c:


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 44 57 4f 52 44 20 78 6d 69  dPci;..DWORD xmi
a490: 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b  t_len, recv_len;
a4a0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69  ..LONG scard_xmi
a4b0: 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63  t_ret, scard_rec
a4c0: 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78  onn_ret;..BYTE x
a4d0: 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72  mit_buf[1024], r
a4e0: 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09  ecv_buf[1024];..
a4f0: 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  int pcsc_connect
a500: 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65  _ret, pcsc_getre
a510: 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78  sp_ret;..int idx
a520: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
a530: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
a540: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
a550: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a560: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
a570: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
a580: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
a590: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
a5a0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ERIC);..}...if (
a5b0: 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72  respcode) {...*r
a5c0: 65 73 70 63 6f 64 65 20 3d 20 30 78 66 66 66 66  espcode = 0xffff
a5d0: 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e  ;..}...pcsc_conn
a5e0: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
a5f0: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
a600: 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  ot);..if (pcsc_c
a610: 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
a620: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
a630: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a640: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
a650: 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
a660: 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  rd, returning in
a670: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
a680: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a690: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
a6a0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
a6b0: 77 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74  which protocol t
a6c0: 6f 20 73 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a  o send using */.
a6d0: 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70  .switch (slot->p
a6e0: 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73  rotocol) {...cas
a6f0: 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  e SCARD_PROTOCOL
a700: 5f 54 30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  _T0:....CACKEY_D
a710: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
a720: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61  tocol to send da
a730: 74 61 67 72 61 6d 20 69 73 20 54 3d 30 22 29 3b  tagram is T=0");
a740: 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20  .....pioSendPci 
a750: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a  = SCARD_PCI_T0;.
a760: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
a770: 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  e SCARD_PROTOCOL
a780: 5f 54 31 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  _T1:....CACKEY_D
a790: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
a7a0: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61  tocol to send da
a7b0: 74 61 67 72 61 6d 20 69 73 20 54 3d 31 22 29 3b  tagram is T=1");
a7c0: 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20  .....pioSendPci 
a7d0: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a  = SCARD_PCI_T1;.
a7e0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
a7f0: 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
a800: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
a810: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66  valid protocol f
a820: 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22  ound, aborting."
a830: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
a840: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
a850: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72  RIC);..}.../* Tr
a860: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f  ansmit */..xmit_
a870: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62  len = 0;..xmit_b
a880: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a890: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75   class;..xmit_bu
a8a0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a8b0: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d  instruction;..xm
a8c0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a8d0: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62  +] = p1;..xmit_b
a8e0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a8f0: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20   p2;..if (data) 
a900: 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20 32 35 35  {...if (lc > 255
a910: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
a920: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54  BUG_PRINTF("CAUT
a930: 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c  ION!  Using an L
a940: 63 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32  c greater than 2
a950: 35 35 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20  55 is untested. 
a960: 20 4c 63 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a   Lc = %u", lc);.
a970: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a980: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b  t_len++] = 0x82;
a990: 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44   /* XXX UNTESTED
a9a0: 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   */....xmit_buf[
a9b0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c  xmit_len++] = (l
a9c0: 63 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  c & 0xff00) >> 8
a9d0: 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ;....xmit_buf[xm
a9e0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26  it_len++] = lc &
a9f0: 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20   0xff;...} else 
aa00: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
aa10: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a  it_len++] = lc;.
aa20: 09 09 7d 0a 09 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
aa30: 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64   0; idx < lc; id
aa40: 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62  x++) {....xmit_b
aa50: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
aa60: 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a   data[idx];...}.
aa70: 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30  .}...if (le != 0
aa80: 78 30 30 29 20 7b 0a 09 09 69 66 20 28 6c 65 20  x00) {...if (le 
aa90: 3e 20 32 35 36 29 20 7b 0a 09 09 09 43 41 43 4b  > 256) {....CACK
aaa0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
aab0: 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67  "CAUTION!  Using
aac0: 20 61 6e 20 4c 65 20 67 72 65 61 74 65 72 20 74   an Le greater t
aad0: 68 61 6e 20 32 35 36 20 69 73 20 75 6e 74 65 73  han 256 is untes
aae0: 74 65 64 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20  ted.  Le = %u", 
aaf0: 6c 65 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75  le);.....xmit_bu
ab00: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
ab10: 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54  0x82; /* XXX UNT
ab20: 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74  ESTED */....xmit
ab30: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
ab40: 20 3d 20 28 6c 65 20 26 20 30 78 66 66 30 30 29   = (le & 0xff00)
ab50: 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62   >> 8;....xmit_b
ab60: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
ab70: 20 6c 65 20 26 20 30 78 66 66 3b 0a 09 09 7d 20   le & 0xff;...} 
ab80: 65 6c 73 65 20 69 66 20 28 6c 65 20 3d 3d 20 32  else if (le == 2
ab90: 35 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75  56) {....xmit_bu
aba0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
abb0: 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  0x00;...} else {
abc0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
abd0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09  t_len++] = le;..
abe0: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  .}..}.../* Begin
abf0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
ac00: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
ac10: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
ac20: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20  ion(slot);...if 
ac30: 28 63 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f  (class == GSCIS_
ac40: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26  CLASS_ISO7816 &&
ac50: 20 28 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d   (instruction ==
ac60: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
ac70: 49 46 59 20 7c 7c 20 69 6e 73 74 72 75 63 74 69  IFY || instructi
ac80: 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54  on == GSCIS_INST
ac90: 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52 45 4e  R_CHANGE_REFEREN
aca0: 43 45 29 20 26 26 20 70 31 20 3d 3d 20 30 78 30  CE) && p1 == 0x0
acb0: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
acc0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6e 64  BUG_PRINTF("Send
acd0: 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73  ing APDU: <<cens
ace0: 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73  ored>>");..} els
acf0: 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  e {...CACKEY_DEB
ad00: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e  UG_PRINTBUF("Sen
ad10: 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69  ding APDU:", xmi
ad20: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29  t_buf, xmit_len)
ad30: 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20  ;..}...recv_len 
ad40: 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75  = sizeof(recv_bu
ad50: 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f  f);..scard_xmit_
ad60: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
ad70: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
ad80: 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c  ard, pioSendPci,
ad90: 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f   xmit_buf, xmit_
ada0: 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f  len, NULL, recv_
adb0: 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b  buf, &recv_len);
adc0: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
add0: 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  t_ret == SCARD_E
ade0: 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 29  _NOT_TRANSACTED)
adf0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
ae00: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
ae10: 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f   to send APDU to
ae20: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
ae30: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29  smit() = %s/%lx)
ae40: 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69  , will ask calli
ae50: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72  ng function to r
ae60: 65 74 72 79 20 28 6e 6f 74 20 72 65 73 65 74 74  etry (not resett
ae70: 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43  ing card)...", C
ae80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
ae90: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
aea0: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
aeb0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
aec0: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
aed0: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
aee0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
aef0: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
af00: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
af10: 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  lot);....cackey_
af20: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
af30: 6c 6f 74 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f  lot, slot->proto
af40: 63 6f 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  col);....return(
af50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
af60: 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  TRY);..}...if (s
af70: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
af80: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56   SCARD_E_NO_SERV
af90: 49 43 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ICE) {...CACKEY_
afa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
afb0: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
afc0: 55 20 74 6f 20 63 61 72 64 2c 20 70 6f 73 73 69  U to card, possi
afd0: 62 6c 79 20 64 75 65 20 74 6f 20 50 43 2f 53 43  bly due to PC/SC
afe0: 20 68 61 6e 64 6c 65 20 62 65 69 6e 67 20 69 6e   handle being in
aff0: 76 61 6c 69 64 20 28 53 43 61 72 64 54 72 61 6e  valid (SCardTran
b000: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29  smit() = %s/%lx)
b010: 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69  , will ask calli
b020: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72  ng function to r
b030: 65 74 72 79 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  etry...", CACKEY
b040: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
b050: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
b060: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
b070: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
b080: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
b090: 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
b0a0: 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
b0b0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
b0c0: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09  PCSC_E_RETRY);..
b0d0: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  }...if (scard_xm
b0e0: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
b0f0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
b100: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b110: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
b120: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
b130: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
b140: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
b150: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
b160: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
b170: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
b180: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b190: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
b1a0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b1b0: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
b1c0: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
b1d0: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09  been reset");...
b1e0: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
b1f0: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
b200: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
b210: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
b220: 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
b230: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b240: 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
b250: 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
b260: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
b270: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
b280: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
b290: 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
b2a0: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
b2b0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29  ARD_PROTOCOL_T1)
b2c0: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
b2d0: 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
b2e0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
b2f0: 0a 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f  .....switch (slo
b300: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  t->protocol) {..
b310: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
b320: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09  ROTOCOL_T0:.....
b330: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
b340: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
b350: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
b360: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
b370: 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69  COL_T1:.......pi
b380: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
b390: 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09  _PCI_T1;........
b3a0: 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61  break;......defa
b3b0: 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  ult:.......CACKE
b3c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b3d0: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
b3e0: 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20   found, but too 
b3f0: 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68  late to do anyth
b400: 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77  ing about it now
b410: 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61   -- trying anywa
b420: 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  y.");........bre
b430: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
b440: 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
b450: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
b460: 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
b470: 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
b480: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
b490: 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
b4a0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
b4b0: 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f  epth--;......slo
b4c0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
b4d0: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
b4e0: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
b4f0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
b500: 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
b510: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b520: 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
b530: 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d  essful, retransm
b540: 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72  itting");......r
b550: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
b560: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09  (recv_buf);.....
b570: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
b580: 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73   SCardTransmit(s
b590: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
b5a0: 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74  pioSendPci, xmit
b5b0: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
b5c0: 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20  NULL, recv_buf, 
b5d0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
b5e0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
b5f0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
b600: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
b610: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b620: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
b630: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
b640: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
b650: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
b660: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
b670: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
b680: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
b690: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
b6a0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
b6b0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
b6c0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
b6d0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
b6e0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
b6f0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
b700: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  E_CARD);......sl
b710: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
b720: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
b730: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b740: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b750: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
b760: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
b770: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
b780: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b790: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
b7a0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b7b0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
b7c0: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
b7d0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
b7e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
b7f0: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
b800: 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63  ;......SCardDisc
b810: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
b820: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
b830: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73  AVE_CARD);.....s
b840: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
b850: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
b860: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b870: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b880: 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  */.....slot->tra
b890: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
b8a0: 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65   1;.....cackey_e
b8b0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b8c0: 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lot);......CACKE
b8d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b8e0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
b8f0: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75  lure");.....retu
b900: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b910: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
b920: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
b930: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b940: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
b950: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
b960: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
b970: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
b980: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
b990: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63  RD);....slot->pc
b9a0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
b9b0: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e  d = 0;...../* En
b9c0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b9d0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c  saction */....sl
b9e0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
b9f0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61  depth = 1;....ca
ba00: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
ba10: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
ba20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ba30: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
ba40: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
ba50: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
ba60: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
ba70: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  );...}..}...CACK
ba80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
ba90: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75  F("Returned Valu
baa0: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72  e:", recv_buf, r
bab0: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  ecv_len);...if (
bac0: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  recv_len < 2) {.
bad0: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73  ../* Minimal res
bae0: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20  ponse length is 
baf0: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69  2 bytes, returni
bb00: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ng in failure */
bb10: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bb20: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
bb30: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
bb40: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
bb50: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75   (recv_len = %lu
bb60: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
bb70: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  ng) recv_len);..
bb80: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
bb90: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
bba0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
bbb0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
bbc0: 3b 0a 0a 09 09 2f 2a 20 53 75 70 70 6c 79 20 61  ;..../* Supply a
bbd0: 6e 20 69 6e 76 61 6c 69 64 20 72 65 73 70 6f 6e  n invalid respon
bbe0: 73 65 20 63 6f 64 65 20 2a 2f 0a 09 09 69 66 20  se code */...if 
bbf0: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 09  (respcode) {....
bc00: 2a 72 65 73 70 63 6f 64 65 20 3d 20 30 3b 0a 09  *respcode = 0;..
bc10: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
bc20: 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54  KEY_PCSC_E_NODAT
bc30: 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  A);..}.../* Dete
bc40: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64  rmine result cod
bc50: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d  e */..major_rc =
bc60: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
bc70: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f  en - 2];..minor_
bc80: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
bc90: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66  cv_len - 1];..if
bca0: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09   (respcode) {...
bcb0: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a  *respcode = (maj
bcc0: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69  or_rc << 8) | mi
bcd0: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20  nor_rc;..}.../* 
bce0: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62  Adjust message b
bcf0: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c  uffer */..recv_l
bd00: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64  en -= 2;.../* Ad
bd10: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72  d bytes to retur
bd20: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f  n value */..tmp_
bd30: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30  respdata_len = 0
bd40: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20  ;..if (respdata 
bd50: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  && respdata_len)
bd60: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74   {...tmp_respdat
bd70: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74  a_len = *respdat
bd80: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f  a_len;....bytes_
bd90: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64  to_copy = *respd
bda0: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  ata_len;....if (
bdb0: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73  recv_len < bytes
bdc0: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62  _to_copy) {....b
bdd0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72  ytes_to_copy = r
bde0: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ecv_len;...}....
bdf0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
be00: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75  NTF("Copying %lu
be10: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75   bytes to the bu
be20: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75  ffer (recv'd %lu
be30: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79   bytes, but only
be40: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20   %lu bytes left 
be50: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c  in our buffer)",
be60: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
be70: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
be80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
be90: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67  recv_len, (unsig
bea0: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64  ned long) *respd
beb0: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d  ata_len);....mem
bec0: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65  cpy(respdata, re
bed0: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f  cv_buf, bytes_to
bee0: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61  _copy);...respda
bef0: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63  ta += bytes_to_c
bf00: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74  opy;....*respdat
bf10: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f  a_len = bytes_to
bf20: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73  _copy;...tmp_res
bf30: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74  pdata_len -= byt
bf40: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65  es_to_copy;..} e
bf50: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76  lse {...if (recv
bf60: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
bf70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bf80: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77  NTF("Throwing aw
bf90: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f  ay %lu bytes, no
bfa0: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65  where to put the
bfb0: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  m!", (unsigned l
bfc0: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
bfd0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a  ..}..}...if (maj
bfe0: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b  or_rc == 0x61) {
bff0: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f  .../* We need to
c000: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45   READ */...CACKE
c010: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c020: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75  Buffer read requ
c030: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d  ired");....if (m
c040: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29  inor_rc == 0x00)
c050: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d   {....minor_rc =
c060: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
c070: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65  ;...}....pcsc_ge
c080: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
c090: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
c0a0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
c0b0: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
c0c0: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
c0d0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
c0e0: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
c0f0: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
c100: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
c110: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28  ta_len);....if (
c120: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
c130: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
c140: 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
c150: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c160: 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c  Buffer read fail
c170: 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69  ed!  Returning i
c180: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
c190: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
c1a0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
c1b0: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
c1c0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
c1d0: 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67  ;.....if (pcsc_g
c1e0: 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41  etresp_ret == CA
c1f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
c200: 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28  Y) {.....return(
c210: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
c220: 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  TRY);....}.....r
c230: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c240: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
c250: 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74  }....if (respdat
c260: 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73  a_len) {....*res
c270: 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70  pdata_len += tmp
c280: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09  _respdata_len;..
c290: 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  .}..../* End Sma
c2a0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
c2b0: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
c2c0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
c2d0: 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  lot);....CACKEY_
c2e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
c2f0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
c300: 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20  ss (buffer read 
c310: 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72  complete)");...r
c320: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c330: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a  C_S_OK);..}.../*
c340: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
c350: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
c360: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
c370: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
c380: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30  f (major_rc == 0
c390: 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63  x90) {.../* Succ
c3a0: 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ess */...CACKEY_
c3b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
c3c0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
c3d0: 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30  ss (major_rc = 0
c3e0: 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  x90)");....retur
c3f0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
c400: 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  OK);..}....CACKE
c410: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c420: 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e  APDU Returned an
c430: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e   error, returnin
c440: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
c450: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
c460: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
c470: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .}..static unsig
c480: 6e 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79  ned char *cackey
c490: 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
c4a0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
c4b0: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a  buffer, size_t *
c4c0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e  buffer_len_p, un
c4d0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c  signed char tag,
c4e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c4f0: 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  outbuffer, size_
c500: 74 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  t *outbuffer_len
c510: 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  _p) {..unsigned 
c520: 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a  char *buffer_p;.
c530: 09 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65  .size_t outbuffe
c540: 72 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65  r_len, buffer_le
c550: 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b  n;..size_t size;
c560: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
c570: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c580: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
c590: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  f (buffer_len_p 
c5a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c5b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c5c0: 28 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69  ("buffer_len_p i
c5d0: 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69  s NULL.  Returni
c5e0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c5f0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c600: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
c610: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e  uffer_len_p == N
c620: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c630: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75  DEBUG_PRINTF("ou
c640: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73  tbuffer_len_p is
c650: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e   NULL.  Returnin
c660: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b  g in failure.");
c670: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
c680: 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65  ;..}...buffer_le
c690: 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c  n = *outbuffer_l
c6a0: 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72  en_p;..outbuffer
c6b0: 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65  _len = *outbuffe
c6c0: 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 66 20 28 62  r_len_p;...if (b
c6d0: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
c6e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c6f0: 50 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c  PRINTF("buffer_l
c700: 65 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  en is less than 
c710: 32 2c 20 73 6f 20 77 65 20 63 61 6e 27 74 20 72  2, so we can't r
c720: 65 61 64 20 61 6e 79 20 74 61 67 2e 20 20 52 65  ead any tag.  Re
c730: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c740: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
c750: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
c760: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c770: 09 69 66 20 28 62 75 66 66 65 72 5f 70 5b 30 5d  .if (buffer_p[0]
c780: 20 21 3d 20 74 61 67 29 20 7b 0a 09 09 43 41 43   != tag) {...CAC
c790: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c7a0: 28 22 54 61 67 20 66 6f 75 6e 64 20 77 61 73 20  ("Tag found was 
c7b0: 6e 6f 74 20 74 61 67 20 65 78 70 65 63 74 65 64  not tag expected
c7c0: 2e 20 20 54 61 67 20 3d 20 25 30 32 78 2c 20 45  .  Tag = %02x, E
c7d0: 78 70 65 63 74 65 64 20 3d 20 25 30 32 78 2e 20  xpected = %02x. 
c7e0: 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   Returning in fa
c7f0: 69 6c 75 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e  ilure.", (unsign
c800: 65 64 20 69 6e 74 29 20 62 75 66 66 65 72 5f 70  ed int) buffer_p
c810: 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65  [0], tag);....re
c820: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
c830: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75  .buffer_p++;..bu
c840: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66  ffer_len--;...if
c850: 20 28 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26   ((buffer_p[0] &
c860: 20 30 78 38 30 29 20 3d 3d 20 30 78 38 30 29 20   0x80) == 0x80) 
c870: 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09  {...size = 0;...
c880: 69 64 78 20 3d 20 28 62 75 66 66 65 72 5f 70 5b  idx = (buffer_p[
c890: 30 5d 20 26 20 30 78 37 66 29 3b 0a 0a 09 09 69  0] & 0x7f);....i
c8a0: 66 20 28 69 64 78 20 3e 20 62 75 66 66 65 72 5f  f (idx > buffer_
c8b0: 6c 65 6e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  len) {....CACKEY
c8c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
c8d0: 61 6c 66 6f 72 6d 65 64 20 42 45 52 20 76 61 6c  alformed BER val
c8e0: 75 65 20 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68  ue -- not enough
c8f0: 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65   bytes available
c900: 20 74 6f 20 72 65 61 64 20 6c 65 6e 67 74 68 20   to read length 
c910: 28 69 64 78 20 3d 20 25 69 2c 20 62 75 66 66 65  (idx = %i, buffe
c920: 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69  r_len = %lu)", i
c930: 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
c940: 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b  ng) buffer_len);
c950: 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
c960: 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b  );...}....for (;
c970: 20 69 64 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29   idx > 0; idx--)
c980: 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 70 2b 2b   {....buffer_p++
c990: 3b 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d  ;....buffer_len-
c9a0: 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20  -;.....size <<= 
c9b0: 38 3b 0a 09 09 09 73 69 7a 65 20 7c 3d 20 62 75  8;....size |= bu
c9c0: 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09  ffer_p[0];...}..
c9d0: 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20  } else {...size 
c9e0: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09  = buffer_p[0];..
c9f0: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a  }...buffer_p++;.
ca00: 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a  .buffer_len--;..
ca10: 09 69 66 20 28 73 69 7a 65 20 3e 20 6f 75 74 62  .if (size > outb
ca20: 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43  uffer_len) {...C
ca30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ca40: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
ca50: 70 79 20 76 61 6c 75 65 20 62 75 66 66 65 72 20  py value buffer 
ca60: 74 6f 20 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f  to outbuffer, no
ca70: 74 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20  t enough room.  
ca80: 56 61 6c 75 65 20 62 75 66 66 65 72 20 6c 65 6e  Value buffer len
ca90: 67 74 68 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62  gth = %lu, out b
caa0: 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25  uffer length = %
cab0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
cac0: 6f 6e 67 29 20 73 69 7a 65 2c 20 28 75 6e 73 69  ong) size, (unsi
cad0: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
cae0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
caf0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
cb00: 09 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f  .*outbuffer_len_
cb10: 70 20 3d 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f  p = size;..if (o
cb20: 75 74 62 75 66 66 65 72 29 20 7b 0a 09 09 6d 65  utbuffer) {...me
cb30: 6d 63 70 79 28 6f 75 74 62 75 66 66 65 72 2c 20  mcpy(outbuffer, 
cb40: 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b  buffer_p, size);
cb50: 0a 09 09 62 75 66 66 65 72 5f 70 20 2b 3d 20 73  ...buffer_p += s
cb60: 69 7a 65 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65  ize;...buffer_le
cb70: 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62  n -= size;....*b
cb80: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75  uffer_len_p = bu
cb90: 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43  ffer_len;....CAC
cba0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
cbb0: 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75  UF("BER-TLV resu
cbc0: 6c 74 73 3a 22 2c 20 6f 75 74 62 75 66 66 65 72  lts:", outbuffer
cbd0: 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65  , size);..} else
cbe0: 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66   {...memmove(buf
cbf0: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
cc00: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
cc10: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 09 43 41   = buffer;....CA
cc20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cc30: 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73  BUF("BER-TLV res
cc40: 75 6c 74 73 3a 22 2c 20 62 75 66 66 65 72 2c 20  ults:", buffer, 
cc50: 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  size);..}...CACK
cc60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
cc70: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
cc80: 63 63 65 73 73 2e 20 20 53 69 7a 65 20 6f 66 20  ccess.  Size of 
cc90: 63 6f 6e 74 65 6e 74 73 20 66 6f 72 20 74 61 67  contents for tag
cca0: 20 25 30 32 78 20 69 73 20 25 6c 75 22 2c 20 28   %02x is %lu", (
ccb0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
ccc0: 67 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  g, (unsigned lon
ccd0: 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75  g) size);...retu
cce0: 72 6e 28 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a  rn(buffer_p);.}.
ccf0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
cd00: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63   *     ssize_t c
cd10: 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73  ackey_get_data(s
cd20: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
cd30: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
cd40: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
cd50: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
cd60: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
cd70: 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20   oid[3]);. *. * 
cd80: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
cd90: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
cda0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
cdb0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
cdc0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
cdd0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
cde0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a   char *buffer. *
cdf0: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42           [OUT] B
ce00: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20  uffer. *. *     
ce10: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
ce20: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
ce30: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
ce40: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
ce50: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
ce60: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20  ed char oid[3]. 
ce70: 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74 65  *         3-byte
ce80: 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a   OID to read. *.
ce90: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
cea0: 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  UE. *     This f
ceb0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
cec0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
ced0: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
cee0: 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  d, or -1 on erro
cef0: 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  r.. *. * NOTES. 
cf00: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
cf10: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
cf20: 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
cf30: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
cf40: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
cf50: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
cf60: 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  , size_t buffer_
cf70: 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  len, unsigned ch
cf80: 61 72 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e  ar oid[3]) {..un
cf90: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
cfa0: 5d 20 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c  ] = {0x5C, 0x03,
cfb0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
cfc0: 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  0};..unsigned ch
cfd0: 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73  ar *buffer_p;..s
cfe0: 69 7a 65 5f 74 20 69 6e 69 74 5f 62 75 66 66 65  ize_t init_buffe
cff0: 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69  r_len, size;..ui
d000: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
d010: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d020: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d030: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d040: 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 5f  ;...init_buffer_
d050: 6c 65 6e 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e  len = buffer_len
d060: 3b 0a 0a 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64  ;...cmd[2] = oid
d070: 5b 30 5d 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f  [0];..cmd[3] = o
d080: 69 64 5b 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d  id[1];..cmd[4] =
d090: 20 6f 69 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35   oid[2];.../* 25
d0a0: 36 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  6 to indicate th
d0b0: 65 20 6c 61 72 67 65 73 74 20 6d 65 73 73 61 67  e largest messag
d0c0: 65 20 73 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c  e size -- not cl
d0d0: 65 61 72 20 69 66 20 74 68 69 73 20 77 69 6c 6c  ear if this will
d0e0: 20 77 6f 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d   work with all m
d0f0: 65 73 73 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64  essages */..send
d100: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
d110: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
d120: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
d130: 36 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  6, NISTSP800_73_
d140: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
d150: 2c 20 30 78 33 46 2c 20 30 78 46 46 2c 20 73 69  , 0x3F, 0xFF, si
d160: 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20  zeof(cmd), cmd, 
d170: 32 35 36 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  256, &respcode, 
d180: 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f  buffer, &buffer_
d190: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  len);...if (send
d1a0: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
d1b0: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
d1c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d1d0: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
d1e0: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
d1f0: 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22  ing read buffer"
d200: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63  );....return(cac
d210: 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f  key_get_data(slo
d220: 74 2c 20 62 75 66 66 65 72 2c 20 69 6e 69 74 5f  t, buffer, init_
d230: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 6f 69 64 29  buffer_len, oid)
d240: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
d250: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
d260: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
d270: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d280: 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  F("cackey_send_a
d290: 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65  pdu() failed, re
d2a0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
d2b0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
d2c0: 2d 31 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  -1);..}..#ifdef 
d2d0: 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
d2e0: 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
d2f0: 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 62  SSIZE_MAX..if (b
d300: 75 66 66 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53  uffer_len > _POS
d310: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
d320: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d330: 52 49 4e 54 46 28 22 52 65 61 64 20 62 79 74 65  RINTF("Read byte
d340: 73 20 28 62 75 66 66 65 72 5f 6c 65 6e 29 20 65  s (buffer_len) e
d350: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
d360: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
d370: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
d380: 20 3d 20 25 6c 69 2c 20 62 75 66 66 65 72 5f 6c   = %li, buffer_l
d390: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  en = %lu)", (lon
d3a0: 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
d3b0: 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
d3c0: 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29  ong) buffer_len)
d3d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
d3e0: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
d3f0: 64 69 66 0a 0a 09 69 66 20 28 62 75 66 66 65 72  dif...if (buffer
d400: 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41  _len < 2) {...CA
d410: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d420: 46 28 22 41 50 44 55 20 47 45 54 20 44 41 54 41  F("APDU GET DATA
d430: 20 72 65 74 75 72 6e 65 64 20 25 6c 75 20 62 79   returned %lu by
d440: 74 65 73 2c 20 77 68 69 63 68 20 69 73 20 74 6f  tes, which is to
d450: 6f 20 73 68 6f 72 74 20 66 6f 72 20 61 20 42 45  o short for a BE
d460: 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73 65 22 2c  R-TLV response",
d470: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d480: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
d490: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
d4a0: 0a 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f  ..size = buffer_
d4b0: 6c 65 6e 3b 0a 09 62 75 66 66 65 72 5f 70 20 3d  len;..buffer_p =
d4c0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72   cackey_read_ber
d4d0: 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72 2c 20  tlv_tag(buffer, 
d4e0: 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30 78 35  &buffer_len, 0x5
d4f0: 33 2c 20 4e 55 4c 4c 2c 20 26 73 69 7a 65 29 3b  3, NULL, &size);
d500: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 70 20  ...if (buffer_p 
d510: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
d520: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d530: 28 22 54 61 67 20 64 65 63 6f 64 69 6e 67 20 66  ("Tag decoding f
d540: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
d550: 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09   in error.");...
d560: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
d570: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d580: 52 49 4e 54 42 55 46 28 22 47 45 54 20 44 41 54  RINTBUF("GET DAT
d590: 41 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65  A result", buffe
d5a0: 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b  r, size);...CACK
d5b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d5c0: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
d5d0: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
d5e0: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
d5f0: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
d600: 09 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d  .return(size);.}
d610: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
d620: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
d630: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
d640: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
d650: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
d660: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
d670: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
d680: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d690: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
d6a0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a  nitial_offset);.
d6b0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
d6c0: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
d6d0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
d6e0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
d6f0: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
d700: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
d710: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
d720: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
d730: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
d740: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75  *     size_t cou
d750: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  nt. *         Nu
d760: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
d770: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
d780: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
d790: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a  ned char t_or_v.
d7a0: 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63   *         Selec
d7b0: 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28  t the T-buffer (
d7c0: 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20  01) or V-buffer 
d7d0: 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f  (02) to read fro
d7e0: 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73  m.  . *. *     s
d7f0: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
d800: 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20  fset. *         
d810: 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73  Specify the offs
d820: 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  et to begin the 
d830: 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a  read from. *. *.
d840: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
d850: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
d860: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
d870: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
d880: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
d890: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
d8a0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
d8b0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
d8c0: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
d8d0: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
d8e0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d8f0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
d900: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
d910: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
d920: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
d930: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
d940: 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09  tial_offset) {..
d950: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69  unsigned char *i
d960: 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a  nit_buffer;..siz
d970: 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a  e_t init_count;.
d980: 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69  .size_t init_ini
d990: 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73  tial_offset;...s
d9a0: 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30  ize_t offset = 0
d9b0: 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61  , max_offset, ma
d9c0: 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  x_count;..unsign
d9d0: 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a  ed char cmd[2];.
d9e0: 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
d9f0: 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  de;..int send_re
da00: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
da10: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
da20: 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66  .");...init_buff
da30: 65 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e  er = buffer;..in
da40: 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74  it_count = count
da50: 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f  ;..init_initial_
da60: 6f 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c  offset = initial
da70: 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f  _offset;...max_o
da80: 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  ffset = count;..
da90: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b  max_count = CACK
daa0: 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69  EY_APDU_MTU;...i
dab0: 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26  f (t_or_v != 1 &
dac0: 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b  & t_or_v != 2) {
dad0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dae0: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
daf0: 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72  T or V parameter
db00: 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75   specified, retu
db10: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
db20: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
db30: 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d  );..}...cmd[0] =
db40: 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65   t_or_v;...while
db50: 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66   (1) {...if (off
db60: 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65  set >= max_offse
db70: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
db80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
db90: 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72  fer too small, r
dba0: 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65  eturning what we
dbb0: 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62   got...");.....b
dbc0: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75  reak;...}....cou
dbd0: 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20  nt = max_offset 
dbe0: 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28  - offset;...if (
dbf0: 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e  count > max_coun
dc00: 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20  t) {....count = 
dc10: 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a  max_count;...}..
dc20: 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74  ..cmd[1] = count
dc30: 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  ;....send_ret = 
dc40: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
dc50: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
dc60: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
dc70: 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  RM, GSCIS_INSTR_
dc80: 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69  READ_BUFFER, ((i
dc90: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20  nitial_offset + 
dca0: 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20  offset) >> 8) & 
dcb0: 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f  0xff, (initial_o
dcc0: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20  ffset + offset) 
dcd0: 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63  & 0xff, sizeof(c
dce0: 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20  md), cmd, 0x00, 
dcf0: 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65  &respcode, buffe
dd00: 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75  r + offset, &cou
dd10: 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64  nt);....if (send
dd20: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
dd30: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
dd40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dd50: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
dd60: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72  ing failed, retr
dd70: 79 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72  ying read buffer
dd80: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
dd90: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
dda0: 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66  r(slot, init_buf
ddb0: 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c  fer, init_count,
ddc0: 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e   t_or_v, init_in
ddd0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a  itial_offset));.
dde0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
ddf0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
de00: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66  SC_S_OK) {....if
de10: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
de20: 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28  6A86) {.....if (
de30: 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20  max_count == 1) 
de40: 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  {......break;...
de50: 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75  ..}......max_cou
de60: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f  nt = max_count /
de70: 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75   2;......continu
de80: 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  e;....}.....CACK
de90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
dea0: 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64  "cackey_send_apd
deb0: 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  u() failed, retu
dec0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
ded0: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  ");.....return(-
dee0: 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65  1);...}....offse
def0: 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69  t += count;....i
df00: 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63  f (count < max_c
df10: 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
df20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
df30: 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f  Short read -- co
df40: 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d  unt = %i, cmd[1]
df50: 20 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f   = %i", (int) co
df60: 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31  unt, (int) cmd[1
df70: 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ]);.....break;..
df80: 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
df90: 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
dfa0: 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
dfb0: 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66  IZE_MAX..if (off
dfc0: 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  set > _POSIX_SSI
dfd0: 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
dfe0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
dff0: 22 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20  "Offset exceeds 
e000: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
e010: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e020: 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
e030: 20 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c   offset = %lu)",
e040: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
e050: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
e060: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
e070: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
e080: 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
e090: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
e0a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
e0b0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
e0c0: 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73  , read %lu bytes
e0d0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
e0e0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65  g) offset);...re
e0f0: 74 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a  turn(offset);.}.
e100: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
e110: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
e120: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
e130: 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61  applet(struct ca
e140: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
e150: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e160: 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f  aid, size_t aid_
e170: 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  len);. *. * ARGU
e180: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
e190: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e1a0: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
e1b0: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
e1c0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
e1d0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
e1e0: 72 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20  r *aid. *       
e1f0: 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e    Buffer contain
e200: 69 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f  ing Applet ID to
e210: 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20   select. *. *   
e220: 20 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e    size_t aid_len
e230: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
e240: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
e250: 68 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74  he "aid" (Applet
e260: 20 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20   ID) parameter. 
e270: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
e280: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
e290: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
e2a0: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
e2b0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
e2c0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
e2d0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
e2e0: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
e2f0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
e300: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
e310: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
e320: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
e330: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
e340: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
e350: 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74   aid_len) {..int
e360: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
e370: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e380: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
e390: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e3a0: 54 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20  TBUF("Selecting 
e3b0: 61 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61  applet:", aid, a
e3c0: 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f  id_len);...send_
e3d0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
e3e0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
e3f0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
e400: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
e410: 4c 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41  LECT, GSCIS_PARA
e420: 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c  M_SELECT_APPLET,
e430: 20 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20   0x00, aid_len, 
e440: 61 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  aid, 0x00, NULL,
e450: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
e460: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
e470: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
e480: 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TRY) {...CACKEY_
e490: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
e4a0: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
e4b0: 64 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65  d, retrying sele
e4c0: 63 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09  ct applet");....
e4d0: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65  return(cackey_se
e4e0: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
e4f0: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29  , aid, aid_len))
e500: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f  ;..}...if (send_
e510: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
e520: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
e530: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e540: 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  ("Failed to open
e550: 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69   applet, returni
e560: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
e570: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
e580: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
e590: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
e5a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
e5b0: 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74  cessfully select
e5c0: 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74  ed file");...ret
e5d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
e5e0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
e5f0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
e600: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74  cackey_pcsc_id_t
e610: 79 70 65 20 63 61 63 6b 65 79 5f 64 65 74 65 63  ype cackey_detec
e620: 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f  t_and_select_roo
e630: 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20  t_applet(struct 
e640: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
e650: 74 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  t, cackey_pcsc_i
e660: 64 5f 74 79 70 65 20 74 79 70 65 5f 68 69 6e 74  d_type type_hint
e670: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
e680: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
e690: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
e6a0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
e6b0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
e6c0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
e6d0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f   cackey_pcsc_id_
e6e0: 74 79 70 65 20 74 79 70 65 5f 68 69 6e 74 0a 20  type type_hint. 
e6f0: 2a 20 20 20 20 20 20 20 20 20 41 20 68 69 6e 74  *         A hint
e700: 20 61 73 20 74 6f 20 77 68 69 63 68 20 74 79 70   as to which typ
e710: 65 20 6f 66 20 63 61 72 64 20 6d 69 67 68 74 20  e of card might 
e720: 62 65 20 69 6e 20 74 68 69 73 20 73 6c 6f 74 20  be in this slot 
e730: 28 43 41 43 20 6f 72 20 50 49 56 29 0a 20 2a 0a  (CAC or PIV). *.
e740: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
e750: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 49 44   *     CACKEY_ID
e760: 5f 54 59 50 45 5f 50 49 56 20 20 20 20 20 20 20  _TYPE_PIV       
e770: 49 66 20 74 68 65 20 63 61 72 64 20 63 6f 6e 6e  If the card conn
e780: 65 63 74 65 64 20 69 73 20 61 20 50 49 56 0a 20  ected is a PIV. 
e790: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f  *     CACKEY_ID_
e7a0: 54 59 50 45 5f 43 41 43 20 20 20 20 20 20 20 49  TYPE_CAC       I
e7b0: 66 20 74 68 65 20 63 61 72 64 20 63 6f 6e 6e 65  f the card conne
e7c0: 63 74 65 64 20 69 73 20 61 20 43 41 43 20 77 69  cted is a CAC wi
e7d0: 74 68 20 74 68 65 20 43 43 43 0a 20 2a 20 20 20  th the CCC. *   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 6c 65             apple
e800: 74 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  t. *     CACKEY_
e810: 49 44 5f 54 59 50 45 5f 45 52 52 4f 52 20 20 20  ID_TYPE_ERROR   
e820: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
e830: 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
e840: 77 68 61 74 20 74 79 70 65 20 6f 66 20 63 61 72  what type of car
e850: 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  d. *            
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 0a 20    is connected. 
e880: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
e890: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
e8a0: 72 65 73 65 6c 65 63 74 73 20 74 68 65 20 22 72  reselects the "r
e8b0: 6f 6f 74 22 20 61 70 70 6c 65 74 2c 20 61 66 74  oot" applet, aft
e8c0: 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
e8d0: 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 20 20 20   is called. *   
e8e0: 20 20 74 68 65 20 75 73 65 72 20 6d 61 79 20 62    the user may b
e8f0: 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 6c 6f  e required to lo
e900: 67 69 6e 20 61 67 61 69 6e 0a 20 2a 0a 20 2a 2f  gin again. *. */
e910: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 70  .static cackey_p
e920: 63 73 63 5f 69 64 5f 74 79 70 65 20 63 61 63 6b  csc_id_type cack
e930: 65 79 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65  ey_detect_and_se
e940: 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74  lect_root_applet
e950: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
e960: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 63 61 63 6b 65  lot *slot, cacke
e970: 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 74  y_pcsc_id_type t
e980: 79 70 65 5f 68 69 6e 74 29 20 7b 0a 09 75 6e 73  ype_hint) {..uns
e990: 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61  igned char ccc_a
e9a0: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
e9b0: 44 5f 43 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b  D_CCC}, piv_aid[
e9c0: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
e9d0: 33 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 63  3_3_PIV_AID};..c
e9e0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
e9f0: 70 65 20 74 72 79 5f 74 79 70 65 73 5b 32 5d 2c  pe try_types[2],
ea00: 20 74 72 79 5f 74 79 70 65 3b 0a 09 69 6e 74 20   try_type;..int 
ea10: 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69  send_ret;..int i
ea20: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
ea30: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 6c  UG_PRINTF("Resel
ea40: 65 63 74 69 6e 67 20 74 68 65 20 72 6f 6f 74 20  ecting the root 
ea50: 61 70 70 6c 65 74 22 29 3b 0a 0a 09 69 66 20 28  applet");...if (
ea60: 74 79 70 65 5f 68 69 6e 74 20 3d 3d 20 43 41 43  type_hint == CAC
ea70: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e  KEY_ID_TYPE_UNKN
ea80: 4f 57 4e 29 20 7b 0a 09 09 74 79 70 65 5f 68 69  OWN) {...type_hi
ea90: 6e 74 20 3d 20 73 6c 6f 74 2d 3e 69 64 5f 74 79  nt = slot->id_ty
eaa0: 70 65 5f 68 69 6e 74 3b 0a 09 7d 0a 0a 09 73 6c  pe_hint;..}...sl
eab0: 6f 74 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e 74  ot->id_type_hint
eac0: 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50   = CACKEY_ID_TYP
ead0: 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a 0a 09 73 77 69  E_UNKNOWN;...swi
eae0: 74 63 68 20 28 74 79 70 65 5f 68 69 6e 74 29 20  tch (type_hint) 
eaf0: 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  {...case CACKEY_
eb00: 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
eb10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
eb20: 4e 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20 72  NTF("Trying to r
eb30: 65 73 65 6c 65 63 74 20 74 68 65 20 50 49 56 20  eselect the PIV 
eb40: 72 6f 6f 74 20 61 70 70 6c 65 74 20 66 69 72 73  root applet firs
eb50: 74 22 29 3b 0a 0a 09 09 09 74 72 79 5f 74 79 70  t");.....try_typ
eb60: 65 73 5b 30 5d 20 3d 20 43 41 43 4b 45 59 5f 49  es[0] = CACKEY_I
eb70: 44 5f 54 59 50 45 5f 50 49 56 3b 0a 09 09 09 74  D_TYPE_PIV;....t
eb80: 72 79 5f 74 79 70 65 73 5b 31 5d 20 3d 20 43 41  ry_types[1] = CA
eb90: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
eba0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  ;.....break;...d
ebb0: 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
ebc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ebd0: 54 72 79 69 6e 67 20 74 6f 20 72 65 73 65 6c 65  Trying to resele
ebe0: 63 74 20 74 68 65 20 43 41 43 20 43 43 43 20 61  ct the CAC CCC a
ebf0: 70 70 6c 65 74 20 66 69 72 73 74 22 29 3b 0a 0a  pplet first");..
ec00: 09 09 09 74 72 79 5f 74 79 70 65 73 5b 30 5d 20  ...try_types[0] 
ec10: 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
ec20: 5f 43 41 43 3b 0a 09 09 09 74 72 79 5f 74 79 70  _CAC;....try_typ
ec30: 65 73 5b 31 5d 20 3d 20 43 41 43 4b 45 59 5f 49  es[1] = CACKEY_I
ec40: 44 5f 54 59 50 45 5f 50 49 56 3b 0a 0a 09 09 09  D_TYPE_PIV;.....
ec50: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 66 6f 72 20  break;..}...for 
ec60: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
ec70: 28 73 69 7a 65 6f 66 28 74 72 79 5f 74 79 70 65  (sizeof(try_type
ec80: 73 29 20 2f 20 73 69 7a 65 6f 66 28 74 72 79 5f  s) / sizeof(try_
ec90: 74 79 70 65 73 5b 30 5d 29 29 3b 20 69 64 78 2b  types[0])); idx+
eca0: 2b 29 20 7b 0a 09 09 74 72 79 5f 74 79 70 65 20  +) {...try_type 
ecb0: 3d 20 74 72 79 5f 74 79 70 65 73 5b 69 64 78 5d  = try_types[idx]
ecc0: 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 74 72 79  ;....switch (try
ecd0: 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
ece0: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
ecf0: 43 41 43 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  CAC:.....CACKEY_
ed00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
ed10: 79 69 6e 67 20 74 6f 20 73 65 6c 65 63 74 20 74  ying to select t
ed20: 68 65 20 43 41 43 20 43 43 43 20 61 70 70 6c 65  he CAC CCC apple
ed30: 74 22 29 3b 0a 0a 09 09 09 09 73 65 6e 64 5f 72  t");......send_r
ed40: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
ed50: 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
ed60: 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  ccc_aid, sizeof(
ed70: 63 63 63 5f 61 69 64 29 29 3b 0a 0a 09 09 09 09  ccc_aid));......
ed80: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
ed90: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
eda0: 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  V:.....CACKEY_DE
edb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
edc0: 6e 67 20 74 6f 20 73 65 6c 65 63 74 20 74 68 65  ng to select the
edd0: 20 50 49 56 20 72 6f 6f 74 20 61 70 70 6c 65 74   PIV root applet
ede0: 22 29 3b 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ");......send_re
edf0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
ee00: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70  t_applet(slot, p
ee10: 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 70  iv_aid, sizeof(p
ee20: 69 76 5f 61 69 64 29 29 3b 0a 0a 09 09 09 09 62  iv_aid));......b
ee30: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
ee40: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
ee50: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
ee60: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ee70: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
ee80: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 74  fully selected t
ee90: 68 65 20 25 73 20 61 70 70 6c 65 74 20 2d 2d 20  he %s applet -- 
eea0: 73 65 74 74 69 6e 67 20 74 68 65 20 5c 22 4c 4f  setting the \"LO
eeb0: 47 49 4e 20 52 45 51 55 49 52 45 44 5c 22 20 66  GIN REQUIRED\" f
eec0: 6c 61 67 20 6f 6e 20 74 68 65 20 74 6f 6b 65 6e  lag on the token
eed0: 22 2c 0a 09 09 09 09 74 72 79 5f 74 79 70 65 20  ",.....try_type 
eee0: 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  == CACKEY_ID_TYP
eef0: 45 5f 43 41 43 20 3f 20 22 43 41 43 22 20 3a 20  E_CAC ? "CAC" : 
ef00: 22 50 49 56 22 0a 09 09 09 29 3b 0a 0a 09 09 09  "PIV"....);.....
ef10: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67  slot->token_flag
ef20: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
ef30: 51 55 49 52 45 44 3b 0a 0a 09 09 09 73 6c 6f 74  QUIRED;.....slot
ef40: 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e 74 20 3d  ->id_type_hint =
ef50: 20 74 72 79 5f 74 79 70 65 3b 0a 0a 09 09 09 72   try_type;.....r
ef60: 65 74 75 72 6e 28 74 72 79 5f 74 79 70 65 29 3b  eturn(try_type);
ef70: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
ef80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
ef90: 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 74 20  nable to select 
efa0: 61 6e 79 20 61 70 70 6c 65 74 2c 20 72 65 74 75  any applet, retu
efb0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
efc0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
efd0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52 4f  KEY_ID_TYPE_ERRO
efe0: 52 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  R);.}../*. * SYN
eff0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
f000: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
f010: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
f020: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
f030: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
f040: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
f050: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
f060: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
f070: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
f080: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
f090: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
f0a0: 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20   uint16_t ef. * 
f0b0: 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61          Elementa
f0c0: 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74  l File to select
f0d0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
f0e0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
f0f0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
f100: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
f110: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
f120: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
f130: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
f140: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
f150: 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65  selects an Eleme
f160: 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20  ntary File (EF) 
f170: 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e  under the curren
f180: 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20  tly selected. * 
f190: 20 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69      Dedicated Fi
f1a0: 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20  le (DF). *. *   
f1b0: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73    Typically this
f1c0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
f1d0: 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63   selecting the c
f1e0: 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75  orrect Applet (u
f1f0: 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b  sing. *     cack
f200: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
f210: 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20  ) for VM cards. 
f220: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
f230: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
f240: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
f250: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
f260: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
f270: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
f280: 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09  ar fid_buf[2];..
f290: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
f2a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f2b0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
f2c0: 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c  ../* Open the el
f2d0: 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f  ementary file */
f2e0: 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28  ..fid_buf[0] = (
f2f0: 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  ef >> 8) & 0xff;
f300: 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65  ..fid_buf[1] = e
f310: 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  f & 0xff;...CACK
f320: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f330: 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a  "Selecting file:
f340: 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e   %04lx", (unsign
f350: 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09  ed long) ef);...
f360: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
f370: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
f380: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
f390: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
f3a0: 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c  TR_SELECT, 0x02,
f3b0: 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69   0x0C, sizeof(fi
f3c0: 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c  d_buf), fid_buf,
f3d0: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
f3e0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
f3f0: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
f400: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
f410: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f420: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
f430: 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72  open file, retur
f440: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
f450: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
f460: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
f470: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
f480: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
f490: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65  uccessfully sele
f4a0: 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72  cted file");...r
f4b0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
f4c0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
f4d0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
f4e0: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72    void cackey_fr
f4f0: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
f500: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
f510: 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *root);. *. * AR
f520: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
f530: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
f540: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a  _entity *root. *
f550: 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66           Root of
f560: 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f   the TLV list to
f570: 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20   start freeing. 
f580: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
f590: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
f5a0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
f5b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
f5c0: 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e  rees the TLV lin
f5d0: 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72  ked listed retur
f5e0: 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20  ned from. *     
f5f0: 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76  "cackey_read_tlv
f600: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
f610: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
f620: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
f630: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72  ey_tlv_entity *r
f640: 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  oot) {..struct c
f650: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
f660: 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a   *curr, *next;..
f670: 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c  .if (root == NUL
f680: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
f690: 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20  }...for (curr = 
f6a0: 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72  root; curr; curr
f6b0: 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78   = next) {...nex
f6c0: 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b  t = curr->_next;
f6d0: 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72  ....switch (curr
f6e0: 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65  ->tag) {....case
f6f0: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
f700: 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53  ABLE:....case GS
f710: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
f720: 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72  ATE:.....if (cur
f730: 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09  r->value) {.....
f740: 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75  .free(curr->valu
f750: 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  e);.....}.....br
f760: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
f770: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a  IS_TAG_CARDURL:.
f780: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
f790: 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09  lue_cardurl) {..
f7a0: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
f7b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09  alue_cardurl);..
f7c0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
f7d0: 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72  ..}....free(curr
f7e0: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
f7f0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
f800: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
f810: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
f820: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
f830: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
f840: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
f850: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
f860: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
f870: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
f880: 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
f890: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
f8a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
f8b0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
f8c0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
f8d0: 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d  _entity, *root =
f8e0: 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e   NULL, *last = N
f8f0: 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ULL;..unsigned c
f900: 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c  har tlen_buf[2],
f910: 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c   tval_buf[1024],
f920: 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65   *tval;..unsigne
f930: 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b  d char vlen_buf[
f940: 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39  2], vval_buf[819
f950: 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69  2], *vval;..unsi
f960: 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75  gned char *tmpbu
f970: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
f980: 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 73 73  g tmpbuflen;..ss
f990: 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e  ize_t tlen, vlen
f9a0: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f  ;..ssize_t read_
f9b0: 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66  ret;..size_t off
f9c0: 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65  set_t = 0, offse
f9d0: 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e  t_v = 0;..unsign
f9e0: 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69  ed char tag;..si
f9f0: 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66  ze_t length;.#if
fa00: 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69  def HAVE_LIBZ..i
fa10: 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  nt uncompress_re
fa20: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  t;.#endif...CACK
fa30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fa40: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65  "Called.");...re
fa50: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
fa60: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
fa70: 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , tlen_buf, size
fa80: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c  of(tlen_buf), 1,
fa90: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
faa0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
fab0: 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(tlen_buf)) {
fac0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fad0: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
fae0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
faf0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
fb00: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
fb10: 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f  ...tlen = (tlen_
fb20: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74  buf[1] << 8) | t
fb30: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65  len_buf[0];...re
fb40: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
fb50: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
fb60: 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , vlen_buf, size
fb70: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c  of(vlen_buf), 2,
fb80: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
fb90: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
fba0: 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(vlen_buf)) {
fbb0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fbc0: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
fbd0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
fbe0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
fbf0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
fc00: 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f  ...vlen = (vlen_
fc10: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76  buf[1] << 8) | v
fc20: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41  len_buf[0];...CA
fc30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fc40: 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20  F("Tag Length = 
fc50: 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74  %lu, Value Lengt
fc60: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
fc70: 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20  ned long) tlen, 
fc80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
fc90: 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f  vlen);...offset_
fca0: 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f  t += 2;..offset_
fcb0: 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c  v += 2;...if (tl
fcc0: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c  en > sizeof(tval
fcd0: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
fce0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
fcf0: 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f  Tag length is to
fd00: 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69  o large, returni
fd10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
fd20: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
fd30: 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20  ;..}...if (vlen 
fd40: 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75  > sizeof(vval_bu
fd50: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
fd60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c  EBUG_PRINTF("Val
fd70: 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ue length is too
fd80: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
fd90: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
fda0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
fdb0: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
fdc0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
fdd0: 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62  fer(slot, tval_b
fde0: 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66  uf, tlen, 1, off
fdf0: 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61  set_t);..if (rea
fe00: 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b  d_ret != tlen) {
fe10: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fe20: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
fe30: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d  o read entire T-
fe40: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
fe50: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
fe60: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
fe70: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
fe80: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
fe90: 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62  fer(slot, vval_b
fea0: 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66  uf, vlen, 2, off
feb0: 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61  set_v);..if (rea
fec0: 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b  d_ret != vlen) {
fed0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fee0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
fef0: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d  o read entire V-
ff00: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
ff10: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ff20: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
ff30: 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61  ..}...tval = tva
ff40: 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76  l_buf;..vval = v
ff50: 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20  val_buf;..while 
ff60: 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65  (tlen > 0 && vle
ff70: 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d  n > 0) {...tag =
ff80: 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b   *tval;...tval++
ff90: 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69  ;...tlen--;....i
ffa0: 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66  f (*tval == 0xff
ffb0: 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  ) {....length = 
ffc0: 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c  (tval[2] << 8) |
ffd0: 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61   tval[1];....tva
ffe0: 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20  l += 3;....tlen 
fff0: 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  -= 3;...} else {
10000 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76  ....length = *tv
10010 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09  al;....tval++;..
10020 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09  ..tlen--;...}...
10030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10040 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25  INTF("Tag: %s (%
10050 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  02x)", CACKEY_DE
10060 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
10070 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67  STR(tag), (unsig
10080 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09  ned int) tag);..
10090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
100a0 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c  INTBUF("Value:",
100b0 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
100c0 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
100d0 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20   NULL;...switch 
100e0 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  (tag) {....case 
100f0 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
10100 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  L:.....curr_enti
10110 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
10120 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
10130 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
10140 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
10150 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
10160 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  f(*curr_entity->
10170 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b  value_cardurl));
10180 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ......memcpy(cur
10190 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
101a0 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76  cardurl->rid, vv
101b0 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72  al, 5);.....curr
101c0 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
101d0 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20  ardurl->apptype 
101e0 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63  = vval[5];.....c
101f0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
10200 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
10210 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c  tid = (vval[6] <
10220 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a  < 8) | vval[7];.
10230 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
10240 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10250 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d  appid = (vval[8]
10260 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d   << 8) | vval[9]
10270 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
10280 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
10290 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
102a0 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
102b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
102c0 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
102d0 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f  TABLE:.....curr_
102e0 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
102f0 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
10300 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75  ity));.....tmpbu
10310 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74  f = malloc(lengt
10320 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  h);......memcpy(
10330 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
10340 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72  ngth);......curr
10350 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
10360 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
10370 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65  ity->length = le
10380 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65  ngth;.....curr_e
10390 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74  ntity->value = t
103a0 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f  mpbuf;.....curr_
103b0 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
103c0 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
103d0 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
103e0 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
103f0 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
10400 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
10410 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
10420 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ..#ifdef HAVE_LI
10430 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  BZ.....tmpbuflen
10440 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09   = length * 2;..
10450 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
10460 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a  oc(tmpbuflen);..
10470 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72  ....uncompress_r
10480 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28  et = uncompress(
10490 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c  tmpbuf, &tmpbufl
104a0 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  en, vval, length
104b0 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  );.....if (uncom
104c0 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f  press_ret != Z_O
104d0 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  K) {......CACKEY
104e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
104f0 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72  ailed to decompr
10500 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28  ess, uncompress(
10510 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d  ) returned %i --
10520 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69   resorting to di
10530 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f  rect copy", unco
10540 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09  mpress_ret);....
10550 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c  ...tmpbuflen = l
10560 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63  ength;......memc
10570 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
10580 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a   length);.....}.
10590 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
105a0 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f  G_PRINTBUF("Deco
105b0 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74  mpressed to:", t
105c0 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
105d0 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43  );.#else.....CAC
105e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
105f0 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53  ("Missing ZLIB S
10600 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72  upport, this cer
10610 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65  tificate is like
10620 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b  ly useless...");
10630 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
10640 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65  = length;.....me
10650 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
10660 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64  l, length);.#end
10670 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  if......curr_ent
10680 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
10690 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
106a0 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66  >length = tmpbuf
106b0 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  len;.....curr_en
106c0 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
106d0 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
106e0 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
106f0 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
10700 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
10710 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63  AG_PKCS15:.....c
10720 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
10730 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
10740 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  _entity));......
10750 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
10760 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
10770 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62  _entity->value_b
10780 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09  yte = vval[0];..
10790 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
107a0 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
107b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
107c0 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b  .vval += length;
107d0 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74  ...vlen -= lengt
107e0 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65  h;....if (curr_e
107f0 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b  ntity != NULL) {
10800 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ....if (root == 
10810 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74  NULL) {.....root
10820 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
10830 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73  ...}.....if (las
10840 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t != NULL) {....
10850 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63  .last->_next = c
10860 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d  urr_entity;....}
10870 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72  .....last = curr
10880 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a  _entity;...}..}.
10890 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a  ..return(root);.
108a0 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
108b0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
108c0 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
108d0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
108e0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
108f0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
10900 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
10910 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
10920 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
10930 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
10940 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73  pcsc_identity *s
10950 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75  tart, size_t cou
10960 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61  nt, int free_sta
10970 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64  rt) {..size_t id
10980 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d  x;...if (start =
10990 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
109a0 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
109b0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75  x = 0; idx < cou
109c0 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
109d0 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  f (start[idx].ce
109e0 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09  rtificate) {....
109f0 66 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e  free(start[idx].
10a00 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09  certificate);...
10a10 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  }..}...if (free_
10a20 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28  start) {...free(
10a30 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74  start);..}...ret
10a40 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  urn;.}..static s
10a50 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
10a60 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  c_identity *cack
10a70 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 73 74  ey_copy_certs(st
10a80 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
10a90 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73 74 2c  _identity *dest,
10aa0 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
10ab0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
10ac0 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
10ad0 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
10ae0 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ;...if (start ==
10af0 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
10b00 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
10b10 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20   (dest == NULL) 
10b20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c 6c 6f  {...dest = mallo
10b30 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 29 20  c(sizeof(*dest) 
10b40 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66  * count);..}...f
10b50 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
10b60 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   < count; idx++)
10b70 20 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 69   {...dest[idx].i
10b80 64 5f 74 79 70 65 20 3d 20 73 74 61 72 74 5b 69  d_type = start[i
10b90 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a 09 09  dx].id_type;....
10ba0 73 77 69 74 63 68 20 28 64 65 73 74 5b 69 64 78  switch (dest[idx
10bb0 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09  ].id_type) {....
10bc0 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
10bd0 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d 65 6d  YPE_CAC:.....mem
10be0 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  cpy(dest[idx].ca
10bf0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
10c00 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63  tart[idx].card.c
10c10 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
10c20 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  f(dest[idx].card
10c30 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
10c40 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72  ...dest[idx].car
10c50 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73 74 61  d.cac.file = sta
10c60 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  rt[idx].card.cac
10c70 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72 65 61 6b  .file;.....break
10c80 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
10c90 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
10ca0 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  ..dest[idx].card
10cb0 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 73 74  .piv.key_id = st
10cc0 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69  art[idx].card.pi
10cd0 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09 6d 65  v.key_id;.....me
10ce0 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63  mcpy(dest[idx].c
10cf0 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73  ard.piv.label, s
10d00 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  tart[idx].card.p
10d10 69 76 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  iv.label, sizeof
10d20 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  (dest[idx].card.
10d30 70 69 76 2e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  piv.label));....
10d40 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
10d50 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
10d60 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72  ERT_ONLY:.....br
10d70 65 61 6b 3b 0a 09 09 7d 0a 09 09 64 65 73 74 5b  eak;...}...dest[
10d80 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
10d90 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69 64 78  _len = start[idx
10da0 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
10db0 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 6b  n;...dest[idx].k
10dc0 65 79 73 69 7a 65 20 3d 20 73 74 61 72 74 5b 69  eysize = start[i
10dd0 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09 09  dx].keysize;....
10de0 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
10df0 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 64  icate = malloc(d
10e00 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
10e10 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d  cate_len);...mem
10e20 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 65  cpy(dest[idx].ce
10e30 72 74 69 66 69 63 61 74 65 2c 20 73 74 61 72 74  rtificate, start
10e40 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
10e50 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  e, dest[idx].cer
10e60 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
10e70 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65 73 74 29  }...return(dest)
10e80 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
10e90 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
10ea0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
10eb0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
10ec0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
10ed0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
10ee0 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
10ef0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
10f00 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
10f10 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
10f20 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75  _read_certs(stru
10f30 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
10f40 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
10f50 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
10f60 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e  y *certs, unsign
10f70 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20  ed long *count) 
10f80 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  {..cackey_pcsc_i
10f90 64 5f 74 79 70 65 20 63 68 65 63 6b 5f 69 64 5f  d_type check_id_
10fa0 74 79 70 65 3b 0a 09 73 74 72 75 63 74 20 63 61  type;..struct ca
10fb0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
10fc0 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73 74  ty *curr_id;..st
10fd0 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
10fe0 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76 2c  entity *ccc_tlv,
10ff0 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70 70   *ccc_curr, *app
11000 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72 3b  _tlv, *app_curr;
11010 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
11020 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76 5f 6f 69  *piv_oid, piv_oi
11030 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d 20 7b 4e  d_pivauth[] = {N
11040 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49  ISTSP800_73_3_OI
11050 44 5f 50 49 56 41 55 54 48 7d 2c 20 70 69 76 5f  D_PIVAUTH}, piv_
11060 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 5b 5d 20  oid_signature[] 
11070 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  = {NISTSP800_73_
11080 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52 45 7d  3_OID_SIGNATURE}
11090 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74  , piv_oid_keymgt
110a0 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
110b0 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47 54 7d  73_3_OID_KEYMGT}
110c0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
110d0 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75   curr_aid[7];..u
110e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66  nsigned char buf
110f0 66 65 72 5b 38 31 39 32 5d 2c 20 2a 62 75 66 66  fer[8192], *buff
11100 65 72 5f 70 2c 20 2a 74 6d 70 62 75 66 3b 0a 09  er_p, *tmpbuf;..
11110 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
11120 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61 72 20  tidx = 0;..char 
11130 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63 61 63  *piv_label;..cac
11140 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74  key_ret transact
11150 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f  ion_ret;..ssize_
11160 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
11170 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
11180 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  tmpbuflen;..int 
11190 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b  certs_resizable;
111a0 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20  ..int send_ret, 
111b0 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69 6e 74  select_ret;..int
111c0 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20 3d 20   piv_key, piv = 
111d0 30 3b 0a 09 69 6e 74 20 63 61 63 68 65 64 5f 63  0;..int cached_c
111e0 65 72 74 73 5f 76 61 6c 69 64 3b 0a 09 69 6e 74  erts_valid;..int
111f0 20 69 64 78 3b 0a 09 63 61 63 6b 65 79 5f 70 63   idx;..cackey_pc
11200 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79  sc_id_type id_ty
11210 70 65 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  pe;.#ifdef HAVE_
11220 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70  LIBZ..int uncomp
11230 72 65 73 73 5f 72 65 74 3b 0a 09 7a 5f 73 74 72  ress_ret;..z_str
11240 65 61 6d 20 67 7a 69 70 5f 73 74 72 65 61 6d 3b  eam gzip_stream;
11250 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
11260 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
11270 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
11280 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  count == NULL) {
11290 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
112a0 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73  PRINTF("count is
112b0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67   NULL, returning
112c0 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
112d0 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
112e0 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21  .}...if (certs !
112f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
11300 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  *count == 0) {..
11310 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11320 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64  RINTF("Requested
11330 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a   we return 0 obj
11340 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63  ects, short-circ
11350 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uit");.....retur
11360 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
11370 0a 0a 09 63 61 63 68 65 64 5f 63 65 72 74 73 5f  ...cached_certs_
11380 76 61 6c 69 64 20 3d 20 30 3b 0a 09 69 66 20 28  valid = 0;..if (
11390 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65  !slot->slot_rese
113a0 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d  t) {...if (slot-
113b0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
113c0 0a 09 09 09 63 61 63 68 65 64 5f 63 65 72 74 73  ....cached_certs
113d0 5f 76 61 6c 69 64 20 3d 20 31 3b 0a 0a 09 09 09  _valid = 1;.....
113e0 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  if (slot->cached
113f0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20 3e 20 30  _certs_count > 0
11400 29 20 7b 0a 09 09 09 09 63 61 63 68 65 64 5f 63  ) {.....cached_c
11410 65 72 74 73 5f 76 61 6c 69 64 20 3d 20 31 3b 0a  erts_valid = 1;.
11420 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  ...}...}..}...if
11430 20 28 63 61 63 68 65 64 5f 63 65 72 74 73 5f 76   (cached_certs_v
11440 61 6c 69 64 29 20 7b 0a 09 09 69 66 20 28 63 65  alid) {...if (ce
11450 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
11460 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
11470 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
11480 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  * slot->cached_c
11490 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09  erts_count);....
114a0 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63  *count = slot->c
114b0 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
114c0 74 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  t;...} else {...
114d0 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c  .if (*count > sl
114e0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
114f0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 2a 63  _count) {.....*c
11500 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63  ount = slot->cac
11510 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
11520 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63  ....}...}....cac
11530 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 63  key_copy_certs(c
11540 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68  erts, slot->cach
11550 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74  ed_certs, *count
11560 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
11570 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
11580 6e 69 6e 67 20 63 61 63 68 65 64 20 63 65 72 74  ning cached cert
11590 69 66 69 63 61 74 65 73 20 66 6f 72 20 74 68 69  ificates for thi
115a0 73 20 73 6c 6f 74 20 28 63 61 72 64 20 68 61 73  s slot (card has
115b0 20 6e 6f 74 20 62 65 65 6e 20 72 65 73 65 74 20   not been reset 
115c0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 61  and there are ca
115d0 63 68 65 64 20 63 65 72 74 73 20 61 76 61 69 6c  ched certs avail
115e0 61 62 6c 65 29 22 29 3b 0a 0a 09 09 72 65 74 75  able)");....retu
115f0 72 6e 28 63 65 72 74 73 29 3b 0a 09 7d 0a 0a 09  rn(certs);..}...
11600 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  if (slot->cached
11610 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61 63 6b  _certs) {...cack
11620 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 6c  ey_free_certs(sl
11630 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
11640 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  , slot->cached_c
11650 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a  erts_count, 1);.
11660 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  ...slot->cached_
11670 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  certs = NULL;..}
11680 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
11690 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
116a0 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
116b0 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
116c0 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
116d0 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
116e0 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
116f0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
11700 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
11710 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
11720 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
11730 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
11740 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
11750 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
11760 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 63  .}...id_type = c
11770 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e 64  ackey_detect_and
11780 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70 70  _select_root_app
11790 6c 65 74 28 73 6c 6f 74 2c 20 43 41 43 4b 45 59  let(slot, CACKEY
117a0 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e  _ID_TYPE_UNKNOWN
117b0 29 3b 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f  );...switch (id_
117c0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
117d0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
117e0 43 3a 0a 09 09 09 70 69 76 20 3d 20 30 3b 0a 0a  C:....piv = 0;..
117f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
11800 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
11810 50 49 56 3a 0a 09 09 09 70 69 76 20 3d 20 31 3b  PIV:....piv = 1;
11820 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
11830 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11840 45 5f 45 52 52 4f 52 3a 0a 09 09 09 2f 2a 20 54  E_ERROR:..../* T
11850 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61  erminate SmartCa
11860 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
11870 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
11880 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
11890 29 3b 0a 0a 09 09 09 69 66 20 28 63 65 72 74 73  );.....if (certs
118a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
118b0 2a 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 7d  *count = 0;....}
118c0 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
118d0 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
118e0 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
118f0 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
11900 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11910 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49  RINTF("Error.  I
11920 6d 70 6f 73 73 69 62 6c 65 20 63 6f 6e 64 69 74  mpossible condit
11930 69 6f 6e 20 72 65 61 63 68 65 64 2e 22 29 3b 0a  ion reached.");.
11940 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
11950 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c  if (certs == NUL
11960 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d  L) {...certs = m
11970 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65  alloc(sizeof(*ce
11980 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f  rts) * 5);...*co
11990 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72 74 73  unt = 5;...certs
119a0 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a  _resizable = 1;.
119b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65 72 74  .} else {...cert
119c0 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b  s_resizable = 0;
119d0 0a 09 7d 0a 0a 09 69 66 20 28 70 69 76 29 20 7b  ..}...if (piv) {
119e0 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
119f0 20 69 64 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29   idx < 3; idx++)
11a00 20 7b 0a 09 09 09 73 77 69 74 63 68 20 28 69 64   {....switch (id
11a10 78 29 20 7b 0a 09 09 09 09 63 61 73 65 20 30 3a  x) {.....case 0:
11a20 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20  ......piv_oid = 
11a30 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b  piv_oid_pivauth;
11a40 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
11a50 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
11a60 45 59 5f 50 49 56 41 55 54 48 3b 0a 09 09 09 09  EY_PIVAUTH;.....
11a70 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75  .piv_label = "Au
11a80 74 68 65 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09  thentication";..
11a90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63  ....break;.....c
11aa0 61 73 65 20 31 3a 0a 09 09 09 09 09 70 69 76 5f  ase 1:......piv_
11ab0 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69  oid = piv_oid_si
11ac0 67 6e 61 74 75 72 65 3b 0a 09 09 09 09 09 70 69  gnature;......pi
11ad0 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30  v_key = NISTSP80
11ae0 30 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41  0_78_3_KEY_SIGNA
11af0 54 55 52 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c  TURE;......piv_l
11b00 61 62 65 6c 20 3d 20 22 53 69 67 6e 61 74 75 72  abel = "Signatur
11b10 65 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  e";......break;.
11b20 09 09 09 09 63 61 73 65 20 32 3a 0a 09 09 09 09  ....case 2:.....
11b30 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f  .piv_oid = piv_o
11b40 69 64 5f 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09  id_keymgt;......
11b50 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50  piv_key = NISTSP
11b60 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59  800_78_3_KEY_KEY
11b70 4d 47 54 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61  MGT;......piv_la
11b80 62 65 6c 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67  bel = "Key Manag
11b90 65 6d 65 6e 74 22 3b 0a 09 09 09 09 09 62 72 65  ement";......bre
11ba0 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61  ak;....}.....rea
11bb0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67  d_ret = cackey_g
11bc0 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62 75  et_data(slot, bu
11bd0 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 62 75 66  ffer, sizeof(buf
11be0 66 65 72 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a  fer), piv_oid);.
11bf0 0a 09 09 09 69 66 20 28 72 65 61 64 5f 72 65 74  ....if (read_ret
11c00 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e   <= 0) {.....con
11c10 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
11c20 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
11c30 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
11c40 69 64 78 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f  idx++;.....curr_
11c50 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31  id->keysize = -1
11c60 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 69 64  ;....curr_id->id
11c70 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59 5f 49  _type = CACKEY_I
11c80 44 5f 54 59 50 45 5f 50 49 56 3b 0a 09 09 09 63  D_TYPE_PIV;....c
11c90 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76  urr_id->card.piv
11ca0 2e 6b 65 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65  .key_id = piv_ke
11cb0 79 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  y;....memcpy(cur
11cc0 72 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c  r_id->card.piv.l
11cd0 61 62 65 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c  abel, piv_label,
11ce0 20 73 74 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65   strlen(piv_labe
11cf0 6c 29 20 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72  l) + 1);.....cur
11d00 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11d10 65 5f 6c 65 6e 20 3d 20 72 65 61 64 5f 72 65 74  e_len = read_ret
11d20 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  ;....curr_id->ce
11d30 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
11d40 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  oc(curr_id->cert
11d50 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
11d60 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73  ..buffer_len = s
11d70 69 7a 65 6f 66 28 62 75 66 66 65 72 29 3b 0a 09  izeof(buffer);..
11d80 09 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61 63  ..buffer_p = cac
11d90 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
11da0 74 61 67 28 62 75 66 66 65 72 2c 20 26 62 75 66  tag(buffer, &buf
11db0 66 65 72 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63  fer_len, 0x70, c
11dc0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11dd0 61 74 65 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63  ate, &curr_id->c
11de0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
11df0 0a 0a 09 09 09 69 66 20 28 62 75 66 66 65 72 5f  .....if (buffer_
11e00 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  p == NULL) {....
11e10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11e20 49 4e 54 46 28 22 52 65 61 64 69 6e 67 20 63 65  INTF("Reading ce
11e30 72 74 69 66 69 63 61 74 65 20 66 72 6f 6d 20 42  rtificate from B
11e40 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73 65 20  ER-TLV response 
11e50 66 61 69 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67  failed, skipping
11e60 20 6b 65 79 20 25 69 22 2c 20 69 64 78 29 3b 0a   key %i", idx);.
11e70 0a 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 69  .....free(curr_i
11e80 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 29 3b  d->certificate);
11e90 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
11ea0 65 72 74 69 66 69 63 61 74 65 20 3d 20 4e 55 4c  ertificate = NUL
11eb0 4c 3b 0a 0a 09 09 09 09 6f 75 74 69 64 78 2d 2d  L;......outidx--
11ec0 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
11ed0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 75  ....}.....if (cu
11ee0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11ef0 74 65 5f 6c 65 6e 20 3e 20 34 29 20 7b 0a 09 09  te_len > 4) {...
11f00 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 63 75 72  ..if (memcmp(cur
11f10 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
11f20 65 2c 20 22 5c 78 31 66 5c 78 38 62 5c 78 30 38  e, "\x1f\x8b\x08
11f30 5c 78 30 30 22 2c 20 34 29 20 3d 3d 20 30 29 20  \x00", 4) == 0) 
11f40 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  {.#ifdef HAVE_LI
11f50 42 5a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65  BZ......tmpbufle
11f60 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72  n = curr_id->cer
11f70 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 2a 20 32  tificate_len * 2
11f80 3b 0a 09 09 09 09 09 74 6d 70 62 75 66 20 3d 20  ;......tmpbuf = 
11f90 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
11fa0 29 3b 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  );.......CACKEY_
11fb0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
11fc0 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 64 65  Attempting to de
11fd0 63 6f 6d 70 72 65 73 73 3a 22 2c 20 63 75 72 72  compress:", curr
11fe0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11ff0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
12000 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
12010 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a  ...gzip_stream.z
12020 61 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09  alloc = NULL;...
12030 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a  ...gzip_stream.z
12040 66 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  free = NULL;....
12050 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6f 70  ..gzip_stream.op
12060 61 71 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  aque = NULL;....
12070 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e  ...gzip_stream.n
12080 65 78 74 5f 69 6e 20 20 3d 20 63 75 72 72 5f 69  ext_in  = curr_i
12090 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  d->certificate;.
120a0 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
120b0 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 63 75 72 72  .avail_in = curr
120c0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
120d0 5f 6c 65 6e 3b 0a 09 09 09 09 09 67 7a 69 70 5f  _len;......gzip_
120e0 73 74 72 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20  stream.next_out 
120f0 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 09 67  = tmpbuf;......g
12100 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c  zip_stream.avail
12110 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66 6c 65 6e  _out = tmpbuflen
12120 3b 0a 0a 09 09 09 09 09 75 6e 63 6f 6d 70 72 65  ;.......uncompre
12130 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65  ss_ret = inflate
12140 49 6e 69 74 28 26 67 7a 69 70 5f 73 74 72 65 61  Init(&gzip_strea
12150 6d 29 3b 0a 09 09 09 09 09 69 66 20 28 75 6e 63  m);......if (unc
12160 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a  ompress_ret == Z
12170 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 2f 2a 20  _OK) {......./* 
12180 54 72 79 20 61 67 61 69 6e 20 61 73 20 61 20 67  Try again as a g
12190 7a 69 70 20 62 75 66 66 65 72 20 2a 2f 0a 09 09  zip buffer */...
121a0 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72  ....uncompress_r
121b0 65 74 20 3d 20 69 6e 66 6c 61 74 65 45 6e 64 28  et = inflateEnd(
121c0 26 67 7a 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09  &gzip_stream);..
121d0 09 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72  .....if (uncompr
121e0 65 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29  ess_ret == Z_OK)
121f0 20 7b 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73   {........gzip_s
12200 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 4e  tream.zalloc = N
12210 55 4c 4c 3b 0a 09 09 09 09 09 09 09 67 7a 69 70  ULL;........gzip
12220 5f 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d 20  _stream.zfree = 
12230 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 67 7a 69  NULL;........gzi
12240 70 5f 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20  p_stream.opaque 
12250 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09  = NULL;.........
12260 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e 65 78 74  gzip_stream.next
12270 5f 69 6e 20 20 3d 20 63 75 72 72 5f 69 64 2d 3e  _in  = curr_id->
12280 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
12290 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
122a0 61 76 61 69 6c 5f 69 6e 20 3d 20 63 75 72 72 5f  avail_in = curr_
122b0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
122c0 6c 65 6e 3b 0a 09 09 09 09 09 09 09 67 7a 69 70  len;........gzip
122d0 5f 73 74 72 65 61 6d 2e 6e 65 78 74 5f 6f 75 74  _stream.next_out
122e0 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 09   = tmpbuf;......
122f0 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 61 76  ..gzip_stream.av
12300 61 69 6c 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66  ail_out = tmpbuf
12310 6c 65 6e 3b 0a 09 09 09 09 09 09 09 75 6e 63 6f  len;........unco
12320 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66  mpress_ret = inf
12330 6c 61 74 65 49 6e 69 74 32 28 26 67 7a 69 70 5f  lateInit2(&gzip_
12340 73 74 72 65 61 6d 2c 20 33 31 29 3b 0a 09 09 09  stream, 31);....
12350 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09  ...}......}.....
12360 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
12370 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09  ret == Z_OK) {..
12380 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f  .....uncompress_
12390 72 65 74 20 3d 20 69 6e 66 6c 61 74 65 28 26 67  ret = inflate(&g
123a0 7a 69 70 5f 73 74 72 65 61 6d 2c 20 30 29 3b 0a  zip_stream, 0);.
123b0 09 09 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28  .....}......if (
123c0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
123d0 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 29 20  = Z_STREAM_END) 
123e0 7b 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65  {.......uncompre
123f0 73 73 5f 72 65 74 20 3d 20 69 6e 66 6c 61 74 65  ss_ret = inflate
12400 45 6e 64 28 26 67 7a 69 70 5f 73 74 72 65 61 6d  End(&gzip_stream
12410 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
12420 0a 09 09 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  .......uncompres
12430 73 5f 72 65 74 20 3d 20 5a 5f 44 41 54 41 5f 45  s_ret = Z_DATA_E
12440 52 52 4f 52 3b 0a 09 09 09 09 09 7d 0a 09 09 09  RROR;......}....
12450 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
12460 5f 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret == Z_OK) {.
12470 09 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
12480 3d 20 67 7a 69 70 5f 73 74 72 65 61 6d 2e 74 6f  = gzip_stream.to
12490 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 09 09 09 09  tal_out;........
124a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
124b0 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
124c0 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
124d0 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  , tmpbuflen);...
124e0 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 69  .....free(curr_i
124f0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 29 3b  d->certificate);
12500 0a 0a 09 09 09 09 09 09 63 75 72 72 5f 69 64 2d  ........curr_id-
12510 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 74  >certificate = t
12520 6d 70 62 75 66 3b 0a 09 09 09 09 09 09 63 75 72  mpbuf;.......cur
12530 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
12540 65 5f 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65  e_len = tmpbufle
12550 6e 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  n;......} else {
12560 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
12570 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 6f  BUG_PRINTF("Deco
12580 6d 70 72 65 73 73 69 6e 67 20 66 61 69 6c 65 64  mpressing failed
12590 21 20 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72  ! uncompress() r
125a0 65 74 75 72 6e 65 64 20 25 69 22 2c 20 75 6e 63  eturned %i", unc
125b0 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09  ompress_ret);...
125c0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
125d0 29 3b 0a 09 09 09 09 09 7d 0a 23 65 6c 73 65 0a  );......}.#else.
125e0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
125f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12600 20 20 57 65 20 67 6f 74 20 61 20 63 6f 6d 70 72    We got a compr
12610 65 73 73 65 64 20 63 65 72 74 69 66 69 63 61 74  essed certificat
12620 65 20 62 75 74 20 77 65 20 64 6f 20 6e 6f 74 20  e but we do not 
12630 68 61 76 65 20 7a 6c 69 62 2e 20 20 48 6f 70 69  have zlib.  Hopi
12640 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 2e  ng for the best.
12650 22 29 3b 0a 23 65 6e 64 69 66 0a 09 09 09 09 7d  ");.#endif.....}
12660 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73  ....}...}..} els
12670 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64 20 61 6c  e {.../* Read al
12680 6c 20 74 68 65 20 61 70 70 6c 65 74 73 20 66 72  l the applets fr
12690 6f 6d 20 74 68 65 20 43 43 43 27 73 20 54 4c 56  om the CCC's TLV
126a0 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76 20 3d 20   */...ccc_tlv = 
126b0 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
126c0 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f  slot);..../* Loo
126d0 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20 74  k for CARDURLs t
126e0 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74  hat coorespond t
126f0 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f  o PKI applets */
12700 0a 09 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  ...for (ccc_curr
12710 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
12720 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
12730 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
12740 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
12750 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
12760 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c  d tag: %s ... ",
12770 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
12780 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63  NC_TAG_TO_STR(cc
12790 63 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a  c_curr->tag));..
127a0 09 09 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d  ...if (ccc_curr-
127b0 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41  >tag != GSCIS_TA
127c0 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09  G_CARDURL) {....
127d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
127e0 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
127f0 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
12800 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52 44   care about CARD
12810 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f  URLs)");......co
12820 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
12830 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e  .if ((ccc_curr->
12840 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
12850 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f  pptype & CACKEY_
12860 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20  TLV_APP_PKI) != 
12870 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
12880 4b 49 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  KI) {.....CACKEY
12890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
128a0 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74   ... skipping it
128b0 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61   (we only care a
128c0 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73  bout PKI applets
128d0 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 75  , this applet su
128e0 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29  pports: %s/%02x)
128f0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
12900 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
12910 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
12920 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
12930 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
12940 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e   int) ccc_curr->
12950 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
12960 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6f  pptype);......co
12970 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
12980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12990 49 4e 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63  INTBUF("RID:", c
129a0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
129b0 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a  ardurl->rid, siz
129c0 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  eof(ccc_curr->va
129d0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
129e0 29 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ));....CACKEY_DE
129f0 42 55 47 5f 50 52 49 4e 54 46 28 22 41 70 70 49  BUG_PRINTF("AppI
12a00 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43  D = %s/%04lx", C
12a10 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
12a20 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63  _OBJID_TO_STR(cc
12a30 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
12a40 72 64 75 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28  rdurl->appid), (
12a50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) 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 61 70 70 69 64 29 3b 0a  ardurl->appid);.
12a80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12a90 50 52 49 4e 54 46 28 22 4f 62 6a 65 63 74 49 44  PRINTF("ObjectID
12aa0 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41   = %s/%04lx", CA
12ab0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
12ac0 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63  OBJID_TO_STR(ccc
12ad0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
12ae0 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c  durl->objectid),
12af0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
12b00 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
12b10 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
12b20 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  id);.....memcpy(
12b30 63 75 72 72 5f 61 69 64 2c 20 63 63 63 5f 63 75  curr_aid, ccc_cu
12b40 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
12b50 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
12b60 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
12b70 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
12b80 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f  ..curr_aid[sizeo
12b90 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20 32 5d  f(curr_aid) - 2]
12ba0 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61   = (ccc_curr->va
12bb0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
12bc0 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  id >> 8) & 0xff;
12bd0 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ....curr_aid[siz
12be0 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
12bf0 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  1] = ccc_curr->v
12c00 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
12c10 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09 09  pid & 0xff;.....
12c20 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
12c30 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
12c40 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
12c50 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
12c60 65 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69  et(slot, curr_ai
12c70 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  d, sizeof(curr_a
12c80 69 64 29 29 3b 0a 09 09 09 69 66 20 28 73 65 6c  id));....if (sel
12c90 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
12ca0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
12cb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12cc0 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
12cd0 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 2c  o select applet,
12ce0 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
12cf0 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
12d00 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74  ect");......cont
12d10 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f  inue;....}...../
12d20 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74  * ... and object
12d30 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 09 73 65   (file) */....se
12d40 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  lect_ret = cacke
12d50 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
12d60 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ot, ccc_curr->va
12d70 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
12d80 65 63 74 69 64 29 3b 0a 09 09 09 69 66 20 28 73  ectid);....if (s
12d90 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
12da0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
12db0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12dc0 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
12dd0 20 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c   to select file,
12de0 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73   skipping proces
12df0 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a  sing of this obj
12e00 65 63 74 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74  ect");......cont
12e10 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f  inue;....}...../
12e20 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 20 66  * Process this f
12e30 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e  ile's TLV lookin
12e40 67 20 66 6f 72 20 63 65 72 74 69 66 69 63 61 74  g for certificat
12e50 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f 74 6c 76  es */....app_tlv
12e60 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
12e70 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09 09 09 66  lv(slot);......f
12e80 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20 61  or (app_curr = a
12e90 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72 72  pp_tlv; app_curr
12ea0 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70  ; app_curr = app
12eb0 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a  _curr->_next) {.
12ec0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12ed0 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
12ee0 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
12ef0 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
12f00 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
12f10 74 61 67 29 29 3b 0a 09 09 09 09 69 66 20 28 61  tag));.....if (a
12f20 70 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20  pp_curr->tag != 
12f30 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
12f40 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
12f50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12f60 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
12f70 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
12f80 72 65 20 61 62 6f 75 74 20 43 45 52 54 49 46 49  re about CERTIFI
12f90 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 09  CATEs)");.......
12fa0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
12fb0 0a 09 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
12fc0 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
12fd0 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
12fe0 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
12ff0 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
13000 59 50 45 5f 43 41 43 3b 0a 09 09 09 09 6d 65 6d  YPE_CAC;.....mem
13010 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  cpy(curr_id->car
13020 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 63 75  d.cac.applet, cu
13030 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
13040 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
13050 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 63  .applet));.....c
13060 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
13070 2e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75 72 72  .file = ccc_curr
13080 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
13090 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09 09 63  >objectid;.....c
130a0 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20  urr_id->keysize 
130b0 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45  = -1;......CACKE
130c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
130d0 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d  Filling curr_id-
130e0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
130f0 20 28 25 70 29 20 77 69 74 68 20 25 6c 75 20 62   (%p) with %lu b
13100 79 74 65 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d  ytes:", curr_id-
13110 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
13120 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13130 29 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  ) sizeof(curr_id
13140 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
13150 74 29 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f  t));.....CACKEY_
13160 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
13170 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e  VAL:", curr_id->
13180 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c  card.cac.applet,
13190 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
131a0 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  >card.cac.applet
131b0 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64  ));......curr_id
131c0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
131d0 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65  n = app_curr->le
131e0 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ngth;......curr_
131f0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
13200 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
13210 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
13220 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  n);.....memcpy(c
13230 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
13240 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76  ate, app_curr->v
13250 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63  alue, curr_id->c
13260 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
13270 0a 0a 09 09 09 09 69 66 20 28 6f 75 74 69 64 78  ......if (outidx
13280 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
13290 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
132a0 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 09  izable) {.......
132b0 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09  *count *= 2;....
132c0 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 21 3d  ...if (*count !=
132d0 20 30 29 20 7b 0a 09 09 09 09 09 09 09 63 65 72   0) {........cer
132e0 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
132f0 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
13300 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
13310 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
13320 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 4e 55  ......certs = NU
13330 4c 4c 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  LL;.......}.....
13340 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
13350 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
13360 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
13370 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70  key_free_tlv(app
13380 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _tlv);.....if (o
13390 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
133a0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
133b0 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  .}...}....cackey
133c0 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c  _free_tlv(ccc_tl
133d0 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20  v);..}...*count 
133e0 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28  = outidx;...if (
133f0 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
13400 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20   {...if (*count 
13410 21 3d 20 30 29 20 7b 0a 09 09 09 63 65 72 74 73  != 0) {....certs
13420 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73   = realloc(certs
13430 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  , sizeof(*certs)
13440 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09   * (*count));...
13450 7d 20 65 6c 73 65 20 7b 0a 09 09 09 66 72 65 65  } else {....free
13460 28 63 65 72 74 73 29 3b 0a 0a 09 09 09 63 65 72  (certs);.....cer
13470 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ts = NULL;...}..
13480 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  }...slot->cached
13490 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f  _certs = cackey_
134a0 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c  copy_certs(NULL,
134b0 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b   certs, *count);
134c0 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
134d0 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f  erts_count = *co
134e0 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  unt;.../* Termin
134f0 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
13500 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
13510 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
13520 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65  tion(slot);...re
13530 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a  turn(certs);.}..
13540 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
13550 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13560 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
13570 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
13580 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
13590 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
135a0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
135b0 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
135c0 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
135d0 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  pt(struct cackey
135e0 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
135f0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
13600 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
13610 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
13620 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  f, size_t buflen
13630 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
13640 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20  *outbuf, size_t 
13650 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70  outbuflen, int p
13660 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70  adInput, int unp
13670 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63 61 63  adOutput) {..cac
13680 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
13690 20 69 64 5f 74 79 70 65 2c 20 63 68 65 63 6b 5f   id_type, check_
136a0 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e  id_type;..unsign
136b0 65 64 20 63 68 61 72 20 64 79 6e 5f 61 75 74 68  ed char dyn_auth
136c0 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d 2c 20 2a  _template[10], *
136d0 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 3b  dyn_auth_tmpbuf;
136e0 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
136f0 2a 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75 66  *tmpbuf, *tmpbuf
13700 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 73 2c 20 2a  _s, *outbuf_s, *
13710 6f 75 74 62 75 66 5f 70 3b 0a 09 75 6e 73 69 67  outbuf_p;..unsig
13720 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f 74  ned char bytes_t
13730 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c 61 73  o_send, p1, clas
13740 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
13750 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61  r blocktype;..ca
13760 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65  ckey_ret send_re
13770 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  t;..uint16_t res
13780 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20  pcode;..ssize_t 
13790 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61  retval = 0, unpa
137a0 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74  doffset;..size_t
137b0 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c   tmpbuflen, padl
137c0 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e  en, tmpoutbuflen
137d0 2c 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 09 69  , outbuf_len;..i
137e0 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  nt free_tmpbuf =
137f0 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43   0;..int le;...C
13800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13810 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
13820 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c  .if (slot == NUL
13830 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
13840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13850 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c  r.  slot is NULL
13860 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
13870 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20  );..}...if (buf 
13880 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
13890 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
138a0 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73  ("Error.  buf is
138b0 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
138c0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
138d0 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  (outbuf == NULL)
138e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
138f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13900 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c    outbuf is NULL
13910 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
13920 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e  );..}...if (iden
13930 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tity == NULL) {.
13940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13950 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69  RINTF("Error.  i
13960 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22  dentity is NULL"
13970 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
13980 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74  ;..}...if (ident
13990 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
139a0 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
139b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
139c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65  NTF("Error.  ide
139d0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
139e0 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tity is NULL");.
139f0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
13a00 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 69 64  }...id_type = id
13a10 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
13a20 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 3b 0a  ntity->id_type;.
13a30 09 69 66 20 28 69 64 5f 74 79 70 65 20 3d 3d 20  .if (id_type == 
13a40 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
13a50 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43 41  ERT_ONLY) {...CA
13a60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13a70 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
13a80 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
13a90 74 79 20 69 73 20 43 41 43 4b 45 59 5f 49 44 5f  ty is CACKEY_ID_
13aa0 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c 20  TYPE_CERT_ONLY, 
13ab0 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 62 65 20  which cannot be 
13ac0 75 73 65 64 20 66 6f 72 20 73 69 67 6e 2f 64 65  used for sign/de
13ad0 63 72 79 70 74 22 29 3b 0a 0a 09 09 72 65 74 75  crypt");....retu
13ae0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77 69  rn(-1);..}...swi
13af0 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
13b00 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
13b10 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 63 61 73  _TYPE_PIV:...cas
13b20 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
13b30 5f 43 41 43 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  _CAC:....break;.
13b40 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41  ..default:....CA
13b50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13b60 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
13b70 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
13b80 74 79 20 69 73 20 6e 6f 74 20 61 20 73 75 70 70  ty is not a supp
13b90 6f 72 74 65 64 20 76 61 6c 75 65 2e 20 54 79 70  orted value. Typ
13ba0 65 20 69 73 3a 20 30 78 25 6c 78 20 28 50 49 56  e is: 0x%lx (PIV
13bb0 20 3d 20 30 78 25 6c 78 2c 20 43 41 43 20 3d 20   = 0x%lx, CAC = 
13bc0 30 78 25 6c 78 29 22 2c 20 28 75 6e 73 69 67 6e  0x%lx)", (unsign
13bd0 65 64 20 6c 6f 6e 67 29 20 69 64 5f 74 79 70 65  ed long) id_type
13be0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13bf0 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  ) CACKEY_ID_TYPE
13c00 5f 50 49 56 2c 20 28 75 6e 73 69 67 6e 65 64 20  _PIV, (unsigned 
13c10 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44 5f  long) CACKEY_ID_
13c20 54 59 50 45 5f 43 41 43 29 3b 0a 0a 09 09 09 72  TYPE_CAC);.....r
13c30 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
13c40 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65  /* Determine ide
13c50 6e 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a  ntity Key size *
13c60 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  /..if (identity-
13c70 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
13c80 6b 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09  keysize < 0) {..
13c90 09 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  .identity->pcsc_
13ca0 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
13cb0 65 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73  e = x509_to_keys
13cc0 69 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  ize(identity->pc
13cd0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
13ce0 74 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69  tificate, identi
13cf0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
13d00 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  y->certificate_l
13d10 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64  en);..}.../* Pad
13d20 20 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20   message to key 
13d30 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64  size */..if (pad
13d40 49 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69  Input) {...if (i
13d50 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13d60 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
13d70 3e 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75  > 0) {....if (bu
13d80 66 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79  flen != identity
13d90 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
13da0 3e 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09  >keysize) {.....
13db0 69 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64  if (buflen > (id
13dc0 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
13dd0 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2d  ntity->keysize -
13de0 20 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b   3)) {......CACK
13df0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13e00 22 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65  "Error.  Message
13e10 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f   is too large to
13e20 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b   sign/decrypt");
13e30 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31  .......return(-1
13e40 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d  );.....}......tm
13e50 70 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69  pbuflen = identi
13e60 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
13e70 79 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09  y->keysize;.....
13e80 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
13e90 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  tmpbuflen);.....
13ea0 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b  free_tmpbuf = 1;
13eb0 0a 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74  ......padlen = t
13ec0 6d 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65  mpbuflen - bufle
13ed0 6e 20 2d 20 33 3b 0a 0a 09 09 09 09 43 41 43 4b  n - 3;......CACK
13ee0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13ef0 22 4e 65 65 64 20 74 6f 20 70 61 64 20 74 68 65  "Need to pad the
13f00 20 62 75 66 66 65 72 20 77 69 74 68 20 25 6c 6c   buffer with %ll
13f10 75 20 62 79 74 65 73 20 28 74 6d 70 62 75 66 6c  u bytes (tmpbufl
13f20 65 6e 20 3d 20 25 6c 6c 75 2c 20 62 75 66 6c 65  en = %llu, bufle
13f30 6e 20 3d 20 25 6c 6c 75 29 22 2c 20 28 75 6e 73  n = %llu)", (uns
13f40 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29  igned long long)
13f50 20 70 61 64 6c 65 6e 2c 20 28 75 6e 73 69 67 6e   padlen, (unsign
13f60 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 74 6d  ed long long) tm
13f70 70 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e  pbuflen, (unsign
13f80 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 62 75  ed long long) bu
13f90 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 2f 2a 20 52  flen);....../* R
13fa0 53 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d 50  SA PKCS#1 EMSA-P
13fb0 4b 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69 6e  KCS1-v1_5 Paddin
13fc0 67 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b  g */.....tmpbuf[
13fd0 30 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74  0] = 0x00;.....t
13fe0 6d 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b  mpbuf[1] = 0x01;
13ff0 0a 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70  .....memset(&tmp
14000 62 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61  buf[2], 0xFF, pa
14010 64 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75  dlen);.....tmpbu
14020 66 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30  f[padlen + 2]= 0
14030 78 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  x00;.....memcpy(
14040 26 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b  &tmpbuf[padlen +
14050 20 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e   3], buf, buflen
14060 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
14070 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55  EBUG_PRINTBUF("U
14080 6e 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20  npadded:", buf, 
14090 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43  buflen);.....CAC
140a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
140b0 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d  UF("Padded:", tm
140c0 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
140d0 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
140e0 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a  ..tmpbuf = buf;.
140f0 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
14100 62 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65  buflen;.....free
14110 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09  _tmpbuf = 0;....
14120 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09  .padlen = 0;....
14130 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
14140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14150 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64  NTF("Unable to d
14160 65 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a  etermine key siz
14170 65 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65  e, hoping the me
14180 73 73 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c  ssage is properl
14190 79 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09  y padded!");....
141a0 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
141b0 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75  ..tmpbuflen = bu
141c0 66 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d  flen;....free_tm
141d0 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64  pbuf = 0;....pad
141e0 6c 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20  len = 0;...}..} 
141f0 65 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20  else {...tmpbuf 
14200 3d 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c  = buf;...tmpbufl
14210 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66  en = buflen;...f
14220 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
14230 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d  ..padlen = 0;..}
14240 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e  .../* Begin tran
14250 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
14260 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
14270 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a  tion(slot);.../*
14280 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20   Select correct 
14290 61 70 70 6c 65 74 20 2a 2f 0a 09 73 77 69 74 63  applet */..switc
142a0 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  h (id_type) {...
142b0 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
142c0 59 50 45 5f 43 41 43 3a 0a 09 09 09 43 41 43 4b  YPE_CAC:....CACK
142d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
142e0 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65  "Selecting apple
142f0 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e  t found at %p ..
14300 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  .", identity->pc
14310 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
14320 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 3b 0a 09  d.cac.applet);..
14330 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  ..cackey_select_
14340 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65  applet(slot, ide
14350 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
14360 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61  tity->card.cac.a
14370 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 64  pplet, sizeof(id
14380 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
14390 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e  ntity->card.cac.
143a0 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 2f 2a  applet));...../*
143b0 20 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20   Select correct 
143c0 66 69 6c 65 20 2a 2f 0a 09 09 09 63 61 63 6b 65  file */....cacke
143d0 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c  y_select_file(sl
143e0 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
143f0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
14400 64 2e 63 61 63 2e 66 69 6c 65 29 3b 0a 09 09 09  d.cac.file);....
14410 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
14420 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
14430 3a 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  :....dyn_auth_te
14440 6d 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37 43  mplate[0] = 0x7C
14450 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
14460 6d 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38 32  mplate[1] = 0x82
14470 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
14480 6d 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74 6d  mplate[2] = ((tm
14490 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30  pbuflen + 6) & 0
144a0 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09  xff00) >> 8;....
144b0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
144c0 65 5b 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65  e[3] = (tmpbufle
144d0 6e 20 2b 20 36 29 20 26 20 30 78 30 30 66 66 3b  n + 6) & 0x00ff;
144e0 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
144f0 70 6c 61 74 65 5b 34 5d 20 3d 20 30 78 38 32 3b  plate[4] = 0x82;
14500 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
14510 70 6c 61 74 65 5b 35 5d 20 3d 20 30 78 30 30 3b  plate[5] = 0x00;
14520 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
14530 70 6c 61 74 65 5b 36 5d 20 3d 20 30 78 38 31 3b  plate[6] = 0x81;
14540 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
14550 70 6c 61 74 65 5b 37 5d 20 3d 20 30 78 38 32 3b  plate[7] = 0x82;
14560 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
14570 70 6c 61 74 65 5b 38 5d 20 3d 20 28 74 6d 70 62  plate[8] = (tmpb
14580 75 66 6c 65 6e 20 26 20 30 78 66 66 30 30 29 20  uflen & 0xff00) 
14590 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74  >> 8;....dyn_aut
145a0 68 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20 3d 20  h_template[9] = 
145b0 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 30 30  tmpbuflen & 0x00
145c0 66 66 3b 0a 0a 09 09 09 64 79 6e 5f 61 75 74 68  ff;.....dyn_auth
145d0 5f 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  _tmpbuf = malloc
145e0 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 73 69 7a  (tmpbuflen + siz
145f0 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d  eof(dyn_auth_tem
14600 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65 6d 63  plate));....memc
14610 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62  py(dyn_auth_tmpb
14620 75 66 2c 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d  uf, dyn_auth_tem
14630 70 6c 61 74 65 2c 20 73 69 7a 65 6f 66 28 64 79  plate, sizeof(dy
14640 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29  n_auth_template)
14650 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 64 79 6e  );....memcpy(dyn
14660 5f 61 75 74 68 5f 74 6d 70 62 75 66 20 2b 20 73  _auth_tmpbuf + s
14670 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74  izeof(dyn_auth_t
14680 65 6d 70 6c 61 74 65 29 2c 20 74 6d 70 62 75 66  emplate), tmpbuf
14690 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  , tmpbuflen);...
146a0 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75  ..if (free_tmpbu
146b0 66 29 20 7b 0a 09 09 09 09 66 72 65 65 28 74 6d  f) {.....free(tm
146c0 70 62 75 66 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  pbuf);....}.....
146d0 74 6d 70 62 75 66 6c 65 6e 20 2b 3d 20 73 69 7a  tmpbuflen += siz
146e0 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d  eof(dyn_auth_tem
146f0 70 6c 61 74 65 29 3b 0a 09 09 09 74 6d 70 62 75  plate);....tmpbu
14700 66 20 3d 20 64 79 6e 5f 61 75 74 68 5f 74 6d 70  f = dyn_auth_tmp
14710 62 75 66 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70  buf;....free_tmp
14720 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 62 72 65  buf = 1;.....bre
14730 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ak;...case CACKE
14740 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
14750 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  NLY:....break;..
14760 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74  }...tmpbuf_s = t
14770 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73  mpbuf;..outbuf_s
14780 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c   = outbuf;..whil
14790 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a  e (tmpbuflen) {.
147a0 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d  ..tmpoutbuflen =
147b0 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 69   outbuflen;....i
147c0 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43  f (tmpbuflen > C
147d0 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20  ACKEY_APDU_MTU) 
147e0 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65  {....bytes_to_se
147f0 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55  nd = CACKEY_APDU
14800 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  _MTU;...} else {
14810 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e  ....bytes_to_sen
14820 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  d = tmpbuflen;..
14830 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d  .}....send_ret =
14840 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
14850 45 4e 45 52 49 43 3b 0a 09 09 73 77 69 74 63 68  ENERIC;...switch
14860 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09   (id_type) {....
14870 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
14880 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 69 66 20  YPE_CAC:.....if 
14890 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43  (tmpbuflen > CAC
148a0 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a  KEY_APDU_MTU) {.
148b0 09 09 09 09 09 70 31 20 3d 20 30 78 38 30 3b 0a  .....p1 = 0x80;.
148c0 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
148d0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
148e0 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09  ..p1 = 0x00;....
148f0 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09  ..le = 0x00;....
14900 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74  .}......send_ret
14910 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
14920 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
14930 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
14940 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53  TFORM, GSCIS_INS
14950 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20  TR_SIGNDECRYPT, 
14960 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f  p1, 0x00, bytes_
14970 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c  to_send, tmpbuf,
14980 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20   le, &respcode, 
14990 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62  outbuf, &tmpoutb
149a0 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61  uflen);.....brea
149b0 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45  k;....case CACKE
149c0 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09  Y_ID_TYPE_PIV:..
149d0 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e  ...if (tmpbuflen
149e0 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   > CACKEY_APDU_M
149f0 54 55 29 20 7b 0a 09 09 09 09 09 63 6c 61 73 73  TU) {......class
14a00 20 3d 20 30 78 31 30 3b 0a 09 09 09 09 09 6c 65   = 0x10;......le
14a10 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65   = 0x00;.....} e
14a20 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c 61 73 73  lse {......class
14a30 20 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49   = GSCIS_CLASS_I
14a40 53 4f 37 38 31 36 3b 0a 09 09 09 09 09 6c 65 20  SO7816;......le 
14a50 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09 09  = 256;.....}....
14a60 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
14a70 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
14a80 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 53  ot, class, NISTS
14a90 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f  P800_73_3_INSTR_
14aa0 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 38  GENAUTH, NISTSP8
14ab0 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41  00_78_3_ALGO_RSA
14ac0 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e  2048, identity->
14ad0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
14ae0 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20  ard.piv.key_id, 
14af0 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74  bytes_to_send, t
14b00 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70  mpbuf, le, &resp
14b10 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74  code, outbuf, &t
14b20 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09  mpoutbuflen);...
14b30 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
14b40 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
14b50 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62  CERT_ONLY:.....b
14b60 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
14b70 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
14b80 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
14b90 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70  ....if (free_tmp
14ba0 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74  buf) {.....if (t
14bb0 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09  mpbuf_s) {......
14bc0 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
14bd0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
14be0 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
14bf0 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
14c00 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
14c10 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 73 65  lot);.....if (se
14c20 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  nd_ret == CACKEY
14c30 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b  _PCSC_E_RETRY) {
14c40 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14c50 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
14c60 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d  ending Failed --
14c70 20 72 65 74 72 79 69 6e 67 2e 22 29 3b 0a 0a 09   retrying.");...
14c80 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
14c90 5f 73 69 67 6e 64 65 63 72 79 70 74 28 73 6c 6f  _signdecrypt(slo
14ca0 74 2c 20 69 64 65 6e 74 69 74 79 2c 20 62 75 66  t, identity, buf
14cb0 2c 20 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66  , buflen, outbuf
14cc0 2c 20 6f 75 74 62 75 66 6c 65 6e 2c 20 70 61 64  , outbuflen, pad
14cd0 49 6e 70 75 74 2c 20 75 6e 70 61 64 4f 75 74 70  Input, unpadOutp
14ce0 75 74 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43  ut));....}.....C
14cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14d00 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67  TF("ADPU Sending
14d10 20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72   Failed -- retur
14d20 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29  ning in error.")
14d30 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f  ;.....if (respco
14d40 64 65 20 3d 3d 20 30 78 36 39 38 32 20 7c 7c 20  de == 0x6982 || 
14d50 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 65  respcode == 0x6e
14d60 30 30 20 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d  00 || respcode =
14d70 3d 20 30 78 36 64 30 30 29 20 7b 0a 09 09 09 09  = 0x6d00) {.....
14d80 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
14d90 30 78 36 65 30 30 29 20 7b 0a 09 09 09 09 09 43  0x6e00) {......C
14da0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14db0 54 46 28 22 47 6f 74 20 5c 22 57 52 4f 4e 47 20  TF("Got \"WRONG 
14dc0 43 4c 41 53 53 5c 22 2c 20 74 68 69 73 20 6d 65  CLASS\", this me
14dd0 61 6e 73 20 77 65 20 61 72 65 20 74 61 6c 6b 69  ans we are talki
14de0 6e 67 20 74 6f 20 74 68 65 20 77 72 6f 6e 67 20  ng to the wrong 
14df0 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20 62  object (likely b
14e00 65 63 61 75 73 65 20 74 68 65 20 63 61 72 64 20  ecause the card 
14e10 77 65 6e 74 20 61 77 61 79 29 20 2d 2d 20 72 65  went away) -- re
14e20 73 65 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d  setting");.....}
14e30 20 65 6c 73 65 20 69 66 20 28 72 65 73 70 63 6f   else if (respco
14e40 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b 0a  de == 0x6d00) {.
14e50 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14e60 47 5f 50 52 49 4e 54 46 28 22 47 6f 74 20 5c 22  G_PRINTF("Got \"
14e70 49 4e 56 41 4c 49 44 20 49 4e 53 54 52 55 43 54  INVALID INSTRUCT
14e80 49 4f 4e 5c 22 2c 20 74 68 69 73 20 6d 65 61 6e  ION\", this mean
14e90 73 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e 67  s we are talking
14ea0 20 74 6f 20 74 68 65 20 77 72 6f 6e 67 20 6f 62   to the wrong ob
14eb0 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20 62 65 63  ject (likely bec
14ec0 61 75 73 65 20 74 68 65 20 63 61 72 64 20 77 65  ause the card we
14ed0 6e 74 20 61 77 61 79 29 20 2d 2d 20 72 65 73 65  nt away) -- rese
14ee0 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d 20 65  tting");.....} e
14ef0 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  lse {......CACKE
14f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14f10 53 65 63 75 72 69 74 79 20 73 74 61 74 75 73 20  Security status 
14f20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64 20 28  not satisified (
14f30 72 65 73 70 63 6f 64 65 20 3d 20 30 78 25 30 34  respcode = 0x%04
14f40 78 29 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e  x).  Returning N
14f50 45 45 44 4c 4f 47 49 4e 22 2c 20 28 69 6e 74 29  EEDLOGIN", (int)
14f60 20 72 65 73 70 63 6f 64 65 29 3b 0a 09 09 09 09   respcode);.....
14f70 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  }......cackey_ma
14f80 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
14f90 6f 74 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  ot);......cackey
14fa0 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65  _detect_and_sele
14fb0 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73  ct_root_applet(s
14fc0 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54  lot, CACKEY_ID_T
14fd0 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09  YPE_UNKNOWN);...
14fe0 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66  ...slot->token_f
14ff0 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
15000 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09  _REQUIRED;......
15010 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15020 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b  SC_E_NEEDLOGIN);
15030 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65  ....}.....if (se
15040 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  nd_ret == CACKEY
15050 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
15060 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ENT) {.....CACKE
15070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15080 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52  Token absent.  R
15090 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42  eturning TOKENAB
150a0 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63  SENT");......cac
150b0 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
150c0 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  set(slot);......
150d0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
150e0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
150f0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  );....}.....CACK
15100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15110 22 53 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20  "Something went 
15120 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 73 69 67  wrong during sig
15130 6e 69 6e 67 2c 20 72 65 73 65 74 74 69 6e 67 20  ning, resetting 
15140 74 68 65 20 73 6c 6f 74 20 61 6e 64 20 68 6f 70  the slot and hop
15150 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74  ing for the best
15160 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
15170 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
15180 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  );.....cackey_pc
15190 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09  sc_connect();...
151a0 09 09 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f  ..cackey_detect_
151b0 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f  and_select_root_
151c0 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 43 41 43  applet(slot, CAC
151d0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e  KEY_ID_TYPE_UNKN
151e0 4f 57 4e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  OWN);.....return
151f0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
15200 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
15210 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f  tmpbuf += bytes_
15220 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75  to_send;...tmpbu
15230 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  flen -= bytes_to
15240 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66  _send;....outbuf
15250 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
15260 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d  ;...outbuflen -=
15270 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
15280 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75  .retval += tmpou
15290 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66  tbuflen;..}...if
152a0 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b   (free_tmpbuf) {
152b0 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
152c0 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75   {....free(tmpbu
152d0 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f  f_s);...}..}...o
152e0 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73  utbuf = outbuf_s
152f0 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ;.../* End trans
15300 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
15310 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
15320 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66  n(slot);..#ifdef
15330 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
15340 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
15350 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
15360 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53  outbuflen > _POS
15370 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
15380 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15390 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e  RINTF("Outbuflen
153a0 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
153b0 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
153c0 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
153d0 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66  ax = %li, outbuf
153e0 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  len = %lu)", (lo
153f0 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
15400 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
15410 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29  long) outbuflen)
15420 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
15430 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
15440 64 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74  dif.../* We must
15450 20 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22   remove the "7C"
15460 20 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74   tag to get to t
15470 68 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a  he signature */.
15480 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
15490 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ) {...case CACKE
154a0 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09  Y_ID_TYPE_PIV:..
154b0 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
154c0 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
154d0 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
154e0 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
154f0 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
15500 20 30 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x7C, NULL,  &o
15510 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
15520 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
15530 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
15540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15550 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
15560 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
15570 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
15580 73 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67  s not a 0x7C tag
15590 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
155a0 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72  ailure");......r
155b0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
155c0 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74  ....retval = out
155d0 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74  buf_len;.....out
155e0 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c  buf_len = retval
155f0 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20  ;....outbuf_p = 
15600 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74  cackey_read_bert
15610 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26  lv_tag(outbuf, &
15620 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32  outbuf_len, 0x82
15630 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66  , NULL,  &outbuf
15640 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75  _len);....if (ou
15650 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  tbuf_p == NULL) 
15660 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
15670 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
15680 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72  nse from PIV for
15690 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e   GENERATE AUTHEN
156a0 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74  TICATION was not
156b0 20 61 20 30 78 38 32 20 77 69 74 68 69 6e 20 61   a 0x82 within a
156c0 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72   0x7C tag, retur
156d0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
156e0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
156f0 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  1);....}.....ret
15700 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e  val = outbuf_len
15710 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  ;.....break;...c
15720 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
15730 50 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43  PE_CAC:...case C
15740 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
15750 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61  RT_ONLY:....brea
15760 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64  k;..}.../* Unpad
15770 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75   reply */..if (u
15780 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09  npadOutput) {...
15790 69 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20  if (retval < 3) 
157a0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
157b0 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20  G_PRINTF("Reply 
157c0 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65  is too small, we
157d0 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f   are not able to
157e0 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e   unpad -- passin
157f0 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e  g back and hopin
15800 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22  g for the best!"
15810 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
15820 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
15830 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
15840 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28  , retval = %li (
15850 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20  bytes)", (long) 
15860 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75  retval);....retu
15870 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a  rn(retval);...}.
15880 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d  ...if (outbuf[0]
15890 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43   != 0x00) {....C
158a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
158b0 54 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64  TF("Unrecognized
158c0 20 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20   padding scheme 
158d0 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20  -- passing back 
158e0 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74  and hoping for t
158f0 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09  he best!");.....
15900 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15910 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
15920 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61  n success, retva
15930 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22  l = %li (bytes)"
15940 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29  , (long) retval)
15950 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76  ;....return(retv
15960 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63  al);...}....bloc
15970 6b 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31  ktype = outbuf[1
15980 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74  ];...unpadoffset
15990 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20   = 0;....switch 
159a0 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09  (blocktype) {...
159b0 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09  .case 0x00:.....
159c0 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
159d0 65 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e  e 1, the first n
159e0 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20  on-zero byte is 
159f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74  the start of dat
15a00 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e  a */.....for (un
15a10 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75  padoffset = 2; u
15a20 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74  npadoffset < ret
15a30 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  val; unpadoffset
15a40 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f  ++) {......if (o
15a50 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
15a60 74 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] != 0x00) {...
15a70 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
15a80 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
15a90 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a  k;....case 0x01:
15aa0 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
15ab0 53 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79  Scheme 2, pad by
15ac0 74 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c  tes are 0xFF fol
15ad0 6c 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f  lowed by 0x00 */
15ae0 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f  .....for (unpado
15af0 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64  ffset = 2; unpad
15b00 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b  offset < retval;
15b10 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20   unpadoffset++) 
15b20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  {......if (outbu
15b30 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21  f[unpadoffset] !
15b40 3d 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09  = 0xFF) {.......
15b50 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
15b60 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29  offset] == 0x00)
15b70 20 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f   {........unpado
15b80 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09  ffset++;........
15b90 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20  .break;.......} 
15ba0 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41  else {........CA
15bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15bc0 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69  F("Invalid paddi
15bd0 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72  ng data found, r
15be0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
15bf0 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65  ure, should have
15c00 20 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64   been 0x00 found
15c10 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67   0x%02x", (unsig
15c20 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b  ned int) outbuf[
15c30 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a  unpadoffset]);..
15c40 09 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31  .......return(-1
15c50 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  );.......}......
15c60 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43  } else {.......C
15c70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15c80 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64  TF("Invalid padd
15c90 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20  ing data found, 
15ca0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
15cb0 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76  lure, should hav
15cc0 65 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e  e been 0xFF foun
15cd0 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69  d 0x%02x", (unsi
15ce0 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66  gned int) outbuf
15cf0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a  [unpadoffset]);.
15d00 0a 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31  .......return(-1
15d10 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  );......}.....}.
15d20 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
15d30 73 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20  se 0x02:...../* 
15d40 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33  Padding Scheme 3
15d50 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20  , pad bytes are 
15d60 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a  non-zero first z
15d70 65 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69  ero byte found i
15d80 73 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20  s the seperator 
15d90 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20  byte */.....for 
15da0 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32  (unpadoffset = 2
15db0 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20  ; unpadoffset < 
15dc0 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66  retval; unpadoff
15dd0 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  set++) {......if
15de0 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
15df0 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b  fset] == 0x00) {
15e00 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
15e10 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65  et++;........bre
15e20 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
15e30 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
15e40 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73  ...if (unpadoffs
15e50 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09  et > retval) {..
15e60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15e70 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72  RINTF("Offset gr
15e80 65 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79  eater than reply
15e90 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e   size, aborting.
15ea0 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d    (unpadoffset =
15eb0 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25   %lu, retval = %
15ec0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
15ed0 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65  long) unpadoffse
15ee0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  t, (unsigned lon
15ef0 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  g) retval);.....
15f00 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
15f10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15f20 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64  PRINTBUF("Padded
15f30 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
15f40 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d  al);....retval -
15f50 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  = unpadoffset;..
15f60 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c  .memmove(outbuf,
15f70 20 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f   outbuf + unpado
15f80 66 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a  ffset, retval);.
15f90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15fa0 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
15fb0 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65  ed:", outbuf, re
15fc0 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43  tval);..}....CAC
15fd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15fe0 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
15ff0 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
16000 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
16010 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a  long) retval);..
16020 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
16030 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
16040 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
16050 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
16060 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
16070 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
16080 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
16090 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
160a0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
160b0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f  ey_ret cackey_to
160c0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75  ken_present(stru
160d0 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
160e0 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
160f0 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ret pcsc_connect
16100 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61  _ret;..DWORD rea
16110 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61  der_len = 0, sta
16120 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c  te = 0, protocol
16130 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09   = 0, atr_len;..
16140 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52  BYTE atr[MAX_ATR
16150 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74  _SIZE];..LONG st
16160 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f  atus_ret, scard_
16170 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41  reconn_ret;...CA
16180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16190 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
161a0 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e  if (slot->intern
161b0 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  al) {...CACKEY_D
161c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
161d0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
161e0 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74  sent (internal t
161f0 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75  oken)");....retu
16200 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
16210 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
16220 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
16230 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
16240 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
16250 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
16260 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
16270 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
16280 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16290 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
162a0 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
162b0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
162c0 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72  n absent");....r
162d0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
162e0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
162f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
16300 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
16310 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28  ing SCardStatus(
16320 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63  ) to determine c
16330 61 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09  ard status");...
16340 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  atr_len = sizeof
16350 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72  (atr);..status_r
16360 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
16370 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
16380 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
16390 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
163a0 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
163b0 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74  r_len);...if (st
163c0 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  atus_ret == SCAR
163d0 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
163e0 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LE) {...CACKEY_D
163f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
16400 72 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72  rdStatus() retur
16410 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ned SCARD_E_INVA
16420 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b  LID_HANDLE, mark
16430 69 6e 67 20 61 73 20 6e 6f 74 20 61 6c 72 65 61  ing as not alrea
16440 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64  dy connected and
16450 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b   trying again");
16460 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
16470 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
16480 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ....pcsc_connect
16490 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
164a0 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
164b0 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  ;...if (pcsc_con
164c0 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
164d0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
164e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
164f0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
16500 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
16510 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
16520 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
16530 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
16540 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
16550 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  T);...}....CACKE
16560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16570 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61  Calling SCardSta
16580 74 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a  tus() again");..
16590 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  ..atr_len = size
165a0 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75  of(atr);...statu
165b0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
165c0 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
165d0 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
165e0 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
165f0 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
16600 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  &atr_len);..}...
16610 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
16620 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
16630 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61  S) {...cackey_ma
16640 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
16650 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74  ot);....if (stat
16660 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  us_ret == SCARD_
16670 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
16680 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16690 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
166a0 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
166b0 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
166c0 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
166d0 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
166e0 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41  t_card(slot, SCA
166f0 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
16700 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
16710 54 31 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72  T1);....if (scar
16720 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  d_reconn_ret == 
16730 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
16740 20 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74   {...../* Re-est
16750 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69  ablish transacti
16760 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72  on, if it was pr
16770 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20  esent */.....if 
16780 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
16790 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
167a0 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
167b0 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
167c0 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
167d0 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
167e0 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  ock = 1;......ca
167f0 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
16800 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
16810 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
16820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16830 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
16840 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09  requerying");...
16850 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
16860 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
16870 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
16880 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
16890 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
168a0 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
168b0 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73  ;.....if (status
168c0 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
168d0 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09  SUCCESS) {......
168e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
168f0 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c  NTF("Still unabl
16900 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
16910 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
16920 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
16930 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
16940 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
16950 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
16960 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
16970 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  et));.......retu
16980 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
16990 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
169a0 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
169b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
169c0 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
169d0 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f   to reconnect to
169e0 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
169f0 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
16a00 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
16a10 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
16a20 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
16a30 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
16a40 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09  reconn_ret));...
16a50 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
16a60 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
16a70 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65  ENT);....}...} e
16a80 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
16a90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
16aa0 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61  able to query ca
16ab0 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72  rd status, retur
16ac0 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
16ad0 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28  t.  SCardStatus(
16ae0 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
16af0 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
16b00 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75  ERR_TO_STR(statu
16b10 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74  s_ret));.....ret
16b20 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
16b30 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
16b40 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74  ..}..}...if ((st
16b50 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45  ate & SCARD_ABSE
16b60 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53  NT) == SCARD_ABS
16b70 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
16b80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
16b90 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65  rd is absent, re
16ba0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
16bb0 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  sent");....retur
16bc0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
16bd0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d  TOKENABSENT);..}
16be0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16bf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16c00 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e  g token present.
16c10 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
16c20 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
16c30 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a  PRESENT);.}../*.
16c40 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
16c50 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
16c60 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
16c70 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
16c80 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
16c90 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
16ca0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
16cb0 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
16cc0 63 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73  cackey_set_pin(s
16cd0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
16ce0 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
16cf0 64 20 63 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c  d char *old_pin,
16d00 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f   unsigned long o
16d10 6c 64 5f 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69  ld_pin_len, unsi
16d20 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20  gned char *pin, 
16d30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69  unsigned long pi
16d40 6e 5f 6c 65 6e 29 20 7b 0a 09 73 74 72 75 63 74  n_len) {..struct
16d50 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
16d60 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
16d70 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
16d80 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38  d char cac_pin[8
16d90 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c  ] = {0xFF, 0xFF,
16da0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
16db0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
16dc0 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  xFF};..unsigned 
16dd0 63 68 61 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e  char old_cac_pin
16de0 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46  [8] = {0xFF, 0xF
16df0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
16e00 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
16e10 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65   0xFF};..unsigne
16e20 64 20 63 68 61 72 20 70 69 6e 5f 75 70 64 61 74  d char pin_updat
16e30 65 5b 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e  e[sizeof(cac_pin
16e40 29 20 2b 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63  ) + sizeof(old_c
16e50 61 63 5f 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67  ac_pin)];..unsig
16e60 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
16e70 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  ts;..uint16_t re
16e80 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e  sponse_code;..in
16e90 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
16ea0 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  g;..int send_ret
16eb0 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72  ;..int key_refer
16ec0 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f  ence = 0x00;.../
16ed0 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41  * Apparently, CA
16ee0 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43  C PINs are *EXAC
16ef0 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e  TLY* 8 bytes lon
16f00 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78  g -- pad with 0x
16f10 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20  FF if too short 
16f20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
16f30 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
16f40 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38  (cac_pin, pin, 8
16f50 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
16f60 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
16f70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d  in, pin_len);..}
16f80 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c  ...if (old_pin_l
16f90 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d  en >= 8) {...mem
16fa0 63 70 79 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c  cpy(old_cac_pin,
16fb0 20 6f 6c 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d   old_pin, 8);..}
16fc0 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
16fd0 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c  (old_cac_pin, ol
16fe0 64 5f 70 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c  d_pin, old_pin_l
16ff0 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e  en);..}.../* Con
17000 63 61 74 65 6e 61 74 65 20 62 6f 74 68 20 50 49  catenate both PI
17010 4e 73 20 74 6f 67 65 74 68 65 72 20 74 6f 20 73  Ns together to s
17020 65 6e 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  end as a single 
17030 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09  instruction */..
17040 6d 65 6d 63 70 79 28 70 69 6e 5f 75 70 64 61 74  memcpy(pin_updat
17050 65 2c 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20  e, old_cac_pin, 
17060 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70  sizeof(old_cac_p
17070 69 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69  in));..memcpy(pi
17080 6e 5f 75 70 64 61 74 65 20 2b 20 73 69 7a 65 6f  n_update + sizeo
17090 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20  f(old_cac_pin), 
170a0 63 61 63 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28  cac_pin, sizeof(
170b0 63 61 63 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20  cac_pin));.../* 
170c0 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68 69 63  Reject PINs whic
170d0 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72 74 20  h are too short 
170e0 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
170f0 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 5) {...CACKEY_
17100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17110 6a 65 63 74 69 6e 67 20 4e 65 77 20 50 49 4e 20  jecting New PIN 
17120 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f  which is too sho
17130 72 74 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75  rt (length = %lu
17140 2c 20 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73  , must be atleas
17150 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b  t 5)", pin_len);
17160 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
17170 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
17180 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70  ;..}...if (old_p
17190 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09  in_len < 5) {...
171a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
171b0 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 4f  NTF("Rejecting O
171c0 6c 64 20 50 49 4e 20 77 68 69 63 68 20 69 73 20  ld PIN which is 
171d0 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74  too short (lengt
171e0 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65  h = %lu, must be
171f0 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c   atleast 5)", ol
17200 64 5f 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72  d_pin_len);....r
17210 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
17220 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a  C_E_BADPIN);..}.
17230 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e 74  ../* PIV authent
17240 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20 22  ication uses a "
17250 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20 6f  key_reference" o
17260 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f  f 0x80 */..pcsc_
17270 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
17280 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
17290 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  lot, NULL, &num_
172a0 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d  certs);..if (num
172b0 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70 63  _certs > 0 && pc
172c0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
172d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63   NULL) {...switc
172e0 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  h (pcsc_identiti
172f0 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b  es[0].id_type) {
17300 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
17310 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
17320 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17330 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 50 49  INTF("We have PI
17340 56 20 63 61 72 64 2c 20 73 6f 20 77 65 20 77 69  V card, so we wi
17350 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75  ll attempt to au
17360 74 68 65 6e 74 69 63 61 74 65 20 75 73 69 6e 67  thenticate using
17370 20 74 68 65 20 50 49 56 20 41 70 70 6c 69 63 61   the PIV Applica
17380 74 69 6f 6e 20 6b 65 79 20 72 65 66 65 72 65 6e  tion key referen
17390 63 65 22 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72  ce");......key_r
173a0 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b  eference = 0x80;
173b0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64  .....break;....d
173c0 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65 61  efault:.....brea
173d0 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  k;...}....cackey
173e0 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63  _free_certs(pcsc
173f0 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d  _identities, num
17400 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a  _certs, 1);..}..
17410 09 2f 2a 20 49 73 73 75 65 20 61 20 53 65 74 20  ./* Issue a Set 
17420 50 49 4e 20 28 43 48 41 4e 47 45 20 52 45 46 45  PIN (CHANGE REFE
17430 52 45 4e 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f  RENCE) */..send_
17440 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
17450 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
17460 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
17470 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 43 48  , GSCIS_INSTR_CH
17480 41 4e 47 45 5f 52 45 46 45 52 45 4e 43 45 2c 20  ANGE_REFERENCE, 
17490 30 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65  0x00, key_refere
174a0 6e 63 65 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f  nce, sizeof(pin_
174b0 75 70 64 61 74 65 29 2c 20 70 69 6e 5f 75 70 64  update), pin_upd
174c0 61 74 65 2c 20 30 78 30 30 2c 20 26 72 65 73 70  ate, 0x00, &resp
174d0 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c  onse_code, NULL,
174e0 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65   NULL);...if (se
174f0 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
17500 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
17510 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f  if ((response_co
17520 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20  de & 0x63C0) == 
17530 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69  0x63C0) {....tri
17540 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28  es_remaining = (
17550 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
17560 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  0xF);.....CACKEY
17570 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
17580 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
17590 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73  failed, %i tries
175a0 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69   remaining", tri
175b0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a  es_remaining);..
175c0 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
175d0 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
175e0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
175f0 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36  onse_code == 0x6
17600 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  983) {....CACKEY
17610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
17620 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 50 49 4e  nable to set PIN
17630 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b  , device is lock
17640 65 64 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 74  ed or changing t
17650 68 65 20 50 49 4e 20 69 73 20 64 69 73 61 62 6c  he PIN is disabl
17660 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ed");.....return
17670 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c  (CACKEY_PCSC_E_L
17680 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72  OCKED);...}....r
17690 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
176a0 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
176b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
176c0 50 52 49 4e 54 46 28 22 50 49 4e 20 43 68 61 6e  PRINTF("PIN Chan
176d0 67 65 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  ge succeeded");.
176e0 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
176f0 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a  PCSC_S_OK);.../*
17700 20 44 69 73 61 62 6c 65 20 61 20 77 61 72 6e 69   Disable a warni
17710 6e 67 2c 20 73 69 6e 63 65 20 74 68 69 73 20 69  ng, since this i
17720 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 64  s only used in d
17730 65 62 75 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72  ebug mode */..tr
17740 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20  ies_remaining = 
17750 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
17760 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
17770 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
17780 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
17790 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
177a0 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
177b0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
177c0 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
177d0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
177e0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f  ey_ret cackey_lo
177f0 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  gin(struct cacke
17800 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
17810 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e  signed char *pin
17820 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
17830 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72  pin_len, int *tr
17840 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c  ies_remaining_p,
17850 20 69 6e 74 20 72 65 74 72 69 65 73 29 20 7b 0a   int retries) {.
17860 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
17870 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
17880 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  sc_identities;..
17890 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61  unsigned char ca
178a0 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
178b0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
178c0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
178d0 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e  0xFF, 0xFF};..un
178e0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
178f0 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74  certs;..uint16_t
17900 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a   response_code;.
17910 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
17920 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  ning;..int send_
17930 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65  ret;..int key_re
17940 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 2c 20  ference = 0x00, 
17950 68 61 76 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63  have_piv = 0;..c
17960 61 63 6b 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63  ackey_ret connec
17970 74 5f 72 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74  t_ret, token_ret
17980 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20  ;.../* Indicate 
17990 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b  that we do not k
179a0 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61  now about how ma
179b0 6e 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d  ny tries are rem
179c0 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74  aining */..if (t
179d0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
179e0 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d  ) {...*tries_rem
179f0 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09  aining_p = -1;..
17a00 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c  }.../* Apparentl
17a10 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20  y, CAC PINs are 
17a20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65  *EXACTLY* 8 byte
17a30 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69  s long -- pad wi
17a40 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73  th 0xFF if too s
17a50 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
17a60 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d  _len >= 8) {...m
17a70 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
17a80 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20  in, 8);..} else 
17a90 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
17aa0 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e  in, pin, pin_len
17ab0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63  );..}.../* Rejec
17ac0 74 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65  t PINs which are
17ad0 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
17ae0 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20  f (pin_len < 5) 
17af0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17b00 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69  _PRINTF("Rejecti
17b10 6e 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 20  ng PIN which is 
17b20 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74  too short (lengt
17b30 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65  h = %lu, must be
17b40 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69   atleast 5)", pi
17b50 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  n_len);....retur
17b60 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
17b70 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a  BADPIN);..}.../*
17b80 20 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74   PIV authenticat
17b90 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f  ion uses a "key_
17ba0 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78  reference" of 0x
17bb0 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e  80 */..pcsc_iden
17bc0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
17bd0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
17be0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
17bf0 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72  s);..if (num_cer
17c00 74 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69  ts > 0 && pcsc_i
17c10 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
17c20 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70  L) {...switch (p
17c30 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30  csc_identities[0
17c40 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09  ].id_type) {....
17c50 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
17c60 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43  YPE_PIV:.....CAC
17c70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17c80 28 22 57 65 20 68 61 76 65 20 50 49 56 20 63 61  ("We have PIV ca
17c90 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61  rd, so we will a
17ca0 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e  ttempt to authen
17cb0 74 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65  ticate using the
17cc0 20 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e   PIV Application
17cd0 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29   key reference")
17ce0 3b 0a 0a 09 09 09 09 68 61 76 65 5f 70 69 76 20  ;......have_piv 
17cf0 3d 20 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  = 1;.....break;.
17d00 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
17d10 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61  break;...}....ca
17d20 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
17d30 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
17d40 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
17d50 09 7d 0a 0a 09 69 66 20 28 68 61 76 65 5f 70 69  .}...if (have_pi
17d60 76 20 3d 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f  v == 1) {...key_
17d70 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 38 30  reference = 0x80
17d80 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20  ;..}.../* Issue 
17d90 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73  PIN Verify */..s
17da0 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
17db0 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
17dc0 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
17dd0 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
17de0 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20  R_VERIFY, 0x00, 
17df0 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73  key_reference, s
17e00 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20  izeof(cac_pin), 
17e10 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26  cac_pin, 0x00, &
17e20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e  response_code, N
17e30 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66  ULL, NULL);...if
17e40 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
17e50 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
17e60 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73  {...if ((respons
17e70 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29  e_code & 0x63C0)
17e80 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09   == 0x63C0) {...
17e90 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  .tries_remaining
17ea0 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64   = (response_cod
17eb0 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41  e & 0xF);.....CA
17ec0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17ed0 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
17ee0 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74  ion failed, %i t
17ef0 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c  ries remaining",
17f00 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
17f10 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  );.....if (tries
17f20 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
17f30 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  ....*tries_remai
17f40 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72  ning_p = tries_r
17f50 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a  emaining;....}..
17f60 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
17f70 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
17f80 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
17f90 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36  onse_code == 0x6
17fa0 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  983) {....CACKEY
17fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
17fc0 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
17fd0 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69  failed, device i
17fe0 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09  s locked");.....
17ff0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
18000 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  SC_E_LOCKED);...
18010 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
18020 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30  e_code == 0x6d00
18030 29 20 7b 0a 09 09 09 69 66 20 28 72 65 74 72 69  ) {....if (retri
18040 65 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 43 41  es > 0) {.....CA
18050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18060 46 28 22 47 6f 74 20 49 53 4f 20 37 38 31 36 20  F("Got ISO 7816 
18070 52 65 73 70 6f 6e 73 65 20 5c 22 36 44 20 30 30  Response \"6D 00
18080 5c 22 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  \" in response t
18090 6f 20 61 20 56 45 52 49 46 59 20 72 65 71 75 65  o a VERIFY reque
180a0 73 74 2e 22 29 3b 0a 09 09 09 09 43 41 43 4b 45  st.");.....CACKE
180b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
180c0 57 65 20 64 69 64 20 6e 6f 74 20 65 78 70 65 63  We did not expec
180d0 74 20 74 68 69 73 20 62 65 63 61 75 73 65 20 69  t this because i
180e0 74 20 69 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e  t is not mention
180f0 65 64 20 69 6e 20 4e 49 53 54 20 53 50 20 38 30  ed in NIST SP 80
18100 30 2d 37 33 2d 33 20 50 61 72 74 20 32 20 53 65  0-73-3 Part 2 Se
18110 63 74 69 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47  ction 3.2.1 or G
18120 53 43 2d 49 53 20 76 32 2e 31 22 29 3b 0a 09 09  SC-IS v2.1");...
18130 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18140 52 49 4e 54 46 28 22 57 65 20 61 72 65 20 67 6f  RINTF("We are go
18150 69 6e 67 20 74 6f 20 74 72 79 20 74 6f 20 72 65  ing to try to re
18160 73 65 74 20 74 68 65 20 63 61 72 64 20 61 6e 64  set the card and
18170 20 73 65 6c 65 63 74 20 74 68 65 20 61 70 70 6c   select the appl
18180 65 74 20 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09  et again.");....
18190 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
181a0 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e  > 0 && pcsc_iden
181b0 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
181c0 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 64 65  {......cackey_de
181d0 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f  tect_and_select_
181e0 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  root_applet(slot
181f0 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
18200 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 3b 0a 09  s[0].id_type);..
18210 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
18220 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
18230 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 63 6f 6e  (slot);......con
18240 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
18250 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
18260 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28 63 6f  lot);.....if (co
18270 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
18280 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
18290 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
182a0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
182b0 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 61  e to reconnect a
182c0 66 74 65 72 20 72 65 73 65 74 74 69 6e 67 20 74  fter resetting t
182d0 68 65 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  he card, returni
182e0 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
182f0 0a 09 09 09 09 09 72 65 74 75 72 6e 28 63 6f 6e  ......return(con
18300 6e 65 63 74 5f 72 65 74 29 3b 0a 09 09 09 09 7d  nect_ret);.....}
18310 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18320 55 47 5f 50 52 49 4e 54 46 28 22 56 65 72 69 66  UG_PRINTF("Verif
18330 79 69 6e 67 20 77 65 20 73 74 69 6c 6c 20 68 61  ying we still ha
18340 76 65 20 61 20 74 6f 6b 65 6e 2e 22 29 3b 0a 09  ve a token.");..
18350 09 09 09 74 6f 6b 65 6e 5f 72 65 74 20 3d 20 63  ...token_ret = c
18360 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
18370 65 6e 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69  ent(slot);.....i
18380 66 20 28 74 6f 6b 65 6e 5f 72 65 74 20 21 3d 20  f (token_ret != 
18390 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
183a0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
183b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
183c0 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 6e 6f  PRINTF("Token no
183d0 74 20 70 72 65 73 65 6e 74 2c 20 72 65 74 75 72  t present, retur
183e0 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29  ning in error.")
183f0 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 74  ;.......return(t
18400 6f 6b 65 6e 5f 72 65 74 29 3b 0a 09 09 09 09 7d  oken_ret);.....}
18410 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18420 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e  UG_PRINTF("Tryin
18430 67 20 74 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e  g to login again
18440 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
18450 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 6c 6f 74  ackey_login(slot
18460 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 2c 20  , pin, pin_len, 
18470 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
18480 70 2c 20 72 65 74 72 69 65 73 20 2d 20 31 29 29  p, retries - 1))
18490 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
184a0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
184b0 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
184c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
184d0 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
184e0 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65  ication succeede
184f0 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  d");...return(CA
18500 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
18510 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
18520 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
18530 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
18540 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
18550 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
18560 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
18570 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
18580 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
18590 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  e_t cackey_pcsc_
185a0 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
185b0 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  l(struct cackey_
185c0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
185d0 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
185e0 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75  d char *label_bu
185f0 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  f, unsigned long
18600 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20   label_buf_len) 
18610 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
18620 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
18630 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61  ;..void *label_a
18640 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74  sn1;..void *cert
18650 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35  ificate;..int x5
18660 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63  09_read_ret;...c
18670 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65  ertificate = ide
18680 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
18690 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65  te;..certificate
186a0 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  _len = identity-
186b0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
186c0 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63  ;...if (certific
186d0 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09  ate_len < 0) {..
186e0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
186f0 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
18700 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
18710 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
18720 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
18730 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c  (void **) &label
18740 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30  _asn1);..if (x50
18750 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
18760 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
18770 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72  .}...x509_read_r
18780 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
18790 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
187a0 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
187b0 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
187c0 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
187d0 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20  len, "CN");..if 
187e0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
187f0 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65  = 0) {...x509_re
18800 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
18810 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
18820 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
18830 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
18840 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
18850 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a  buf_len, NULL);.
18860 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
18870 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
18880 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
18890 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
188a0 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
188b0 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
188c0 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72  _MAX..if (x509_r
188d0 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58  ead_ret > _POSIX
188e0 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
188f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18900 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72  NTF("x509_read_r
18910 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  et exceeds maxim
18920 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
18930 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
18940 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39  (max = %li, x509
18950 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29  _read_ret = %lu)
18960 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58  ", (long) _POSIX
18970 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73  _SSIZE_MAX, (uns
18980 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39  igned long) x509
18990 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72  _read_ret);....r
189a0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
189b0 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
189c0 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64  return(x509_read
189d0 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  _ret);.}../* Ret
189e0 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
189f0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
18a00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65  cackey_mutex_cre
18a10 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78  ate(void **mutex
18a20 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
18a30 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
18a40 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
18a50 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
18a60 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
18a70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18a80 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
18a90 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
18aa0 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
18ab0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
18ac0 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
18ad0 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
18ae0 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63  d_mutex = malloc
18af0 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64  (sizeof(*pthread
18b00 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28  _mutex));...if (
18b10 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20  !pthread_mutex) 
18b20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
18b30 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
18b40 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
18b50 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  ory.");.....retu
18b60 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70  rn(-1);...}....p
18b70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
18b80 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
18b90 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  it(pthread_mutex
18ba0 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70  , NULL);...if (p
18bb0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
18bc0 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
18bd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
18be0 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
18bf0 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
18c00 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
18c10 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
18c20 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
18c30 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65  ..*mutex = pthre
18c40 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73  ad_mutex;..} els
18c50 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
18c60 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
18c70 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
18c80 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
18c90 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
18ca0 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
18cb0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
18cc0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
18cd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18ce0 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
18cf0 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65  CreateMutex() re
18d00 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
18d10 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
18d20 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
18d30 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
18d40 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
18d50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18d60 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
18d70 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
18d80 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
18d90 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
18da0 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
18db0 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
18dc0 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  _lock(void *mute
18dd0 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
18de0 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
18df0 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
18e00 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
18e10 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
18e20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18e30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
18e40 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
18e50 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
18e60 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
18e70 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
18e80 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
18e90 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
18ea0 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
18eb0 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
18ec0 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64  tex_lock(pthread
18ed0 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70  _mutex);...if (p
18ee0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
18ef0 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
18f00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
18f10 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
18f20 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
18f30 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
18f40 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
18f50 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
18f60 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
18f70 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
18f80 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
18f90 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
18fa0 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
18fb0 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
18fc0 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
18fd0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
18fe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18ff0 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
19000 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74  .LockMutex() ret
19010 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
19020 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
19030 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
19040 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
19050 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
19060 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19070 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
19080 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
19090 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
190a0 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
190b0 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
190c0 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
190d0 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74  unlock(void *mut
190e0 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
190f0 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
19100 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
19110 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
19120 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
19130 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19140 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
19150 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
19160 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
19170 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
19180 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
19190 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
191a0 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65  ead_mutex = mute
191b0 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  x;....pthread_re
191c0 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
191d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72  utex_unlock(pthr
191e0 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66  ead_mutex);...if
191f0 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
19200 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
19210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19220 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  "pthread_mutex_u
19230 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64  nlock() returned
19240 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
19250 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
19260 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
19270 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
19280 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
19290 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09  UnlockMutex) {..
192a0 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
192b0 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  = cackey_args.Un
192c0 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29  lockMutex(mutex)
192d0 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
192e0 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
192f0 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
19300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
19310 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
19320 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
19330 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
19340 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
19350 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
19360 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
19370 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
19380 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
19390 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
193a0 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
193b0 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43  (0);.}..static C
193c0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
193d0 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
193e0 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f  butes(CK_OBJECT_
193f0 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73  CLASS objectclas
19400 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  s, struct cackey
19410 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
19420 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
19430 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79  ed long identity
19440 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  _num, CK_ULONG_P
19450 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
19460 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20  static CK_BBOOL 
19470 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74  ck_true = 1;..st
19480 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
19490 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61  _false = 0;..sta
194a0 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f  tic CK_TRUST ck_
194b0 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55  trusted = CK_TRU
194c0 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a  STED_DELEGATOR;.
194d0 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74  .CK_ULONG numatt
194e0 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63  rs = 0, retval_c
194f0 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42  ount;..CK_ATTRIB
19500 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74  UTE_TYPE curr_at
19510 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54  tr_type;..CK_ATT
19520 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72  RIBUTE curr_attr
19530 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56  , *retval;..CK_V
19540 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a  OID_PTR pValue;.
19550 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75  .CK_ULONG ulValu
19560 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54  eLen;..CK_OBJECT
19570 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74  _CLASS ck_object
19580 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54  _class;..CK_CERT
19590 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f  IFICATE_TYPE ck_
195a0 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
195b0 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63  ;..CK_KEY_TYPE c
195c0 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f  k_key_type;..CK_
195d0 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75  UTF8CHAR ucTmpBu
195e0 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f  f[1024];..SHA1Co
195f0 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a  ntext sha1_ctx;.
19600 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78  .MD5_CTX md5_ctx
19610 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f  ;..uint8_t sha1_
19620 68 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a  hash[SHA1HashSiz
19630 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35  e];..uint8_t md5
19640 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a  _hash[MD5HashSiz
19650 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  e];..unsigned ch
19660 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  ar *certificate;
19670 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66  ..ssize_t certif
19680 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20  icate_len = -1, 
19690 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
196a0 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b  int pValue_free;
196b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
196c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28  PRINTF("Called (
196d0 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c  objectClass = %l
196e0 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20  u, identity_num 
196f0 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
19700 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74  ned long) object
19710 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f  class, identity_
19720 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e  num);...*pulCoun
19730 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a  t = 0;...if (obj
19740 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19750 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
19760 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
19770 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20  O_PUBLIC_KEY && 
19780 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19790 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26  KO_PRIVATE_KEY &
197a0 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
197b0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
197c0 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  UST) {...CACKEY_
197d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
197e0 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
197f0 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
19800 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29  d object class")
19810 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
19820 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43  );..}.../* Get C
19830 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ert */..if (iden
19840 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tity == NULL) {.
19850 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19860 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19870 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
19880 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74  ), invalid ident
19890 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a  iy provided");..
198a0 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
198b0 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  .}...certificate
198c0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
198d0 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
198e0 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
198f0 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
19900 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
19910 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d  rtificate_len ==
19920 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61   -1 || certifica
19930 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
19940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19950 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
19960 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
19970 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64   this identity d
19980 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
19990 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
199a0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
199b0 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f  h it and will no
199c0 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74  t work");....ret
199d0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
199e0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63  /* Verify that c
199f0 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53  ertificate is AS
19a00 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30  N.1 encoded X.50
19a10 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  9 certificate */
19a20 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65  ..if (x509_to_se
19a30 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
19a40 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
19a50 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a  n, NULL) < 0) {.
19a60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19a70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19a80 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
19a90 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72  ), the X.509 cer
19aa0 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
19ab0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64  ted with this id
19ac0 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61  entity is not va
19ad0 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lid");....return
19ae0 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74  (NULL);..}...ret
19af0 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a  val_count = 64;.
19b00 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63  .retval = malloc
19b10 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20  (retval_count * 
19b20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
19b30 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ;...for (curr_at
19b40 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72  tr_type = 0; cur
19b50 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78  r_attr_type < 0x
19b60 63 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61  ce5363bf; curr_a
19b70 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09  ttr_type++) {...
19b80 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  if (curr_attr_ty
19b90 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09  pe == 0x800) {..
19ba0 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ..curr_attr_type
19bb0 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09   = 0xce536300;..
19bc0 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65  .}....pValue_fre
19bd0 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20  e = 0;...pValue 
19be0 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
19bf0 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
19c00 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28   -1;....switch (
19c10 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20  curr_attr_type) 
19c20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c  {....case CKA_CL
19c30 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASS:.....CACKEY_
19c40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19c50 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19c60 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78  te CKA_CLASS (0x
19c70 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
19c80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
19c90 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
19ca0 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  ...ck_object_cla
19cb0 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73  ss = objectclass
19cc0 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
19cd0 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  &ck_object_class
19ce0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
19cf0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a   = sizeof(ck_obj
19d00 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09  ect_class);.....
19d10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19d20 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
19d30 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
19d40 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
19d50 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54  ng) *((CK_OBJECT
19d60 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65  _CLASS *) pValue
19d70 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
19d80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19d90 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19da0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19db0 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45  TOKEN:.....CACKE
19dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19dd0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
19de0 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28  bute CKA_TOKEN (
19df0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19e00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19e10 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
19e20 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
19e30 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
19e40 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
19e50 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
19e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19e70 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
19e80 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
19e90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19ea0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
19eb0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
19ec0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19ed0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
19ee0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
19ef0 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a  se CKA_PRIVATE:.
19f00 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19f10 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19f20 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19f30 41 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38  A_PRIVATE (0x%08
19f40 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
19f50 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
19f60 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
19f70 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
19f80 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
19f90 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
19fa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19fb0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
19fc0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
19fd0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
19fe0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
19ff0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1a000 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1a010 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
1a020 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
1a030 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1a040 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
1a050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a060 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
1a070 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
1a080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a090 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
1a0a0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
1a0b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a0c0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1a0d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1a0e0 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
1a0f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a100 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1a110 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1a120 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78  TRUSTED (0x%08lx
1a130 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1a140 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1a150 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1a160 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1a170 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1a180 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1a190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a1a0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1a1b0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1a1c0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1a1d0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1a1e0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1a1f0 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75  ....}......pValu
1a200 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
1a210 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1a220 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
1a230 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a240 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1a250 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1a260 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1a270 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
1a280 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
1a290 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a2a0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a2b0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a2c0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ....case CKA_MOD
1a2d0 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43  IFIABLE:.....CAC
1a2e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a2f0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1a300 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46  ribute CKA_MODIF
1a310 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20  IABLE (0x%08lx) 
1a320 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1a330 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1a340 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
1a350 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
1a360 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a370 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
1a380 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
1a390 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1a3a0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
1a3b0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
1a3c0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
1a3d0 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
1a3e0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
1a3f0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
1a400 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
1a410 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
1a420 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45  LABEL:.....CACKE
1a430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a440 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1a450 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28  bute CKA_LABEL (
1a460 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1a470 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1a480 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1a490 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  .....if (identit
1a4a0 79 2d 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41  y->id_type == CA
1a4b0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
1a4c0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
1a4d0 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  = identity->card
1a4e0 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09  .piv.label;.....
1a4f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74  .ulValueLen = st
1a500 72 6c 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09  rlen(pValue);...
1a510 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1a520 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70  ulValueLen = snp
1a530 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75  rintf((char *) u
1a540 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28  cTmpBuf, sizeof(
1a550 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e  ucTmpBuf), "Iden
1a560 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73  tity #%lu", (uns
1a570 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
1a580 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09  tity_num);......
1a590 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75  pValue = ucTmpBu
1a5a0 66 3b 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56  f;.......if (ulV
1a5b0 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f  alueLen >= sizeo
1a5c0 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09  f(ucTmpBuf)) {..
1a5d0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1a5e0 3d 20 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75  = 0;.......pValu
1a5f0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
1a600 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
1a610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a620 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1a630 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
1a640 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1a650 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1a660 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1a670 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09  ase CKA_VALUE:..
1a680 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a690 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1a6a0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1a6b0 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29  _VALUE (0x%08lx)
1a6c0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a6d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a6e0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69  _type);......swi
1a6f0 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  tch (objectclass
1a700 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ) {......case CK
1a710 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09  O_PRIVATE_KEY:..
1a720 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a730 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1a740 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1a750 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1a760 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22   a private key."
1a770 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
1a780 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e  ......case CKO_N
1a790 45 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09  ETSCAPE_TRUST:..
1a7a0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a7b0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1a7c0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1a7d0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1a7e0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1a7f0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1a800 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
1a810 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  ase CKO_PUBLIC_K
1a820 45 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65  EY:.......if (ce
1a830 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
1a840 20 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30   0) {........x50
1a850 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
1a860 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74  9_to_pubkey(cert
1a870 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
1a880 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
1a890 65 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78  e);........if (x
1a8a0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
1a8b0 29 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61  ) { .........pVa
1a8c0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1a8d0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1a8e0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1a8f0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
1a900 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d  .......}.......}
1a910 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
1a920 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52  ....case CKO_CER
1a930 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09  TIFICATE:.......
1a940 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69  pValue = certifi
1a950 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61  cate;.......ulVa
1a960 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69  lueLen = certifi
1a970 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09  cate_len;.......
1a980 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1a990 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a9a0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1a9b0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1a9c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a9d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a9e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a9f0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ....case CKA_ISS
1aa00 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  UER:.....CACKEY_
1aa10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1aa20 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1aa30 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30  te CKA_ISSUER (0
1aa40 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1aa50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1aa60 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1aa70 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1aa80 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
1aa90 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74  FICATE && object
1aaa0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
1aab0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1aac0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1aad0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1aae0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1aaf0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1ab00 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
1ab10 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72  e or Netscape tr
1ab20 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1ab30 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1ab40 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
1ab50 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
1ab60 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
1ab70 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69  _ret = x509_to_i
1ab80 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74  ssuer(certificat
1ab90 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
1aba0 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
1abb0 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
1abc0 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
1abd0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1abe0 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
1abf0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1ac00 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
1ac10 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
1ac20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ac30 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
1ac40 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
1ac50 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1ac60 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1ac70 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1ac80 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52  ....case CKA_SER
1ac90 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09  IAL_NUMBER:.....
1aca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1acb0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1acc0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45  attribute CKA_SE
1acd0 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25  RIAL_NUMBER (0x%
1ace0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1acf0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1ad00 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1ad10 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1ad20 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
1ad30 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
1ad40 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
1ad50 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1ad60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ad70 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1ad80 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1ad90 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
1ada0 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  t a certificate 
1adb0 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73  or Netscape trus
1adc0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1add0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1ade0 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
1adf0 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
1ae00 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
1ae10 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72  et = x509_to_ser
1ae20 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
1ae30 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1ae40 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
1ae50 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
1ae60 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
1ae70 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
1ae80 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1ae90 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1aea0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
1aeb0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
1aec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1aed0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1aee0 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
1aef0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1af00 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1af10 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1af20 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ....case CKA_SUB
1af30 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  JECT:.....CACKEY
1af40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1af50 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1af60 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20  ute CKA_SUBJECT 
1af70 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1af80 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1af90 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1afa0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1afb0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
1afc0 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
1afd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1afe0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1aff0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1b000 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
1b010 20 61 20 63 65 72 74 69 66 69 63 61 74 65 22 29   a certificate")
1b020 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1b030 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
1b040 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
1b050 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
1b060 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
1b070 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69  to_subject(certi
1b080 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
1b090 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
1b0a0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
1b0b0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
1b0c0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
1b0d0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
1b0e0 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
1b0f0 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
1b100 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
1b110 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
1b120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1b130 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
1b140 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
1b150 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1b160 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1b170 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1b180 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  A_ID:.....CACKEY
1b190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1b1a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1b1b0 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30  ute CKA_ID (0x%0
1b1c0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1b1d0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1b1e0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1b1f0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1b200 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
1b210 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1b220 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b230 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1b240 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1b250 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
1b260 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1b270 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1b280 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63  k;.....}......uc
1b290 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64  TmpBuf[0] = ((id
1b2a0 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20  entity_num + 1) 
1b2b0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09  >> 8) & 0xff;...
1b2c0 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20  ..ucTmpBuf[1] = 
1b2d0 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b   (identity_num +
1b2e0 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09   1) & 0xff;.....
1b2f0 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70  .pValue = &ucTmp
1b300 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  Buf;.....ulValue
1b310 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41  Len = 2;......CA
1b320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b330 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1b340 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
1b350 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
1b360 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
1b370 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
1b380 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ase CKA_CERTIFIC
1b390 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41  ATE_TYPE:.....CA
1b3a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b3b0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1b3c0 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
1b3d0 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 78  IFICATE_TYPE (0x
1b3e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1b3f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1b400 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1b410 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1b420 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
1b430 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
1b440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b450 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1b460 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1b470 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
1b480 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
1b490 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b4a0 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e  .}....../* We on
1b4b0 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63  ly support one c
1b4c0 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65 20  ertificate type 
1b4d0 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66  */.....ck_certif
1b4e0 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43  icate_type = CKC
1b4f0 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61  _X_509;......pVa
1b500 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66  lue = &ck_certif
1b510 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09  icate_type;.....
1b520 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1b530 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61  eof(ck_certifica
1b540 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  te_type);......C
1b550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b560 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1b570 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c  ng CKC_X_509 (%l
1b580 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
1b590 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
1b5a0 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
1b5b0 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
1b5c0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1b5d0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1b5e0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1b5f0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45  ;....case CKA_KE
1b600 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  Y_TYPE:.....CACK
1b610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b620 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
1b630 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59  ibute CKA_KEY_TY
1b640 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
1b650 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1b660 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1b670 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1b680 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
1b690 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f  PRIVATE_KEY && o
1b6a0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
1b6b0 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a  O_PUBLIC_KEY) {.
1b6c0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b6d0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1b6e0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1b6f0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1b700 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a   not a key.");..
1b710 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1b720 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c  }....../* We onl
1b730 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65  y support one ke
1b740 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  y type */.....ck
1b750 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f  _key_type = CKK_
1b760 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  RSA;......pValue
1b770 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b   = &ck_key_type;
1b780 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1b790 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f  = sizeof(ck_key_
1b7a0 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  type);......CACK
1b7b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b7c0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1b7d0 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25  CKK_RSA (%lu) (%
1b7e0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1b7f0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43  ed long) *((CK_C
1b800 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
1b810 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1b820 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1b830 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1b840 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1b850 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09  case CKA_SIGN:..
1b860 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b870 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
1b880 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
1b890 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20  _SIGN (0x%08lx) 
1b8a0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
1b8b0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
1b8c0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
1b8d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1b8e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1b8f0 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
1b900 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1b910 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
1b920 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
1b930 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
1b940 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
1b950 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1b960 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
1b970 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1b980 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
1b990 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1b9a0 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
1b9b0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1b9c0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
1b9d0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
1b9e0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
1b9f0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1ba00 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1ba10 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
1ba20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ba30 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1ba40 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
1ba50 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ba60 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
1ba70 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
1ba80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1ba90 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
1baa0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
1bab0 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f  se CKA_SIGN_RECO
1bac0 56 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  VER:.....CACKEY_
1bad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1bae0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1baf0 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f  te CKA_SIGN_RECO
1bb00 56 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  VER (0x%08lx) ..
1bb10 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1bb20 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1bb30 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1bb40 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1bb50 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1bb60 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1bb70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1bb80 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1bb90 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1bba0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1bbb0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1bbc0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1bbd0 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72  }....../* We cur
1bbe0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70  rently only supp
1bbf0 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41  ort "Sign with A
1bc00 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09  ppendix" */.....
1bc10 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
1bc20 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
1bc30 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
1bc40 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
1bc50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bc60 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1bc70 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
1bc80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1bc90 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
1bca0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
1bcb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1bcc0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1bcd0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1bce0 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09  CKA_DECRYPT:....
1bcf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bd00 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1bd10 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44   attribute CKA_D
1bd20 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29  ECRYPT (0x%08lx)
1bd30 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1bd40 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1bd50 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1bd60 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
1bd70 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1bd80 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
1bd90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bda0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1bdb0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1bdc0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
1bdd0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
1bde0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
1bdf0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
1be00 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1be10 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20  _PRIVATE_KEY || 
1be20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1be30 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
1be40 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1be50 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
1be60 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
1be70 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
1be80 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
1be90 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1bea0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
1beb0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
1bec0 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
1bed0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bee0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1bef0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
1bf00 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
1bf10 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
1bf20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
1bf30 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
1bf40 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
1bf50 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1bf60 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49  case CKA_SENSITI
1bf70 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  VE:.....CACKEY_D
1bf80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1bf90 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1bfa0 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20  e CKA_SENSITIVE 
1bfb0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1bfc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1bfd0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1bfe0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1bff0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
1c000 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1c010 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c020 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1c030 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1c040 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1c050 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1c060 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1c070 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1c080 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1c090 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
1c0a0 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
1c0b0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
1c0c0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
1c0d0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
1c0e0 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
1c0f0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
1c100 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
1c110 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1c120 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
1c130 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1c140 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1c150 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1c160 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1c170 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1c180 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1c190 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1c1a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1c1b0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1c1c0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1c1d0 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09  _EXTRACTABLE:...
1c1e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c1f0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1c200 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1c210 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78 25  EXTRACTABLE (0x%
1c220 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1c230 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1c240 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1c250 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
1c260 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
1c270 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
1c280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c290 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
1c2a0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
1c2b0 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
1c2c0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1c2d0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1c2e0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
1c2f0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1c300 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
1c310 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
1c320 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
1c330 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1c340 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
1c350 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1c360 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1c370 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
1c380 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1c390 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
1c3a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c3b0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1c3c0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1c3d0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1c3e0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
1c3f0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
1c400 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1c410 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1c420 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1c430 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ....case CKA_MOD
1c440 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59  ULUS:.....CACKEY
1c450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1c460 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1c470 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20  ute CKA_MODULUS 
1c480 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1c490 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c4a0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1c4b0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1c4c0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
1c4d0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1c4e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c4f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1c500 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1c510 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1c520 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1c530 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1c540 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1c550 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
1c560 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
1c570 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
1c580 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75  t = x509_to_modu
1c590 6c 75 73 28 63 65 72 74 69 66 69 63 61 74 65 2c  lus(certificate,
1c5a0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1c5b0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
1c5c0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
1c5d0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
1c5e0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
1c5f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1c600 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1c610 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
1c620 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
1c630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c640 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
1c650 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
1c660 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1c670 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1c680 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1c690 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42  ....case CKA_PUB
1c6a0 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09  LIC_EXPONENT:...
1c6b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c6c0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
1c6d0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
1c6e0 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20  PUBLIC_EXPONENT 
1c6f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1c700 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c710 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1c720 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1c730 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
1c740 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
1c750 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c760 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
1c770 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
1c780 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
1c790 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
1c7a0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1c7b0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1c7c0 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
1c7d0 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
1c7e0 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
1c7f0 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f  t = x509_to_expo
1c800 6e 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 65  nent(certificate
1c810 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
1c820 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
1c830 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
1c840 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
1c850 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
1c860 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1c870 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1c880 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
1c890 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
1c8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c8b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1c8c0 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
1c8d0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1c8e0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1c8f0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1c900 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  ;....case CKA_TR
1c910 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e  UST_DIGITAL_SIGN
1c920 41 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43  ATURE:....case C
1c930 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50  KA_TRUST_NON_REP
1c940 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73  UDIATION:....cas
1c950 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
1c960 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09  ENCIPHERMENT:...
1c970 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1c980 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e  DATA_ENCIPHERMEN
1c990 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  T:....case CKA_T
1c9a0 52 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45  RUST_KEY_AGREEME
1c9b0 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
1c9c0 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53  TRUST_KEY_CERT_S
1c9d0 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  IGN:....case CKA
1c9e0 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a  _TRUST_CRL_SIGN:
1c9f0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1ca00 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a  ST_SERVER_AUTH:.
1ca10 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1ca20 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09  T_CLIENT_AUTH:..
1ca30 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1ca40 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09  _CODE_SIGNING:..
1ca50 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1ca60 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f  _EMAIL_PROTECTIO
1ca70 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
1ca80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1ca90 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1caa0 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28   CKA_TRUST_... (
1cab0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
1cac0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1cad0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
1cae0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
1caf0 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75  k_trusted;.....u
1cb00 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1cb10 6f 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a  of(ck_trusted);.
1cb20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1cb30 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1cb40 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1cb50 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1cb60 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52  d long) *((CK_TR
1cb70 55 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  UST *) pValue), 
1cb80 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1cb90 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1cba0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1cbb0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
1cbc0 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09  T_SHA1_HASH:....
1cbd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cbe0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1cbf0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
1cc00 45 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30  ERT_SHA1_HASH (0
1cc10 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
1cc20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1cc30 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
1cc40 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
1cc50 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
1cc60 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
1cc70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cc80 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1cc90 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1cca0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
1ccb0 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  t a Netscape tru
1ccc0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
1ccd0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1cce0 0a 09 09 09 09 53 48 41 31 52 65 73 65 74 28 26  .....SHA1Reset(&
1ccf0 73 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53  sha1_ctx);.....S
1cd00 48 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63  HA1Input(&sha1_c
1cd10 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c  tx, certificate,
1cd20 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
1cd30 29 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c  );.....SHA1Resul
1cd40 74 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61  t(&sha1_ctx, sha
1cd50 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56  1_hash);......pV
1cd60 61 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68  alue = sha1_hash
1cd70 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1cd80 20 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68   = sizeof(sha1_h
1cd90 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ash);......CACKE
1cda0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cdb0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1cdc0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
1cdd0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1cde0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1cdf0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1ce00 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41   CKA_CERT_MD5_HA
1ce10 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SH:.....CACKEY_D
1ce20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1ce30 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1ce40 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48  e CKA_CERT_MD5_H
1ce50 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASH (0x%08lx) ..
1ce60 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1ce70 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1ce80 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1ce90 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
1cea0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1ceb0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1cec0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1ced0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1cee0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1cef0 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61  are not a Netsca
1cf00 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1cf10 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1cf20 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e  ....}......MD5In
1cf30 69 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09  it(&md5_ctx);...
1cf40 09 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35  ..MD5Update(&md5
1cf50 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74  _ctx, certificat
1cf60 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
1cf70 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61  en);.....MD5Fina
1cf80 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35  l(md5_hash, &md5
1cf90 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c  _ctx);......pVal
1cfa0 75 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09  ue = md5_hash;..
1cfb0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1cfc0 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29  sizeof(md5_hash)
1cfd0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
1cfe0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1cff0 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
1d000 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
1d010 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1d020 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1d030 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  eak;....default:
1d040 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
1d050 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  LL;.....ulValueL
1d060 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
1d070 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
1d080 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f  }....if (((CK_LO
1d090 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20  NG) ulValueLen) 
1d0a0 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  != ((CK_LONG) -1
1d0b0 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20  )) {..../* Push 
1d0c0 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74  curr_attr onto t
1d0d0 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63  he stack */....c
1d0e0 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20  urr_attr.type = 
1d0f0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a  curr_attr_type;.
1d100 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  ...curr_attr.ulV
1d110 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
1d120 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61  eLen;.....curr_a
1d130 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  ttr.pValue = mal
1d140 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c  loc(curr_attr.ul
1d150 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65  ValueLen);....me
1d160 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70  mcpy(curr_attr.p
1d170 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63  Value, pValue, c
1d180 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
1d190 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56  Len);.....if (pV
1d1a0 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61  alue_free && pVa
1d1b0 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28  lue) {.....free(
1d1c0 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09  pValue);....}...
1d1d0 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e  ..if (numattrs >
1d1e0 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20  = retval_count) 
1d1f0 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72  {.....retval = r
1d200 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72  ealloc(retval, r
1d210 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
1d220 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
1d230 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
1d240 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73  &retval[numattrs
1d250 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73  ], &curr_attr, s
1d260 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29  izeof(curr_attr)
1d270 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b  );....numattrs++
1d280 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e  ;...}..}...if (n
1d290 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a  umattrs != 0) {.
1d2a0 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d  ..retval_count =
1d2b0 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74   numattrs;...ret
1d2c0 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
1d2d0 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
1d2e0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
1d2f0 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  val));..} else {
1d300 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b  ...free(retval);
1d310 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c  ....retval = NUL
1d320 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e  L;..}...*pulCoun
1d330 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09  t = numattrs;...
1d340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d350 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
1d360 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e  lu objects (%p).
1d370 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f  ", numattrs, (vo
1d380 69 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a  id *) retval);..
1d390 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1d3a0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1d3b0 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
1d3c0 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
1d3d0 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
1d3e0 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67  dentities, unsig
1d3f0 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
1d400 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b  ies_count) {..CK
1d410 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
1d420 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _attr;..unsigned
1d430 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74   long id_idx, at
1d440 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64  tr_idx;...if (id
1d450 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
1d460 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63   || identities_c
1d470 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72  ount == 0) {...r
1d480 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
1d490 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f  (id_idx = 0; id_
1d4a0 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73  idx < identities
1d4b0 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b  _count; id_idx++
1d4c0 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
1d4d0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1d4e0 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f  ributes) {....fo
1d4f0 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  r (attr_idx = 0;
1d500 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e   attr_idx < iden
1d510 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1d520 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
1d530 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
1d540 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26  ...curr_attr = &
1d550 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1d560 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74  x].attributes[at
1d570 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66  tr_idx];......if
1d580 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61   (curr_attr->pVa
1d590 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65  lue) {......free
1d5a0 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
1d5b0 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ue);.....}....}.
1d5c0 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  ....if (identiti
1d5d0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1d5e0 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65  butes) {.....fre
1d5f0 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  e(identities[id_
1d600 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
1d610 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
1d620 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64 65  y_free_certs(ide
1d630 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1d640 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31  pcsc_identity, 1
1d650 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66  , 1);...}..}...f
1d660 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b  ree(identities);
1d670 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .}..static unsig
1d680 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f  ned long cackey_
1d690 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1d6a0 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
1d6b0 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1d6c0 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64  tities, unsigned
1d6d0 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65   long num_dod_ce
1d6e0 72 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  rts) {..unsigned
1d6f0 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20   long cert_idx, 
1d700 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66  id_idx = 0;...if
1d710 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20   (identities == 
1d720 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
1d730 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a  (num_dod_certs *
1d740 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63   3);..}...for (c
1d750 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
1d760 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f  t_idx < num_dod_
1d770 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b  certs; cert_idx+
1d780 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65  +) {...identitie
1d790 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1d7a0 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
1d7b0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1d7c0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
1d7d0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
1d7e0 72 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54  ributes(CKO_CERT
1d7f0 49 46 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f  IFICATE, &extra_
1d800 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1d810 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1d820 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1d830 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1d840 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1d850 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69  idx++;....identi
1d860 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1d870 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
1d880 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
1d890 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1d8a0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
1d8b0 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50  attributes(CKO_P
1d8c0 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72  UBLIC_KEY, &extr
1d8d0 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78  a_certs[cert_idx
1d8e0 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74  ], 0xf000 | cert
1d8f0 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
1d900 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1d910 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69  utes_count);...i
1d920 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e  d_idx++;....iden
1d930 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1d940 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e  csc_identity = N
1d950 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65  ULL;...identitie
1d960 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1d970 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
1d980 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f  t_attributes(CKO
1d990 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c  _NETSCAPE_TRUST,
1d9a0 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1d9b0 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1d9c0 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1d9d0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1d9e0 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1d9f0 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09  );...id_idx++;..
1da00 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64  }...return(id_id
1da10 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  x);.}..static st
1da20 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
1da30 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61  tity *cackey_rea
1da40 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  d_identities(str
1da50 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
1da60 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
1da70 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29  long *ids_found)
1da80 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
1da90 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
1daa0 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
1dab0 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
1dac0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
1dad0 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
1dae0 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69   long num_ids, i
1daf0 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74  d_idx, curr_id_t
1db00 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ype;..unsigned l
1db10 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e  ong num_certs, n
1db20 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65  um_dod_certs, ce
1db30 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63  rt_idx;..int inc
1db40 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1db50 20 3d 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f   = 0, include_do
1db60 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45  d_certs;...CACKE
1db70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1db80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1db90 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55  (ids_found == NU
1dba0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1dbb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1dbc0 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69  or.  ids_found i
1dbd0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
1dbe0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23  urn(NULL);..}..#
1dbf0 69 66 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52  ifdef CACKEY_CAR
1dc00 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45  D_SLOT_INCLUDE_E
1dc10 58 54 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c  XTRA_CERTS..incl
1dc20 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1dc30 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66  = 1;.#endif...if
1dc40 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1dc50 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57  _DOD_CERTS_ON_HW
1dc60 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _SLOTS") != NULL
1dc70 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78  ) {...include_ex
1dc80 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  tra_certs = 1;..
1dc90 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
1dca0 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45  CACKEY_NO_DOD_CE
1dcb0 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22  RTS_ON_HW_SLOTS"
1dcc0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  ) != NULL) {...i
1dcd0 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
1dce0 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64  ts = 0;..}..#ifd
1dcf0 65 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54  ef CACKEY_NO_EXT
1dd00 52 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65  RA_CERTS..if (ge
1dd10 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54  tenv("CACKEY_EXT
1dd20 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55  RA_CERTS") != NU
1dd30 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  LL) {...include_
1dd40 64 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09  dod_certs = 1;..
1dd50 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75  } else {...inclu
1dd60 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30  de_dod_certs = 0
1dd70 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28  ;..}.#else..if (
1dd80 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
1dd90 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20  O_EXTRA_CERTS") 
1dda0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1ddb0 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1ddc0 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   0;..} else {...
1ddd0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1dde0 73 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66  s = 1;..}.#endif
1ddf0 0a 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64  ...if (include_d
1de00 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e 75  od_certs) {...nu
1de10 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69  m_dod_certs = si
1de20 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73  zeof(extra_certs
1de30 29 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61  ) / sizeof(extra
1de40 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65  _certs[0]);..} e
1de50 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f  lse {...num_dod_
1de60 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  certs = 0;..}...
1de70 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e  if (slot->intern
1de80 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20  al) {...num_ids 
1de90 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  = cackey_read_do
1dea0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c  d_identities(NUL
1deb0 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  L, num_dod_certs
1dec0 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64  );....if (num_id
1ded0 73 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65  s != 0) {....ide
1dee0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
1def0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
1df00 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
1df10 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64  .....cackey_read
1df20 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
1df30 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
1df40 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20  dod_certs);...} 
1df50 65 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69  else {....identi
1df60 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  ties = NULL;...}
1df70 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
1df80 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74   num_ids;....ret
1df90 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b  urn(identities);
1dfa0 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74  ..}...pcsc_ident
1dfb0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
1dfc0 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
1dfd0 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
1dfe0 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65  );..if (pcsc_ide
1dff0 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
1e000 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20   {.../* Convert 
1e010 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20  number of Certs 
1e020 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  to number of obj
1e030 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64  ects */...num_id
1e040 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45  s = (CKO_PRIVATE
1e050 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49  _KEY - CKO_CERTI
1e060 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75  FICATE + 1) * nu
1e070 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28  m_certs;....if (
1e080 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1e090 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64  rts) {....num_id
1e0a0 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  s += cackey_read
1e0b0 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28  _dod_identities(
1e0c0 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  NULL, num_dod_ce
1e0d0 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65  rts);...}....ide
1e0e0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
1e0f0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
1e100 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
1e110 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69  ..../* Add certi
1e120 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20  ficates, public 
1e130 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74  keys, and privat
1e140 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20  e keys from the 
1e150 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69  smartcard */...i
1e160 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72  d_idx = 0;...for
1e170 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20   (cert_idx = 0; 
1e180 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63  cert_idx < num_c
1e190 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b  erts; cert_idx++
1e1a0 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72  ) {....for (curr
1e1b0 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43  _id_type = CKO_C
1e1c0 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 72  ERTIFICATE; curr
1e1d0 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f  _id_type <= CKO_
1e1e0 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72  PRIVATE_KEY; cur
1e1f0 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09  r_id_type++) {..
1e200 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1e210 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1e220 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1e230 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69 64  tributes(curr_id
1e240 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65  _type, &pcsc_ide
1e250 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1e260 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64  ], cert_idx, &id
1e270 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1e280 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
1e290 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74  t);......identit
1e2a0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1e2b0 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  _identity = mall
1e2c0 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  oc(sizeof(*ident
1e2d0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1e2e0 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09  sc_identity));..
1e2f0 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69  ...memcpy(identi
1e300 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1e310 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73  c_identity, &pcs
1e320 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1e330 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a  t_idx], sizeof(*
1e340 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1e350 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1e360 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74  ));......identit
1e370 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1e380 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
1e390 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
1e3a0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1e3b0 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66  cert_idx].certif
1e3c0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
1e3d0 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65  memcpy(identitie
1e3e0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1e3f0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
1e400 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74  cate, pcsc_ident
1e410 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e  ities[cert_idx].
1e420 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73  certificate, pcs
1e430 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1e440 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
1e450 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64  te_len);......id
1e460 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d  _idx++;....}...}
1e470 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  ....if (include_
1e480 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09  extra_certs) {..
1e490 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e4a0 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67  RINTF("Including
1e4b0 20 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43   US Government C
1e4c0 65 72 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68  ertificates on h
1e4d0 61 72 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a  ardware slot");.
1e4e0 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f  ....cackey_read_
1e4f0 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69  dod_identities(i
1e500 64 65 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69  dentities + id_i
1e510 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  dx, num_dod_cert
1e520 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  s);...}....cacke
1e530 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
1e540 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
1e550 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09  m_certs, 1);....
1e560 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d  *ids_found = num
1e570 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _ids;....return(
1e580 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a  identities);..}.
1e590 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30  ..*ids_found = 0
1e5a0 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ;..return(NULL);
1e5b0 0a 7d 0a 0a 73 74 61 74 69 63 20 63 61 63 6b 65  .}..static cacke
1e5c0 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 67 65 74  y_ret cackey_get
1e5d0 5f 70 69 6e 28 63 68 61 72 20 2a 70 69 6e 62 75  _pin(char *pinbu
1e5e0 66 29 20 7b 0a 09 46 49 4c 45 20 2a 70 69 6e 66  f) {..FILE *pinf
1e5f0 64 3b 0a 09 63 68 61 72 20 2a 66 67 65 74 73 5f  d;..char *fgets_
1e600 72 65 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 65  ret;..int pclose
1e610 5f 72 65 74 3b 0a 0a 09 69 66 20 28 63 61 63 6b  _ret;...if (cack
1e620 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1e630 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1e640 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
1e650 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
1e660 69 66 20 28 70 69 6e 62 75 66 20 3d 3d 20 4e 55  if (pinbuf == NU
1e670 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43  LL) {...return(C
1e680 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
1e690 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
1e6a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e6b0 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1e6c0 41 4e 44 20 3d 20 25 73 22 2c 20 63 61 63 6b 65  AND = %s", cacke
1e6d0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a  y_pin_command);.
1e6e0 0a 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e 28  ..pinfd = popen(
1e6f0 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1e700 6e 64 2c 20 22 72 22 29 3b 0a 09 69 66 20 28 70  nd, "r");..if (p
1e710 69 6e 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  infd == NULL) {.
1e720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e730 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25  RINTF("Error.  %
1e740 73 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75 6e  s: Unable to run
1e750 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ", cackey_pin_co
1e760 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72  mmand);....retur
1e770 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
1e780 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66 67  BADPIN);..}...fg
1e790 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28  ets_ret = fgets(
1e7a0 70 69 6e 62 75 66 2c 20 33 32 2c 20 70 69 6e 66  pinbuf, 32, pinf
1e7b0 64 29 3b 0a 09 69 66 20 28 66 67 65 74 73 5f 72  d);..if (fgets_r
1e7c0 65 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  et == NULL) {...
1e7d0 70 69 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27  pinbuf[0] = '\0'
1e7e0 3b 0a 09 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72 65  ;..}...pclose_re
1e7f0 74 20 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66 64  t = pclose(pinfd
1e800 29 3b 0a 09 69 66 20 28 70 63 6c 6f 73 65 5f 72  );..if (pclose_r
1e810 65 74 20 3d 3d 20 2d 31 20 26 26 20 65 72 72 6e  et == -1 && errn
1e820 6f 20 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a 09  o == ECHILD) {..
1e830 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e840 49 4e 54 46 28 22 4e 6f 74 69 63 65 2e 20 20 70  INTF("Notice.  p
1e850 63 6c 6f 73 65 28 29 20 69 6e 64 69 63 61 74 65  close() indicate
1e860 64 20 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 67  d it could not g
1e870 65 74 20 74 68 65 20 73 74 61 74 75 73 20 6f 66  et the status of
1e880 20 74 68 65 20 63 68 69 6c 64 2c 20 61 73 73 75   the child, assu
1e890 6d 69 6e 67 20 69 74 20 73 75 63 63 65 65 65 64  ming it succeeed
1e8a0 65 64 20 21 22 29 3b 0a 0a 09 09 70 63 6c 6f 73  ed !");....pclos
1e8b0 65 5f 72 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  e_ret = 0;..}...
1e8c0 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 21  if (pclose_ret !
1e8d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e8e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e8f0 72 6f 72 2e 20 20 25 73 3a 20 65 78 69 74 65 64  ror.  %s: exited
1e900 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73   with non-zero s
1e910 74 61 74 75 73 20 6f 66 20 25 69 22 2c 20 63 61  tatus of %i", ca
1e920 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1e930 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a 0a  , pclose_ret);..
1e940 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
1e950 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
1e960 09 7d 0a 0a 09 69 66 20 28 73 74 72 6c 65 6e 28  .}...if (strlen(
1e970 70 69 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a 09  pinbuf) < 1) {..
1e980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e990 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73  INTF("Error.  %s
1e9a0 3a 20 72 65 74 75 72 6e 65 64 20 6e 6f 20 64 61  : returned no da
1e9b0 74 61 22 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f  ta", cackey_pin_
1e9c0 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74  command);....ret
1e9d0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
1e9e0 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09  E_BADPIN);..}...
1e9f0 69 66 20 28 70 69 6e 62 75 66 5b 73 74 72 6c 65  if (pinbuf[strle
1ea00 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d  n(pinbuf) - 1] =
1ea10 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 70 69 6e 62  = '\n') {...pinb
1ea20 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66  uf[strlen(pinbuf
1ea30 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09  ) - 1] = '\0';..
1ea40 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  }...return(CACKE
1ea50 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
1ea60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1ea70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
1ea80 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  tialize)(CK_VOID
1ea90 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20  _PTR pInitArgs) 
1eaa0 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  {..CK_C_INITIALI
1eab0 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61  ZE_ARGS CK_PTR a
1eac0 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69  rgs;..uint32_t i
1ead0 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  dx, highest_slot
1eae0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
1eaf0 74 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c  t_ret;..int incl
1eb00 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a  ude_dod_certs;..
1eb10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eb20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1eb30 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e  ...if (cackey_in
1eb40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1eb50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eb60 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65  TF("Error.  Alre
1eb70 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  ady initialized.
1eb80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1eb90 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41  R_CRYPTOKI_ALREA
1eba0 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  DY_INITIALIZED);
1ebb0 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41  ..}...if (pInitA
1ebc0 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rgs != NULL) {..
1ebd0 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67  .args = pInitArg
1ebe0 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63  s;...memcpy(&cac
1ebf0 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20  key_args, args, 
1ec00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72  sizeof(cackey_ar
1ec10 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67  gs));....if (arg
1ec20 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  s->CreateMutex =
1ec30 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1ec40 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20  DestroyMutex == 
1ec50 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f  NULL || args->Lo
1ec60 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  ckMutex == NULL 
1ec70 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d  || args->UnlockM
1ec80 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  utex == NULL) {.
1ec90 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
1eca0 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ateMutex != NULL
1ecb0 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
1ecc0 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  yMutex != NULL |
1ecd0 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
1ece0 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1ecf0 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21  s->UnlockMutex !
1ed00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
1ed10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ed20 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20  F("Error. Some, 
1ed30 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65  but not All thre
1ed40 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  ading primitives
1ed50 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09   provided.");...
1ed60 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1ed70 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
1ed80 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  .}...}..} else {
1ed90 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  ...cackey_args.C
1eda0 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c  reateMutex = NUL
1edb0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1edc0 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20  .DestroyMutex = 
1edd0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1ede0 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20  rgs.LockMutex = 
1edf0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1ee00 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  rgs.UnlockMutex 
1ee10 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1ee20 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b  _args.flags = 0;
1ee30 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1ee40 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
1ee50 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1ee60 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1ee70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1ee80 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63  ; idx++) {...cac
1ee90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1eea0 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  ].active = 0;..}
1eeb0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1eec0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1eed0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1eee0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1eef0 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
1ef00 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  {...cackey_slots
1ef10 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30  [idx].active = 0
1ef20 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1ef30 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
1ef40 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  r = NULL;...cack
1ef50 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
1ef60 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
1ef70 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1ef80 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
1ef90 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
1efa0 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  k = 0;...cackey_
1efb0 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
1efc0 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63  reset = 0;...cac
1efd0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
1efe0 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
1eff0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1f000 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  dx].label = NULL
1f010 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1f020 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  [idx].internal =
1f030 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1f040 74 73 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 5f  ts[idx].id_type_
1f050 68 69 6e 74 20 3d 20 43 41 43 4b 45 59 5f 49 44  hint = CACKEY_ID
1f060 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09  _TYPE_UNKNOWN;..
1f070 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
1f080 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a  _NO_EXTRA_CERTS.
1f090 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1f0a0 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22  KEY_EXTRA_CERTS"
1f0b0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  ) != NULL) {...i
1f0c0 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1f0d0 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 1;..} else {.
1f0e0 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1f0f0 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73  rts = 0;..}.#els
1f100 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  e..if (getenv("C
1f110 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1f120 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1f130 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1f140 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c  certs = 0;..} el
1f150 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1f160 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d  od_certs = 1;..}
1f170 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e  .#endif...if (in
1f180 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1f190 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1f1a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
1f1b0 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c  sked not to incl
1f1c0 75 64 65 20 44 6f 44 20 63 65 72 74 69 66 69 63  ude DoD certific
1f1d0 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20  ates");..} else 
1f1e0 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74  {...highest_slot
1f1f0 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   = (sizeof(cacke
1f200 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1f210 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1f220 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b  ])) - 1;....CACK
1f230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f240 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63  "Including DoD c
1f250 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75  erts in slot %lu
1f260 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1f270 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29  g) highest_slot)
1f280 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  ;....cackey_slot
1f290 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1f2a0 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61  active = 1;...ca
1f2b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1f2c0 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  st_slot].interna
1f2d0 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f  l = 1;...cackey_
1f2e0 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1f2f0 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73  ot].label = (uns
1f300 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55  igned char *) "U
1f310 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72  S Government Cer
1f320 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61  tificates";...ca
1f330 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1f340 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  st_slot].pcsc_re
1f350 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b  ader = "CACKey";
1f360 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f370 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f  highest_slot].to
1f380 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
1f390 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69  }...cackey_initi
1f3a0 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66  alized = 1;...if
1f3b0 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63   (!cackey_bigloc
1f3c0 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65  k_init) {...mute
1f3d0 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63  x_init_ret = cac
1f3e0 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65  key_mutex_create
1f3f0 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  (&cackey_biglock
1f400 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
1f410 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b  init_ret != 0) {
1f420 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1f430 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f440 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a   Mutex initializ
1f450 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b  ation failed.");
1f460 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1f470 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a  CANT_LOCK);...}.
1f480 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ...cackey_bigloc
1f490 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a  k_init = 1;..}..
1f4a0 09 2f 2a 20 44 65 66 69 6e 65 20 61 20 63 6f 6d  ./* Define a com
1f4b0 6d 61 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20 75  mand to prompt u
1f4c0 73 65 72 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f  ser for a PIN */
1f4d0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
1f4e0 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
1f4f0 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63  LT..cackey_pin_c
1f500 6f 6d 6d 61 6e 64 20 3d 20 73 74 72 64 75 70 28  ommand = strdup(
1f510 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46  CACKEY_MACRO_DEF
1f520 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59  AULT_XSTR(CACKEY
1f530 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46  _PIN_COMMAND_DEF
1f540 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  AULT));.#endif..
1f550 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49  #ifdef CACKEY_PI
1f560 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f  N_COMMAND_XONLY_
1f570 44 45 46 41 55 4c 54 0a 09 69 66 20 28 67 65 74  DEFAULT..if (get
1f580 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20 21  env("DISPLAY") !
1f590 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
1f5a0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1f5b0 20 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d   strdup(CACKEY_M
1f5c0 41 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54  ACRO_DEFAULT_XST
1f5d0 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  R(CACKEY_PIN_COM
1f5e0 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55  MAND_XONLY_DEFAU
1f5f0 4c 54 29 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  LT));..}.#endif.
1f600 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1f610 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1f620 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1f630 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1f640 6e 64 20 3d 20 73 74 72 64 75 70 28 67 65 74 65  nd = strdup(gete
1f650 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43  nv("CACKEY_PIN_C
1f660 4f 4d 4d 41 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09  OMMAND"));..}...
1f670 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1f680 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58  EY_PIN_COMMAND_X
1f690 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20 26  ONLY") != NULL &
1f6a0 26 20 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41  & getenv("DISPLA
1f6b0 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Y") != NULL) {..
1f6c0 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1f6d0 61 6e 64 20 3d 20 73 74 72 64 75 70 28 67 65 74  and = strdup(get
1f6e0 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f  env("CACKEY_PIN_
1f6f0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 29  COMMAND_XONLY"))
1f700 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
1f710 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c  KEY_READERS_INCL
1f720 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  UDE_ONLY_DEFAULT
1f730 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  ..cackey_readers
1f740 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20  _include_only = 
1f750 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41  strdup(CACKEY_MA
1f760 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52  CRO_DEFAULT_XSTR
1f770 28 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f  (CACKEY_READERS_
1f780 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 5f 44 45 46  INCLUDE_ONLY_DEF
1f790 41 55 4c 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  AULT));.#endif..
1f7a0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 52 45  #ifdef CACKEY_RE
1f7b0 41 44 45 52 53 5f 45 58 43 4c 55 44 45 5f 44 45  ADERS_EXCLUDE_DE
1f7c0 46 41 55 4c 54 0a 09 63 61 63 6b 65 79 5f 72 65  FAULT..cackey_re
1f7d0 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20  aders_exclude = 
1f7e0 73 74 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41  strdup(CACKEY_MA
1f7f0 43 52 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52  CRO_DEFAULT_XSTR
1f800 28 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f  (CACKEY_READERS_
1f810 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c 54 29  EXCLUDE_DEFAULT)
1f820 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  );.#endif...if (
1f830 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 52  getenv("CACKEY_R
1f840 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f 4f  EADERS_INCLUDE_O
1f850 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  NLY") != NULL) {
1f860 0a 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ...cackey_reader
1f870 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d  s_include_only =
1f880 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28 22   strdup(getenv("
1f890 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 49  CACKEY_READERS_I
1f8a0 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a  NCLUDE_ONLY"));.
1f8b0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65  ...if (cackey_re
1f8c0 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1f8d0 6c 79 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b  ly[0] == '\0') {
1f8e0 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
1f8f0 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f  readers_include_
1f900 6f 6e 6c 79 29 3b 0a 0a 09 09 09 63 61 63 6b 65  only);.....cacke
1f910 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
1f920 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09  e_only = NULL;..
1f930 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  .}..}...if (gete
1f940 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45  nv("CACKEY_READE
1f950 52 53 5f 45 58 43 4c 55 44 45 22 29 20 21 3d 20  RS_EXCLUDE") != 
1f960 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1f970 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1f980 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76   = strdup(getenv
1f990 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53  ("CACKEY_READERS
1f9a0 5f 45 58 43 4c 55 44 45 22 29 29 3b 0a 0a 09 09  _EXCLUDE"));....
1f9b0 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65  if (cackey_reade
1f9c0 72 73 5f 65 78 63 6c 75 64 65 5b 30 5d 20 3d 3d  rs_exclude[0] ==
1f9d0 20 27 5c 30 27 29 20 7b 0a 09 09 09 66 72 65 65   '\0') {....free
1f9e0 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  (cackey_readers_
1f9f0 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09 63 61  exclude);.....ca
1fa00 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
1fa10 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  lude = NULL;...}
1fa20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1fa30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1fa40 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1fa50 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1fa60 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1fa70 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1fa80 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
1fa90 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
1faa0 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a  TR pReserved) {.
1fab0 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a  .uint32_t idx;..
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 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1fae0 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64  ...if (pReserved
1faf0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1fb00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fb10 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72  F("Error. pReser
1fb20 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ved is not NULL.
1fb30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fb40 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1fb50 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1fb60 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1fb70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fb80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fb90 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1fba0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fbb0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1fbc0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1fbd0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1fbe0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1fbf0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1fc00 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1fc10 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
1fc20 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
1fc30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1fc40 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
1fc50 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69  C_CloseSession(i
1fc60 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  dx);...}..}...ca
1fc70 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
1fc80 6e 6e 65 63 74 5f 61 6c 6c 28 31 29 3b 0a 0a 09  nnect_all(1);...
1fc90 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1fca0 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1fcb0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1fcc0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1fcd0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
1fce0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1fcf0 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29  s[idx].internal)
1fd00 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a   {....continue;.
1fd10 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
1fd20 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63  y_slots[idx].cac
1fd30 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  hed_certs) {....
1fd40 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1fd50 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  s(cackey_slots[i
1fd60 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1fd70 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  , cackey_slots[i
1fd80 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1fd90 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09  _count, 1);.....
1fda0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1fdb0 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d  ].cached_certs =
1fdc0 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   NULL;...}..}...
1fdd0 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1fde0 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 69 66 20 28  onnect();...if (
1fdf0 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1fe00 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
1fe10 66 72 65 65 28 63 61 63 6b 65 79 5f 70 69 6e 5f  free(cackey_pin_
1fe20 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 09 63 61 63  command);....cac
1fe30 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1fe40 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20  = NULL;..}...if 
1fe50 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f  (cackey_readers_
1fe60 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d 20  include_only != 
1fe70 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65 28 63  NULL) {...free(c
1fe80 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
1fe90 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09  clude_only);....
1fea0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
1feb0 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55  nclude_only = NU
1fec0 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  LL;..}...if (cac
1fed0 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1fee0 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ude != NULL) {..
1fef0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61  .free(cackey_rea
1ff00 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a  ders_exclude);..
1ff10 09 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  ..cackey_readers
1ff20 5f 65 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b  _exclude = NULL;
1ff30 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ..}...cackey_ini
1ff40 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09  tialized = 0;...
1ff50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ff60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ff70 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1ff80 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1ff90 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1ffa0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1ffb0 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28  _RV, C_GetInfo)(
1ffc0 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  CK_INFO_PTR pInf
1ffd0 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
1ffe0 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
1fff0 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
20000 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
20010 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
20020 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  AR libraryDescri
20030 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
20040 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  y";...CACKEY_DEB
20050 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20060 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
20070 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
20080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20090 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
200a0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
200b0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
200c0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
200d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
200e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
200f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20100 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20110 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20120 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20130 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20140 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  IZED);..}...pInf
20150 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
20160 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
20170 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
20180 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
20190 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
201a0 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
201b0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
201c0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
201d0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
201e0 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74  & 0xff;...memset
201f0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
20200 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
20210 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
20220 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
20230 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
20240 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
20250 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
20260 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
20270 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  D) - 1);...pInfo
20280 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a  ->flags = 0x00;.
20290 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
202a0 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
202b0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
202c0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
202d0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
202e0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mcpy(pInfo->libr
202f0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
20300 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
20310 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61  on, sizeof(libra
20320 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  ryDescription) -
20330 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69   1);...pInfo->li
20340 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a  braryVersion.maj
20350 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
20360 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
20370 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
20380 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
20390 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
203a0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
203b0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  8) & 0xff;...CAC
203c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
203d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
203e0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
203f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20400 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72  OK);.}../*. * Pr
20410 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65  ocess list of re
20420 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74  aders, and creat
20430 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65  e mapping betwee
20440 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e  n reader name an
20450 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b  d slot ID. */.CK
20460 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
20470 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
20480 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20  tList)(CK_BBOOL 
20490 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b  tokenPresent, CK
204a0 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
204b0 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  otList, CK_ULONG
204c0 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
204d0 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66 69 72  ..static int fir
204e0 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e  st_call = 1;..in
204f0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
20500 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
20510 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  t_ret;..CK_ULONG
20520 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75   count, slot_cou
20530 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74  nt = 0, currslot
20540 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 61  , slot_idx;..cha
20550 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c  r *pcsc_readers,
20560 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73   *pcsc_readers_s
20570 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , *pcsc_readers_
20580 65 3b 0a 09 63 68 61 72 20 2a 72 65 61 64 65 72  e;..char *reader
20590 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 3b 0a  _check_pattern;.
205a0 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64  .DWORD pcsc_read
205b0 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73  ers_len;..LONG s
205c0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
205d0 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75  _ret;..size_t cu
205e0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09  rr_reader_len;..
205f0 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a  int slot_reset;.
20600 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 72 65 61  .int include_rea
20610 64 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  der;...CACKEY_DE
20620 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
20630 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c  ed.");...if (pul
20640 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
20650 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20660 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
20670 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
20680 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20690 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
206a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
206b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
206c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
206d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
206e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
206f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20700 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
20710 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
20720 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
20730 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
20740 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20750 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
20760 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20780 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
20790 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
207a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
207b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
207c0 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73  }.../* Clear lis
207d0 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73  t of slots */..s
207e0 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
207f0 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b  if (pSlotList) {
20800 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61 6c  ...if (first_cal
20810 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 61  l) {....first_ca
20820 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74  ll = 0;.....slot
20830 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a  _reset = 1;...}.
20840 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .../* If any of 
20850 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20 62  the slots have b
20860 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20 70  een reset then p
20870 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  urge all informa
20880 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 61  tion and check a
20890 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63  gain */...for (c
208a0 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
208b0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
208c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
208d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
208e0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
208f0 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63  ot++) {....if (c
20900 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
20910 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  slot].internal) 
20920 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
20930 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
20940 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
20950 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
20960 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
20970 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79  }.....if (cackey
20980 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20990 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  .slot_reset) {..
209a0 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  ...slot_reset = 
209b0 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  1;......break;..
209c0 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ..}...}....if (s
209d0 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09  lot_reset) {....
209e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
209f0 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c 6c  NTF("Purging all
20a00 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
20a10 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c  n.");...../* Onl
20a20 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
20a30 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
20a40 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
20a50 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73  ing supply the s
20a60 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
20a70 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  */....cackey_slo
20a80 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
20a90 6c 28 31 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63  l(1);.....for (c
20aa0 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
20ab0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
20ac0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
20ad0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20ae0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
20af0 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  ot++) {.....if (
20b00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
20b10 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
20b20 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65   {......continue
20b30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
20b40 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
20b50 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
20b60 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a  ...}...}..}.../*
20b70 20 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20   Determine list 
20b80 6f 66 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70  of readers */..p
20b90 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
20ba0 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  = cackey_pcsc_co
20bb0 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63  nnect();..if (pc
20bc0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
20bd0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
20be0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
20bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
20c00 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
20c10 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e   failed, assumin
20c20 67 20 6e 6f 20 68 61 72 64 77 61 72 65 20 73 6c  g no hardware sl
20c30 6f 74 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  ots");..} else {
20c40 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
20c50 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72  len = 0;....scar
20c60 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
20c70 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
20c80 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
20c90 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
20ca0 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
20cb0 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20  ers_len);....if 
20cc0 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
20cd0 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
20ce0 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a  F_COMM_ERROR) {.
20cf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20d00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
20d10 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
20d20 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
20d30 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61  _F_COMM_ERROR, a
20d40 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69  ssuming Connecti
20d50 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e 74  on to PC/SC went
20d60 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74   away. Reconnect
20d70 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ing.");.....cack
20d80 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
20d90 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  ct();....cackey_
20da0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
20db0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20dc0 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20  _PRINTF("Trying 
20dd0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
20de0 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 73  () again");....s
20df0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
20e00 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
20e10 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
20e20 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
20e30 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
20e40 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d  eaders_len);...}
20e50 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
20e60 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
20e70 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49   SCARD_E_INSUFFI
20e80 43 49 45 4e 54 5f 42 55 46 46 45 52 29 20 7b 0a  CIENT_BUFFER) {.
20e90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20ea0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
20eb0 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
20ec0 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
20ed0 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f  _E_INSUFFICIENT_
20ee0 42 55 46 46 45 52 2c 20 61 73 73 75 6d 69 6e 67  BUFFER, assuming
20ef0 20 74 68 69 73 20 69 73 20 61 20 62 75 67 20 28   this is a bug (
20f00 65 2e 67 2e 2c 20 47 6f 6f 67 6c 65 20 50 43 53  e.g., Google PCS
20f10 43 29 20 61 6e 64 20 61 6c 6c 6f 63 61 74 69 6e  C) and allocatin
20f20 67 20 61 20 6d 61 73 73 69 76 65 20 61 6d 6f 75  g a massive amou
20f30 6e 74 20 6f 66 20 73 70 61 63 65 20 74 6f 20 68  nt of space to h
20f40 6f 6c 64 20 74 68 65 20 72 65 61 64 65 72 20 6c  old the reader l
20f50 69 73 74 2e 22 29 3b 0a 0a 09 09 09 70 63 73 63  ist.");.....pcsc
20f60 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 33  _readers_len = 3
20f70 32 37 36 38 3b 0a 09 09 09 73 63 61 72 64 5f 6c  2768;....scard_l
20f80 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
20f90 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
20fa0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ;...}....if (sca
20fb0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
20fc0 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
20fd0 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65  CCESS && pcsc_re
20fe0 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20  aders_len != 0) 
20ff0 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  {....pcsc_reader
21000 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  s = malloc(pcsc_
21010 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
21020 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20  .pcsc_readers_s 
21030 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a  = pcsc_readers;.
21040 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
21050 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
21060 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
21070 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
21080 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61  , NULL, pcsc_rea
21090 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64  ders, &pcsc_read
210a0 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20  ers_len);....if 
210b0 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
210c0 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
210d0 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
210e0 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20  .pcsc_readers_e 
210f0 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  = pcsc_readers +
21100 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
21110 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74  n;....../* Start
21120 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c   with Slot ID 1,
21130 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20   to avoid a bug 
21140 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a  in GDM on RHEL *
21150 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34  /...../* Bug 594
21160 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67  911: https://bug
21170 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d  zilla.redhat.com
21180 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
21190 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63  =594911 */.....c
211a0 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09  urrslot = 1;....
211b0 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61  .while (pcsc_rea
211c0 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64  ders < pcsc_read
211d0 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a  ers_e) {....../*
211e0 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 6c   Find next avail
211f0 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09  able slot */....
21200 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f  ..for (; currslo
21210 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
21220 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
21230 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
21240 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
21250 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63  ) {.......if (!c
21260 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
21270 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
21280 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
21290 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09  ....}......}....
212a0 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  ...curr_reader_l
212b0 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63  en = strlen(pcsc
212c0 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09  _readers);......
212d0 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 65  .if ((pcsc_reade
212e0 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72  rs + curr_reader
212f0 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61  _len) > pcsc_rea
21300 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09  ders_e) {.......
21310 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
21320 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 61  ....if (curr_rea
21330 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a  der_len == 0) {.
21340 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
21350 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
21360 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f  rrslot >= (sizeo
21370 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
21380 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
21390 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
213a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
213b0 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d  _PRINTF("Found m
213c0 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61 6e  ore readers than
213d0 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c   slots are avail
213e0 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09  able!");........
213f0 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09  break;......}...
21400 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21410 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72  _PRINTF("Found r
21420 65 61 64 65 72 3a 20 25 73 20 28 63 75 72 72 73  eader: %s (currs
21430 6c 6f 74 20 3d 20 25 6c 75 29 22 2c 20 70 63 73  lot = %lu)", pcs
21440 63 5f 72 65 61 64 65 72 73 2c 20 28 75 6e 73 69  c_readers, (unsi
21450 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73  gned long) currs
21460 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  lot);.......if (
21470 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69  cackey_readers_i
21480 6e 63 6c 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e  nclude_only != N
21490 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ULL) {.......CAC
214a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
214b0 28 22 41 73 6b 65 64 20 74 6f 20 69 6e 63 6c 75  ("Asked to inclu
214c0 64 65 20 6f 6e 6c 79 20 72 65 61 64 65 72 73 20  de only readers 
214d0 6d 61 74 63 68 69 6e 67 3a 20 25 73 22 2c 20 63  matching: %s", c
214e0 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
214f0 63 6c 75 64 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09  clude_only);....
21500 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64  ....include_read
21510 65 72 20 3d 20 30 3b 0a 09 09 09 09 09 09 72 65  er = 0;.......re
21520 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65  ader_check_patte
21530 72 6e 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  rn = cackey_read
21540 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
21550 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 69 66  ;......} else if
21560 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73   (cackey_readers
21570 5f 65 78 63 6c 75 64 65 20 21 3d 20 4e 55 4c 4c  _exclude != NULL
21580 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
21590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
215a0 73 6b 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20  sked to exclude 
215b0 72 65 61 64 65 72 73 20 6d 61 74 63 68 69 6e 67  readers matching
215c0 3a 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 72 65  : %s", cackey_re
215d0 61 64 65 72 73 5f 65 78 63 6c 75 64 65 29 3b 0a  aders_exclude);.
215e0 0a 09 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72  .......include_r
215f0 65 61 64 65 72 20 3d 20 31 3b 0a 09 09 09 09 09  eader = 1;......
21600 09 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61  .reader_check_pa
21610 74 74 65 72 6e 20 3d 20 63 61 63 6b 65 79 5f 72  ttern = cackey_r
21620 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 3b 0a  eaders_exclude;.
21630 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
21640 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64  ....include_read
21650 65 72 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 65  er = 1;.......re
21660 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65  ader_check_patte
21670 72 6e 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  rn = NULL;......
21680 7d 0a 0a 09 09 09 09 09 69 66 20 28 72 65 61 64  }.......if (read
21690 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e  er_check_pattern
216a0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
216b0 09 09 69 66 20 28 73 74 72 73 74 72 28 70 63 73  ..if (strstr(pcs
216c0 63 5f 72 65 61 64 65 72 73 2c 20 72 65 61 64 65  c_readers, reade
216d0 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 29  r_check_pattern)
216e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
216f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21700 50 52 49 4e 54 46 28 22 54 68 69 73 20 72 65 61  PRINTF("This rea
21710 64 65 72 20 6d 61 74 63 68 65 64 20 74 68 65 20  der matched the 
21720 70 61 74 74 65 72 6e 2e 22 29 3b 0a 09 09 09 09  pattern.");.....
21730 09 09 0a 09 09 09 09 09 09 09 69 6e 63 6c 75 64  ..........includ
21740 65 5f 72 65 61 64 65 72 20 3d 20 21 69 6e 63 6c  e_reader = !incl
21750 75 64 65 5f 72 65 61 64 65 72 3b 0a 09 09 09 09  ude_reader;.....
21760 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ..}......}......
21770 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 72 65 61  .if (include_rea
21780 64 65 72 20 21 3d 20 31 29 20 7b 0a 09 09 09 09  der != 1) {.....
21790 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
217a0 52 49 4e 54 46 28 22 53 6b 69 70 70 69 6e 67 20  RINTF("Skipping 
217b0 74 68 69 73 20 72 65 61 64 65 72 2e 22 29 3b 0a  this reader.");.
217c0 0a 09 09 09 09 09 09 70 63 73 63 5f 72 65 61 64  .......pcsc_read
217d0 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64  ers += curr_read
217e0 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 0a 09 09 09  er_len + 1;.....
217f0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
21800 09 09 7d 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c  ..}......./* Onl
21810 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
21820 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
21830 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
21840 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79  ing asked supply
21850 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
21860 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66  ation */......if
21870 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09   (pSlotList) {..
21880 09 09 09 09 09 69 66 20 28 73 6c 6f 74 5f 72 65  .....if (slot_re
21890 73 65 74 29 20 7b 0a 09 09 09 09 09 09 09 63 61  set) {........ca
218a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
218b0 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  lot].active = 1;
218c0 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
218d0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
218e0 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 09  nternal = 0;....
218f0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
21900 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
21910 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 28  reader = strdup(
21920 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09  pcsc_readers);..
21930 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
21940 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
21950 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
21960 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
21970 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21980 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot].transaction_
21990 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09  depth = 0;......
219a0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
219b0 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63  urrslot].transac
219c0 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
219d0 6b 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 69 66  k = 0;........if
219e0 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d   (cackey_pin_com
219f0 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  mand == NULL) {.
21a00 09 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 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
21a30 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
21a40 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ........} else {
21a50 0a 09 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  .........cackey_
21a60 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
21a70 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
21a80 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09  ........}.......
21a90 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
21aa0 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20  rrslot].label = 
21ab0 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63 61  NULL;.........ca
21ac0 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
21ad0 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  eset(&cackey_slo
21ae0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09  ts[currslot]);..
21af0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c  .....}......} el
21b00 73 65 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21  se {.......if (!
21b10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
21b20 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
21b30 0a 09 09 09 09 09 09 09 2f 2a 20 41 72 74 69 66  ......../* Artif
21b40 69 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73 65  icially increase
21b50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
21b60 63 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20 77  ctive slots by w
21b70 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
21b80 61 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09 09  active */.......
21b90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21ba0 49 4e 54 46 28 22 46 6f 75 6e 64 20 69 6e 2d 61  INTF("Found in-a
21bb0 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20  ctive slot %lu, 
21bc0 62 75 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61  but it will be a
21bd0 63 74 69 76 65 20 61 66 74 65 72 20 61 20 72 65  ctive after a re
21be0 73 65 74 20 2d 2d 20 6d 61 72 6b 69 6e 67 20 61  set -- marking a
21bf0 73 20 61 63 74 69 76 65 20 66 6f 72 20 61 63 63  s active for acc
21c00 6f 75 6e 74 69 6e 67 20 70 75 72 70 6f 73 65 73  ounting purposes
21c10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
21c20 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09  g) currslot);...
21c30 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ......slot_count
21c40 2b 2b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ++;.......}.....
21c50 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74  .}......currslot
21c60 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72  ++;.......pcsc_r
21c70 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72  eaders += curr_r
21c80 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09  eader_len + 1;..
21c90 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
21ca0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
21cb0 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64  G_PRINTF("Second
21cc0 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
21cd0 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
21ce0 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
21cf0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
21d00 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
21d10 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
21d20 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
21d30 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
21d40 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a  ders_ret);....}.
21d50 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f 72 65  ....free(pcsc_re
21d60 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c  aders_s);...} el
21d70 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
21d80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72  EBUG_PRINTF("Fir
21d90 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64  st call to SCard
21da0 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c  ListReaders fail
21db0 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c  ed, return %s/%l
21dc0 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  i", CACKEY_DEBUG
21dd0 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
21de0 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74  O_STR(scard_list
21df0 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c  readers_ret), (l
21e00 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72  ong) scard_listr
21e10 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d  eaders_ret);...}
21e20 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73  ..}...for (currs
21e30 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
21e40 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
21e50 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
21e60 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
21e70 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
21e80 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
21e90 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
21ea0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41  .active) {....CA
21eb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ec0 46 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20  F("Found active 
21ed0 73 6c 6f 74 20 25 6c 75 2c 20 72 65 61 64 65 72  slot %lu, reader
21ee0 20 3d 20 25 73 22 2c 20 28 75 6e 73 69 67 6e 65   = %s", (unsigne
21ef0 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74  d long) currslot
21f00 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  , cackey_slots[c
21f10 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
21f20 61 64 65 72 29 3b 0a 0a 09 09 09 73 6c 6f 74 5f  ader);.....slot_
21f30 63 6f 75 6e 74 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  count++;...}..}.
21f40 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
21f50 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
21f60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21f70 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21f80 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21f90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21fa0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
21fb0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
21fc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21fd0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21fe0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74  ;..}...if (pSlot
21ff0 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
22000 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
22010 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43  ot_count;....CAC
22020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22030 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22040 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20  OK (%i).  Found 
22050 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62 75 74  %lu readers, but
22060 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 73   not storing IDs
22070 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
22080 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28  ULL)", CKR_OK, (
22090 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
220a0 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
220b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
220c0 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c  }...count = *pul
220d0 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e  Count;..if (coun
220e0 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20  t < slot_count) 
220f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22100 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22110 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25  User allocated %
22120 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20  lu entries, but 
22130 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72  we have %lu entr
22140 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c  ies.", count, sl
22150 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41  ot_count);....CA
22160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22170 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22180 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
22190 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  L");....return(C
221a0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
221b0 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65  ALL);...}...mute
221c0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
221d0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
221e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
221f0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
22200 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
22210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22220 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
22230 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22240 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22250 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  ERROR);..}...slo
22260 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20  t_idx = 0;..for 
22270 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28  (currslot = 0; (
22280 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
22290 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
222a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
222b0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75  _slots[0]))); cu
222c0 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66  rrslot++) {...if
222d0 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
222e0 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
222f0 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
22300 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74  ...}....if (slot
22310 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b  _idx >= count) {
22320 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
22330 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22340 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25  User allocated %
22350 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20  lu entries, but 
22360 77 65 20 6a 75 73 74 20 74 72 69 65 64 20 74 6f  we just tried to
22370 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 25 6c   write to the %l
22380 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72  u index -- ignor
22390 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f  ing", count, slo
223a0 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74  t_idx);.....cont
223b0 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c  inue;...}....pSl
223c0 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d  otList[slot_idx]
223d0 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73   = currslot;...s
223e0 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09  lot_idx++;..}...
223f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
22400 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
22410 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22420 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
22430 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
22440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22450 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
22460 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22470 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22480 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22490 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  .}...*pulCount =
224a0 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43   slot_count;...C
224b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
224c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
224d0 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
224e0 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c  d %lu readers.",
224f0 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e   CKR_OK, (unsign
22500 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f  ed long) slot_co
22510 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
22520 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50  KR_OK);...tokenP
22530 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72  resent = tokenPr
22540 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73  esent; /* Supres
22550 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
22560 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
22570 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22580 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
22590 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54  lotInfo)(CK_SLOT
225a0 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53  _ID slotID, CK_S
225b0 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  LOT_INFO_PTR pIn
225c0 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
225d0 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65  _UTF8CHAR slotDe
225e0 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43  scription[] = "C
225f0 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e  ACKey Slot";..in
22600 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
22610 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f  .int bytes_to_co
22620 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  py;...CACKEY_DEB
22630 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22640 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
22650 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
22660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22670 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
22680 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22690 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
226a0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
226b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
226c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
226d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
226e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
226f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22700 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22710 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22720 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
22730 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
22740 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
22750 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
22760 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
22770 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
22780 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22790 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
227a0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
227b0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
227c0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
227d0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
227e0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
227f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
22800 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
22810 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
22820 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22830 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22840 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22850 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22860 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
22870 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
22880 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22890 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
228a0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
228b0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
228c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
228d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
228e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
228f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
22900 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
22910 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
22920 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
22930 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22940 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22950 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22960 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
22970 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ..}...pInfo->fla
22980 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54  gs = CKF_HW_SLOT
22990 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
229a0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e  slots[slotID].in
229b0 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66  ternal) {...pInf
229c0 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
229d0 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45  REMOVABLE_DEVICE
229e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
229f0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
22a00 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
22a10 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59  otID]) == CACKEY
22a20 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
22a30 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  SENT) {...pInfo-
22a40 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f  >flags |= CKF_TO
22a50 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a  KEN_PRESENT;..}.
22a60 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
22a70 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f  = strlen(cackey_
22a80 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63  slots[slotID].pc
22a90 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20  sc_reader);..if 
22aa0 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d  (sizeof(pInfo->m
22ab0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c  anufacturerID) <
22ac0 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
22ad0 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  {...bytes_to_cop
22ae0 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  y = sizeof(pInfo
22af0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
22b00 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49  );..}..memcpy(pI
22b10 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
22b20 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  rID, cackey_slot
22b30 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
22b40 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f  eader, bytes_to_
22b50 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72  copy);...mutex_r
22b60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
22b70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22b80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
22b90 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
22ba0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22bc0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
22bd0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22be0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22bf0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65  _ERROR);..}...me
22c00 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mset(pInfo->slot
22c10 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
22c20 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
22c30 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29  slotDescription)
22c40 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
22c50 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
22c60 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  n, slotDescripti
22c70 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44  on, sizeof(slotD
22c80 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29  escription) - 1)
22c90 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
22ca0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
22cb0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
22cc0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
22cd0 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  rID));...pInfo->
22ce0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
22cf0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
22d00 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
22d10 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
22d20 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
22d30 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
22d40 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
22d50 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
22d60 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
22d70 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
22d80 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
22d90 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
22da0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
22db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22dc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22dd0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
22de0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
22df0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
22e00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22e10 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
22e20 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
22e30 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
22e40 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
22e50 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
22e60 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
22e70 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
22e80 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
22e90 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
22ea0 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
22eb0 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
22ec0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
22ed0 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
22ee0 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72  CAC Token";..str
22ef0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
22f00 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
22f10 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
22f20 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
22f30 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61  rts;..ssize_t la
22f40 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  bel_ret;..int mu
22f50 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
22f60 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62   use_default_lab
22f70 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  el;...CACKEY_DEB
22f80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22f90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
22fa0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
22fb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22fc0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
22fd0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22fe0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22ff0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
23000 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
23010 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
23020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23030 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
23040 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
23050 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
23060 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
23070 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
23080 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
23090 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
230a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
230b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
230c0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
230d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
230e0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
230f0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23100 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
23110 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
23120 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
23130 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
23140 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
23150 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
23160 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
23170 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23180 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
23190 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
231a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
231b0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
231c0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
231d0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
231e0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
231f0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
23200 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
23210 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
23220 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23230 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
23240 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23250 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
23260 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
23270 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
23280 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23290 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
232a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
232b0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
232c0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
232d0 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
232e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
232f0 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
23300 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
23310 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
23320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
23330 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e   token is presen
23340 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c  t in slotID = %l
23350 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  u", slotID);....
23360 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23370 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23380 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
23390 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45  KR_TOKEN_NOT_PRE
233a0 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  SENT);..}.../* D
233b0 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c  etermine token l
233c0 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66  abel from certif
233d0 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65  icates */..memse
233e0 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  t(pInfo->label, 
233f0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
23400 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65  o->label));..use
23410 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
23420 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79   1;...if (cackey
23430 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
23440 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  abel == NULL) {.
23450 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
23460 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
23470 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c  certs(&cackey_sl
23480 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c  ots[slotID], NUL
23490 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
234a0 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
234b0 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
234c0 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  ....if (num_cert
234d0 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62  s > 0) {.....lab
234e0 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  el_ret = cackey_
234f0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f  pcsc_identity_to
23500 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e  _label(pcsc_iden
23510 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c  tities, pInfo->l
23520 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
23530 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
23540 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e  .if (label_ret >
23550 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64   0) {......use_d
23560 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
23570 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
23580 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
23590 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  el = malloc(size
235a0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
235b0 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  );.......memcpy(
235c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
235d0 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66  tID].label, pInf
235e0 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  o->label, sizeof
235f0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
23600 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
23610 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
23620 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  s(pcsc_identitie
23630 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29  s, num_certs, 1)
23640 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
23650 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
23660 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c  label, cackey_sl
23670 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
23680 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
23690 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65  >label));....use
236a0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
236b0 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
236c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
236d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
236e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
236f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
23700 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
23710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23720 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
23730 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
23740 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23750 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
23760 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61   (use_default_la
23770 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  bel) {...memcpy(
23780 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
23790 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
237a0 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
237b0 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73   - 1);..}...mems
237c0 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
237d0 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
237e0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
237f0 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
23800 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
23810 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
23820 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
23830 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
23840 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  rID) - 1);...mem
23850 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  set(pInfo->model
23860 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
23870 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d  nfo->model));..m
23880 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emcpy(pInfo->mod
23890 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f  el, model, sizeo
238a0 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a  f(model) - 1);..
238b0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
238c0 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27  erialNumber, ' '
238d0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
238e0 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a  serialNumber));.
238f0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
23900 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69  utcTime, ' ', si
23910 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54  zeof(pInfo->utcT
23920 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  ime));...pInfo->
23930 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
23940 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
23950 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
23960 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
23970 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
23980 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
23990 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
239a0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
239b0 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
239c0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
239d0 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
239e0 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
239f0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49  nor = 0x00;...pI
23a00 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
23a10 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
23a20 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
23a30 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b  INITIALIZED | CK
23a40 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49  F_TOKEN_INITIALI
23a50 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f  ZED | cackey_slo
23a60 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
23a70 5f 66 6c 61 67 73 3b 0a 0a 09 69 66 20 28 63 61  _flags;...if (ca
23a80 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
23a90 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 49   != NULL) {...pI
23aa0 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b  nfo->flags |= CK
23ab0 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 55 54 48  F_PROTECTED_AUTH
23ac0 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54 48 3b  ENTICATION_PATH;
23ad0 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ..}...pInfo->ulM
23ae0 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  axSessionCount =
23af0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
23b00 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
23b10 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
23b20 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49  ns[0])) - 1;..pI
23b30 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f  nfo->ulSessionCo
23b40 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
23b50 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
23b60 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52  ;..pInfo->ulMaxR
23b70 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
23b80 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53  0;..pInfo->ulRwS
23b90 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
23ba0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
23bb0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
23bc0 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20  ->ulMaxPinLen = 
23bd0 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  128;..pInfo->ulM
23be0 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70  inPinLen = 0;..p
23bf0 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62  Info->ulTotalPub
23c00 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
23c10 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
23c20 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
23c30 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f  ulFreePublicMemo
23c40 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
23c50 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
23c60 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
23c70 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
23c80 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
23c90 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
23ca0 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74  fo->ulFreePrivat
23cb0 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
23cc0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
23cd0 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  TION;...CACKEY_D
23ce0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23cf0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
23d00 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
23d10 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
23d20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
23d30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
23d40 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29  aitForSlotEvent)
23d50 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c  (CK_FLAGS flags,
23d60 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
23d70 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44  pSlotID, CK_VOID
23d80 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
23d90 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
23da0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23db0 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
23dc0 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
23dd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23de0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
23df0 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
23e00 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
23e10 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
23e20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
23e30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
23e40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23e50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23e60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
23e70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23e80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
23e90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
23ea0 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44  .}.../* XXX: TOD
23eb0 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69  O: Implement thi
23ec0 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f  s... */..CACKEY_
23ed0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23ee0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
23ef0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23f00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
23f10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23f20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
23f30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23f40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
23f50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
23f60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
23f70 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b  echanismList)(CK
23f80 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
23f90 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
23fa0 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  PE_PTR pMechanis
23fb0 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  mList, CK_ULONG_
23fc0 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
23fd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23fe0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
23ff0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24000 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24020 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
24030 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
24040 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
24050 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
24060 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
24070 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
24080 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
24090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
240a0 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69  ror.  pulCount i
240b0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
240c0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
240d0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
240e0 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74   (pMechanismList
240f0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
24100 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09  ulCount = 1;....
24110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24120 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24130 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
24140 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
24150 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
24160 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29   (*pulCount < 1)
24170 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24180 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24190 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61    Buffer too sma
241a0 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ll.");....return
241b0 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
241c0 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65  SMALL);..}...pMe
241d0 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d  chanismList[0] =
241e0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09   CKM_RSA_PKCS;..
241f0 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a  *pulCount = 1;..
24200 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24210 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24220 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
24230 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
24240 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
24250 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24260 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
24270 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  nismInfo)(CK_SLO
24280 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
24290 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74  MECHANISM_TYPE t
242a0 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ype, CK_MECHANIS
242b0 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  M_INFO_PTR pInfo
242c0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
242d0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
242e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
242f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
24300 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
24310 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24320 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
24330 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
24340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
24350 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
24360 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24370 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24380 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24390 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
243a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
243b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
243c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
243d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
243e0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
243f0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
24400 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
24410 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
24420 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
24430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24440 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
24450 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
24460 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
24470 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
24480 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
24490 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
244a0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
244b0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
244c0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
244d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
244e0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
244f0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
24500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24510 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
24520 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24530 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24540 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24550 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
24560 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
24570 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
24580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24590 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
245a0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
245b0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
245c0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
245d0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
245e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
245f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24600 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
24610 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
24620 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
24630 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
24640 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24650 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24660 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24670 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24690 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
246a0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
246b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
246c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
246d0 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09  itch (type) {...
246e0 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
246f0 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  S:....pInfo->ulM
24700 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
24710 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
24720 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
24730 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
24740 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45  = CKF_HW | CKF_E
24750 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43  NCRYPT | CKF_DEC
24760 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20  RYPT | CKF_SIGN 
24770 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09  | CKF_VERIFY;...
24780 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43  .break;..}...CAC
24790 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
247a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
247b0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
247c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
247d0 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  OK);.}../* We do
247e0 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
247f0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
24800 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24810 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65  K_RV, C_InitToke
24820 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  n)(CK_SLOT_ID sl
24830 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41  otID, CK_UTF8CHA
24840 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
24850 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43  LONG ulPinLen, C
24860 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
24870 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59  Label) {..CACKEY
24880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24890 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
248a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
248b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
248c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
248d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
248e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
248f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
24900 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
24910 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
24920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24930 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
24940 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
24950 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
24960 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
24970 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
24980 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
24990 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57  TECTED);.}../* W
249a0 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
249b0 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
249c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
249d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
249e0 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  PIN)(CK_SESSION_
249f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24a00 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
24a10 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
24a20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43  ulPinLen) {..CAC
24a30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24a40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24a50 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24a60 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24a80 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24a90 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24aa0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24ab0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24ac0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
24ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24ae0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f  Returning CKR_TO
24af0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
24b00 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54  TED (%i)", CKR_T
24b10 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
24b20 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  CTED);...return(
24b30 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
24b40 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 43  PROTECTED);.}..C
24b50 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24b60 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49  N(CK_RV, C_SetPI
24b70 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  N)(CK_SESSION_HA
24b80 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
24b90 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
24ba0 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  OldPin, CK_ULONG
24bb0 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b   ulOldPinLen, CK
24bc0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e  _UTF8CHAR_PTR pN
24bd0 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ewPin, CK_ULONG 
24be0 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09  ulNewPinLen) {..
24bf0 63 68 61 72 20 6f 6c 64 70 69 6e 62 75 66 5b 36  char oldpinbuf[6
24c00 34 5d 2c 20 6e 65 77 70 69 6e 62 75 66 5b 36 34  4], newpinbuf[64
24c10 5d 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73  ];..cackey_ret s
24c20 65 74 5f 70 69 6e 5f 72 65 74 2c 20 67 65 74 5f  et_pin_ret, get_
24c30 70 69 6e 5f 72 65 74 3b 0a 09 43 4b 5f 53 4c 4f  pin_ret;..CK_SLO
24c40 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e  T_ID slotID;..in
24c50 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
24c60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24c70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24c80 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24c90 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24ca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24cb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
24cc0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
24cd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24ce0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24cf0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24d00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
24d10 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
24d20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24d30 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
24d40 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
24d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24d60 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
24d70 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
24d80 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
24d90 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
24da0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
24db0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24dc0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
24dd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24de0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24df0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
24e00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24e10 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
24e20 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
24e30 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
24e40 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
24e50 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
24e60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24e70 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
24e80 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
24e90 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
24ea0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
24eb0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
24ec0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
24ed0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24ee0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24ef0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
24f00 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
24f10 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
24f20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
24f30 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
24f40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24f50 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
24f60 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24f70 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
24f80 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
24f90 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
24fa0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24fb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24fc0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
24fd0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
24fe0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
24ff0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
25000 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
25010 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25020 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25030 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25040 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25050 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  if (cackey_pin_c
25060 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20  ommand != NULL) 
25070 7b 0a 09 09 2f 2a 20 47 65 74 20 6f 6c 64 20 50  {.../* Get old P
25080 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70 69 6e 5f  IN */...get_pin_
25090 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  ret = cackey_get
250a0 5f 70 69 6e 28 6f 6c 64 70 69 6e 62 75 66 29 3b  _pin(oldpinbuf);
250b0 0a 0a 09 09 69 66 20 28 67 65 74 5f 70 69 6e 5f  ....if (get_pin_
250c0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
250d0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
250e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
250f0 46 28 22 45 72 72 6f 72 20 77 68 69 6c 65 20 67  F("Error while g
25100 65 74 74 69 6e 67 20 4f 6c 64 20 50 49 4e 2c 20  etting Old PIN, 
25110 72 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49  returning CKR_PI
25120 4e 5f 49 4e 43 4f 52 52 45 43 54 2e 22 29 3b 0a  N_INCORRECT.");.
25130 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
25140 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25150 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09 09  iglock);........
25160 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
25170 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a  NCORRECT);...}..
25180 09 09 70 4f 6c 64 50 69 6e 20 3d 20 28 43 4b 5f  ..pOldPin = (CK_
25190 55 54 46 38 43 48 41 52 5f 50 54 52 29 20 6f 6c  UTF8CHAR_PTR) ol
251a0 64 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4f 6c 64  dpinbuf;...ulOld
251b0 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  PinLen = strlen(
251c0 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09 2f  oldpinbuf);..../
251d0 2a 20 47 65 74 20 6e 65 77 20 50 49 4e 20 2a 2f  * Get new PIN */
251e0 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d  ...get_pin_ret =
251f0 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28   cackey_get_pin(
25200 6e 65 77 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69  newpinbuf);....i
25210 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (get_pin_ret !
25220 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
25230 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
25240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25250 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69 6e  ror while gettin
25260 67 20 4e 65 77 20 50 49 4e 2c 20 72 65 74 75 72  g New PIN, retur
25270 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 56  ning CKR_PIN_INV
25280 41 4c 49 44 2e 22 29 3b 0a 0a 09 09 09 63 61 63  ALID.");.....cac
25290 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
252a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
252b0 3b 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e 28  ;........return(
252c0 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29  CKR_PIN_INVALID)
252d0 3b 0a 09 09 7d 0a 0a 09 09 70 4e 65 77 50 69 6e  ;...}....pNewPin
252e0 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f   = (CK_UTF8CHAR_
252f0 50 54 52 29 20 6e 65 77 70 69 6e 62 75 66 3b 0a  PTR) newpinbuf;.
25300 09 09 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3d 20  ..ulNewPinLen = 
25310 73 74 72 6c 65 6e 28 6e 65 77 70 69 6e 62 75 66  strlen(newpinbuf
25320 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4f 6c 64  );..}...if (pOld
25330 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Pin == NULL) {..
25340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25350 49 4e 54 46 28 22 4f 6c 64 20 50 49 4e 20 76 61  INTF("Old PIN va
25360 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28 6e 75  lue is wrong (nu
25370 6c 6c 29 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65  ll).");....cacke
25380 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25390 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
253a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
253b0 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 7d  N_INCORRECT);..}
253c0 0a 0a 09 69 66 20 28 75 6c 4f 6c 64 50 69 6e 4c  ...if (ulOldPinL
253d0 65 6e 20 3d 3d 20 30 20 7c 7c 20 75 6c 4f 6c 64  en == 0 || ulOld
253e0 50 69 6e 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 09  PinLen > 8) {...
253f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25400 4e 54 46 28 22 4f 6c 64 20 50 49 4e 20 6c 65 6e  NTF("Old PIN len
25410 67 74 68 20 69 73 20 77 72 6f 6e 67 3a 20 25 6c  gth is wrong: %l
25420 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u.", (unsigned l
25430 6f 6e 67 29 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e  ong) ulOldPinLen
25440 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
25450 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25460 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
25470 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
25480 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66  ORRECT);..}...if
25490 20 28 70 4e 65 77 50 69 6e 20 3d 3d 20 4e 55 4c   (pNewPin == NUL
254a0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
254b0 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 20  BUG_PRINTF("New 
254c0 50 49 4e 20 76 61 6c 75 65 20 69 73 20 77 72 6f  PIN value is wro
254d0 6e 67 20 28 65 69 74 68 65 72 20 4e 55 4c 4c 2c  ng (either NULL,
254e0 20 6f 72 20 74 6f 6f 20 6c 6f 6e 67 2f 73 68 6f   or too long/sho
254f0 72 74 29 2e 22 29 3b 0a 0a 09 09 63 61 63 6b 65  rt).");....cacke
25500 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25510 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25520 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
25530 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  N_INVALID);..}..
25540 09 69 66 20 28 75 6c 4e 65 77 50 69 6e 4c 65 6e  .if (ulNewPinLen
25550 20 3c 20 35 20 7c 7c 20 75 6c 4e 65 77 50 69 6e   < 5 || ulNewPin
25560 4c 65 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43  Len > 8) {...CAC
25570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25580 28 22 4e 65 77 20 50 49 4e 20 6c 65 6e 67 74 68  ("New PIN length
25590 20 69 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2c 20   is wrong: %lu, 
255a0 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20  must be atleast 
255b0 35 20 61 6e 64 20 6e 6f 20 6d 6f 72 65 20 74 68  5 and no more th
255c0 61 6e 20 38 2e 22 2c 20 28 75 6e 73 69 67 6e 65  an 8.", (unsigne
255d0 64 20 6c 6f 6e 67 29 20 75 6c 4e 65 77 50 69 6e  d long) ulNewPin
255e0 4c 65 6e 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  Len);....cackey_
255f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25600 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25610 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
25620 4c 45 4e 5f 52 41 4e 47 45 29 3b 0a 09 7d 0a 0a  LEN_RANGE);..}..
25630 09 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63  .set_pin_ret = c
25640 61 63 6b 65 79 5f 73 65 74 5f 70 69 6e 28 26 63  ackey_set_pin(&c
25650 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
25660 49 44 5d 2c 20 70 4f 6c 64 50 69 6e 2c 20 75 6c  ID], pOldPin, ul
25670 4f 6c 64 50 69 6e 4c 65 6e 2c 20 70 4e 65 77 50  OldPinLen, pNewP
25680 69 6e 2c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29  in, ulNewPinLen)
25690 3b 0a 0a 09 69 66 20 28 73 65 74 5f 70 69 6e 5f  ;...if (set_pin_
256a0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
256b0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
256c0 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
256d0 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and == NULL) {..
256e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
256f0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
25700 67 73 20 7c 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  gs |= CKF_LOGIN_
25710 52 45 51 55 49 52 45 44 3b 0a 09 09 7d 0a 0a 09  REQUIRED;...}...
25720 09 69 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74  .if (set_pin_ret
25730 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
25740 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 63  E_LOCKED) {....c
25750 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
25760 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
25770 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
25780 4c 4f 43 4b 45 44 3b 0a 09 09 7d 0a 09 7d 0a 0a  LOCKED;...}..}..
25790 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
257a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
257b0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
257c0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
257d0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
257e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
257f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
25800 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
25810 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25820 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25830 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 73 65  ..}...switch (se
25840 74 5f 70 69 6e 5f 72 65 74 29 20 7b 0a 09 09 63  t_pin_ret) {...c
25850 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f  ase CACKEY_PCSC_
25860 53 5f 4f 4b 3a 0a 09 09 09 43 41 43 4b 45 59 5f  S_OK:....CACKEY_
25870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
25880 63 63 65 73 73 66 75 6c 6c 79 20 73 65 74 20 50  ccessfully set P
25890 49 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  IN.");.....retur
258a0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 09 63 61 73  n(CKR_OK);...cas
258b0 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  e CACKEY_PCSC_E_
258c0 42 41 44 50 49 4e 3a 0a 09 09 09 43 41 43 4b 45  BADPIN:....CACKE
258d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
258e0 50 49 4e 20 77 61 73 20 69 6e 76 61 6c 69 64 2e  PIN was invalid.
258f0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
25900 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b  KR_PIN_INVALID);
25910 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 50  ...case CACKEY_P
25920 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 3a 0a 09 09  CSC_E_LOCKED:...
25930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25940 49 4e 54 46 28 22 54 6f 6b 65 6e 20 69 73 20 6c  INTF("Token is l
25950 6f 63 6b 65 64 20 6f 72 20 74 68 69 73 20 63 68  ocked or this ch
25960 61 6e 67 65 20 69 73 20 6e 6f 74 20 70 65 72 6d  ange is not perm
25970 69 74 74 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  itted.");.....re
25980 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43  turn(CKR_PIN_LOC
25990 4b 45 44 29 3b 0a 09 09 64 65 66 61 75 6c 74 3a  KED);...default:
259a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
259b0 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65 74 68 69  _PRINTF("Somethi
259c0 6e 67 20 65 6c 73 65 20 77 65 6e 74 20 77 72 6f  ng else went wro
259d0 6e 67 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ng changing the 
259e0 50 49 4e 3a 20 25 69 22 2c 20 73 65 74 5f 70 69  PIN: %i", set_pi
259f0 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65 74 75  n_ret);.....retu
25a00 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25a10 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  RROR);..}...retu
25a20 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25a30 52 52 4f 52 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RROR);.}..CK_DEF
25a40 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
25a50 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  RV, C_OpenSessio
25a60 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  n)(CK_SLOT_ID sl
25a70 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66  otID, CK_FLAGS f
25a80 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  lags, CK_VOID_PT
25a90 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20  R pApplication, 
25aa0 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79  CK_NOTIFY notify
25ab0 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  , CK_SESSION_HAN
25ac0 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f  DLE_PTR phSessio
25ad0 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
25ae0 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ong idx;..int mu
25af0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
25b00 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d   found_session =
25b10 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
25b20 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
25b30 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61  d.");...if ((fla
25b40 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f  gs & CKF_SERIAL_
25b50 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f  SESSION) != CKF_
25b60 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20  SERIAL_SESSION) 
25b70 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  {...return(CKR_S
25b80 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f  ESSION_PARALLEL_
25b90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25ba0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
25bb0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
25bc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25bd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25be0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25bf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25c00 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25c10 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25c20 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
25c30 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
25c40 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
25c50 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
25c60 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
25c70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25c80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
25c90 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
25ca0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
25cb0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
25cc0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
25cd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
25ce0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
25cf0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
25d00 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
25d10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25d20 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
25d30 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
25d40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25d50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
25d60 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
25d70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25d80 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
25d90 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
25da0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
25db0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
25dc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25dd0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
25de0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
25df0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
25e00 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
25e10 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
25e20 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
25e30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25e40 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
25e50 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
25e60 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  LID);..}.../* Ve
25e70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61  rify that the ca
25e80 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69  rd is actually i
25e90 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09  n the slot. */..
25ea0 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f  /* XXX: Check to
25eb0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
25ec0 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31  is in the PKCS#1
25ed0 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  1 specification 
25ee0 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  */..if (cackey_t
25ef0 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
25f00 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
25f10 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  D]) != CACKEY_PC
25f20 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
25f30 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
25f40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25f50 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65  r.  Card not pre
25f60 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  sent.  Returning
25f70 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
25f80 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  VED");....cackey
25f90 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25fa0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
25fb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56  ..return(CKR_DEV
25fc0 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d  ICE_REMOVED);..}
25fd0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b  ...for (idx = 1;
25fe0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
25ff0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
26000 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
26010 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
26020 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  dx++) {...if (!c
26030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
26040 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
26050 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d  .found_session =
26060 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69   1;.....*phSessi
26070 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61  on = idx;.....ca
26080 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26090 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  x].active = 1;..
260a0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
260b0 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20  s[idx].slotID = 
260c0 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65  slotID;....cacke
260d0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
260e0 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
260f0 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09  UBLIC_SESSION;..
26100 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26110 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66  s[idx].flags = f
26120 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f  lags;....cackey_
26130 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c  sessions[idx].ul
26140 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b  DeviceError = 0;
26150 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26160 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63  ons[idx].pApplic
26170 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61  ation = pApplica
26180 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f  tion;....cackey_
26190 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f  sessions[idx].No
261a0 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a  tify = notify;..
261b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
261c0 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
261d0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
261e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
261f0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
26200 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  unt = 0;.....cac
26210 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
26220 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
26230 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
26240 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69  sessions[idx].si
26250 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
26260 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26270 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f  ns[idx].decrypt_
26280 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
26290 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
262a0 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
262b0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64  = cackey_read_id
262c0 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79  entities(&cackey
262d0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
262e0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
262f0 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
26300 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72  _count);......br
26310 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  eak;...}..}...mu
26320 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
26330 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26340 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26350 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26360 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26380 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
26390 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
263a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
263b0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
263c0 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65  ...if (!found_se
263d0 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45  ssion) {...CACKE
263e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
263f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45  Returning CKR_SE
26400 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29  SSION_COUNT (%i)
26410 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ", CKR_SESSION_C
26420 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e  OUNT);....return
26430 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55  (CKR_SESSION_COU
26440 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
26450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26460 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
26470 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
26480 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
26490 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
264a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
264b0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43  _CloseSession)(C
264c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
264d0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e   hSession) {..in
264e0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
264f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26500 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26510 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26520 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26550 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26570 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26580 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26590 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
265a0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
265b0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
265c0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
265d0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
265e0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
265f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26600 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26610 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
26620 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26630 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
26640 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
26650 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
26660 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
26670 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26680 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
26690 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
266a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
266b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
266c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
266d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
266e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
266f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
26700 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26710 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
26720 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26730 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26740 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
26750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26760 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
26770 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
26780 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
26790 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
267a0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
267b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
267c0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61  .active = 0;..ca
267d0 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
267e0 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73  ties(cackey_sess
267f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
26800 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65  dentities, cacke
26810 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26820 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
26830 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f  count);...mutex_
26840 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26850 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26860 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
26870 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
26880 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
26890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
268a0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
268b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
268c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
268d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
268e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
268f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26900 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
26910 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
26920 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
26930 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
26940 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  RV, C_CloseAllSe
26950 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f  ssions)(CK_SLOT_
26960 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69  ID slotID) {..ui
26970 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74  nt32_t idx;..int
26980 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
26990 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
269a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
269b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
269c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
269d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
269e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
269f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
26a00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26a10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26a20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
26a30 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
26a40 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
26a50 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
26a60 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
26a70 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
26a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26a90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
26aa0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
26ab0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
26ac0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
26ad0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
26ae0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
26af0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
26b00 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
26b10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
26b20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26b30 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
26b40 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
26b50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26b60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
26b70 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26b80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26b90 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26ba0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
26bb0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
26bc0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
26bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26be0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
26bf0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
26c00 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
26c10 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
26c20 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
26c30 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26c40 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26c50 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
26c60 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
26c70 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
26c80 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
26c90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
26ca0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
26cb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
26cc0 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
26cd0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
26ce0 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
26cf0 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
26d00 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
26d10 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29  lotID != slotID)
26d20 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
26d30 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
26d40 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26d50 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26d60 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
26d70 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79  (idx);....cackey
26d80 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
26d90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d  ey_biglock);...}
26da0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
26db0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26dc0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26dd0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
26de0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
26df0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26e00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26e10 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
26e20 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
26e30 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26e40 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
26e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26e60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
26e70 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
26e80 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
26e90 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26ea0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26eb0 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
26ec0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
26ed0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
26ee0 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54  _SESSION_INFO_PT
26ef0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
26f00 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
26f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26f20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
26f30 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
26f40 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
26f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26f60 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
26f70 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
26f80 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
26f90 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
26fa0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26fb0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
26fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26fd0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
26fe0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
26ff0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27000 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27010 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
27020 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
27030 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
27040 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
27050 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
27060 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
27070 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27080 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27090 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
270a0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
270b0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
270c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
270d0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
270e0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
270f0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
27100 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
27110 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
27120 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27130 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27140 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
27150 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27160 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27170 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
27180 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27190 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
271a0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
271b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
271c0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
271d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
271e0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
271f0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
27200 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27210 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27220 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
27230 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63  fo->slotID = cac
27240 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27250 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09  ssion].slotID;..
27260 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63  pInfo->state = c
27270 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27280 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a  Session].state;.
27290 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
272a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
272b0 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b  hSession].flags;
272c0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63  ..pInfo->ulDevic
272d0 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f  eError = cackey_
272e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
272f0 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  n].ulDeviceError
27300 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
27310 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
27320 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27330 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
27340 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27350 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27360 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27370 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
27380 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27390 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
273a0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
273b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
273c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
273d0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
273e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
273f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
27400 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
27410 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
27420 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
27430 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
27440 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
27450 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
27460 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72  LONG_PTR pulOper
27470 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b  ationStateLen) {
27480 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27490 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
274a0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
274b0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
274c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
274d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
274e0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
274f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27500 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27510 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27530 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27540 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27550 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
27560 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27570 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
27580 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
27590 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
275a0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
275b0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
275c0 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_SetOperationS
275d0 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
275e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
275f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
27600 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
27610 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74  K_ULONG ulOperat
27620 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f  ionStateLen, CK_
27630 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45  OBJECT_HANDLE hE
27640 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b  ncryptionKey, CK
27650 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
27660 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65  AuthenticationKe
27670 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
27680 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
27690 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
276a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
276b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
276c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
276d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
276e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
276f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27700 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27710 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27720 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27730 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
27740 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
27750 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
27760 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
27770 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
27780 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27790 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
277a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
277b0 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 4d 75 74 65  _RV, C_LoginMute
277c0 78 41 72 67 29 28 43 4b 5f 53 45 53 53 49 4f 4e  xArg)(CK_SESSION
277d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
277e0 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75  , CK_USER_TYPE u
277f0 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38  serType, CK_UTF8
27800 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
27810 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
27820 2c 20 69 6e 74 20 6c 6f 63 6b 5f 6d 75 74 65 78  , int lock_mutex
27830 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
27840 73 6c 6f 74 49 44 3b 0a 09 63 61 63 6b 65 79 5f  slotID;..cackey_
27850 72 65 74 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b  ret get_pin_ret;
27860 0a 09 63 68 61 72 20 70 69 6e 62 75 66 5b 36 34  ..char pinbuf[64
27870 5d 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  ];..int mutex_re
27880 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73  tval;..int tries
27890 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74  _remaining;..int
278a0 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41   login_ret;...CA
278b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
278c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
278d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
278e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
278f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27900 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27910 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27920 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27930 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27940 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
27950 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
27960 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27970 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27980 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
279a0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
279b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
279c0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
279d0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
279e0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
279f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27a00 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
27a10 28 75 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55  (userType != CKU
27a20 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45  _USER) {...CACKE
27a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27a40 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20  Error.  We only 
27a50 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64  support USER mod
27a60 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75  e, asked for %lu
27a70 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e   mode.", (unsign
27a80 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70  ed long) userTyp
27a90 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  e)....return(CKR
27aa0 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c  _USER_TYPE_INVAL
27ab0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f  ID);..}...if (lo
27ac0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75  ck_mutex) {...mu
27ad0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27ae0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
27af0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27b00 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
27b10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
27b20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27b30 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
27b40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27b50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
27b60 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  ERAL_ERROR);...}
27b70 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
27b80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27b90 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
27ba0 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29  .if (lock_mutex)
27bb0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
27bc0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
27bd0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a  _biglock);...}..
27be0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27bf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27c00 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
27c10 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
27c20 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
27c30 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
27c40 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
27c50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27c60 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
27c70 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
27c80 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
27c90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
27ca0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
27cb0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
27cc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27cd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
27ce0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
27cf0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
27d00 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
27d10 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
27d20 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
27d30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  ) {....cackey_mu
27d40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27d50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a  y_biglock);...}.
27d60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
27d70 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
27d80 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
27d90 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
27da0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
27db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27dc0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
27dd0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
27de0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
27df0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
27e00 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69  ", slotID);....i
27e10 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
27e20 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
27e30 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
27e40 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09  iglock);...}....
27e50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
27e60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
27e70 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63  if (cackey_pin_c
27e80 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20  ommand != NULL) 
27e90 7b 0a 09 09 69 66 20 28 70 50 69 6e 20 21 3d 20  {...if (pPin != 
27ea0 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
27eb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27ec0 50 72 6f 74 65 63 74 65 64 20 61 75 74 68 65 6e  Protected authen
27ed0 74 69 63 61 74 69 6f 6e 20 70 61 74 68 20 69 6e  tication path in
27ee0 20 65 66 66 65 63 74 20 61 6e 64 20 50 49 4e 20   effect and PIN 
27ef0 70 72 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a 09  provided !?");..
27f00 09 7d 0a 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65  .}....get_pin_re
27f10 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70  t = cackey_get_p
27f20 69 6e 28 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69  in(pinbuf);....i
27f30 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20 21  f (get_pin_ret !
27f40 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
27f50 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
27f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
27f70 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 29 20 72  ckey_get_pin() r
27f80 65 74 75 72 6e 65 64 20 69 6e 20 66 61 69 6c 75  eturned in failu
27f90 72 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  re, assuming the
27fa0 20 50 49 4e 20 77 61 73 20 69 6e 63 6f 72 72 65   PIN was incorre
27fb0 63 74 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 6c  ct.");.....if (l
27fc0 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
27fd0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27fe0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27ff0 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  ock);....}.....r
28000 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
28010 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
28020 09 70 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38  .pPin = (CK_UTF8
28030 43 48 41 52 5f 50 54 52 29 20 70 69 6e 62 75 66  CHAR_PTR) pinbuf
28040 3b 0a 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73  ;...ulPinLen = s
28050 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09  trlen(pinbuf);..
28060 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
28070 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
28080 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
28090 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
280a0 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
280b0 6e 69 6e 67 2c 20 33 29 3b 0a 09 69 66 20 28 6c  ning, 3);..if (l
280c0 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  ogin_ret != CACK
280d0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
280e0 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
280f0 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  ) {....cackey_mu
28100 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28110 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a  y_biglock);...}.
28120 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ...if (login_ret
28130 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
28140 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43  E_LOCKED) {....C
28150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28160 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65  TF("Error.  Toke
28170 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a  n is locked.");.
28180 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
28190 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
281a0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
281b0 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09  _PIN_LOCKED;....
281c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
281d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
281e0 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28  CKR_PIN_LOCKED (
281f0 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f  %i)", (int) CKR_
28200 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09  PIN_LOCKED);....
28210 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
28220 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73  LOCKED);...} els
28230 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  e if (login_ret 
28240 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
28250 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41  _BADPIN) {....CA
28260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28270 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c  F("Error.  Inval
28280 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63  id PIN.");.....c
28290 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
282a0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
282b0 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
282c0 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69  COUNT_LOW;.....i
282d0 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  f (tries_remaini
282e0 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63  ng == 1) {.....c
282f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
28300 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
28310 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
28320 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a  FINAL_TRY;....}.
28330 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28340 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28350 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  ng CKR_PIN_INCOR
28360 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74  RECT (%i)", (int
28370 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  ) CKR_PIN_INCORR
28380 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ECT);.....return
28390 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
283a0 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  CT);...}....CACK
283b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
283c0 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e  "Error.  Unknown
283d0 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   error returned 
283e0 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  from cackey_logi
283f0 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e  n() (%i)", login
28400 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
28410 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28420 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
28430 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
28440 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28  oken_flags &= ~(
28450 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
28460 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  KED | CKF_USER_P
28470 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43  IN_COUNT_LOW | C
28480 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
28490 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
284a0 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63  _FINAL_TRY);...c
284b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
284c0 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d  Session].state =
284d0 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e   CKS_RO_USER_FUN
284e0 43 54 49 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f  CTIONS;...if (lo
284f0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75  ck_mutex) {...mu
28500 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
28510 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28520 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28530 3b 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ;...if (mutex_re
28540 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
28550 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28560 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
28570 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
28580 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
28590 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
285a0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
285b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
285c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
285d0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
285e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
285f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
28600 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
28610 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49  _Login)(CK_SESSI
28620 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28630 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45  on, CK_USER_TYPE
28640 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54   userType, CK_UT
28650 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
28660 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
28670 65 6e 29 20 7b 0a 09 72 65 74 75 72 6e 28 43 5f  en) {..return(C_
28680 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53  LoginMutexArg(hS
28690 65 73 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 65  ession, userType
286a0 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e  , pPin, ulPinLen
286b0 2c 20 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  , 1));.}..CK_DEF
286c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
286d0 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b  RV, C_Logout)(CK
286e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
286f0 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f  hSession) {..CK_
28700 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
28710 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
28720 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
28730 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28740 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
28750 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
28760 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28770 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28780 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
28790 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
287a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
287b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
287c0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
287d0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
287e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
287f0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
28800 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
28810 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
28820 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28830 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
28840 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
28850 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
28860 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
28870 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28880 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
28890 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
288a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
288b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
288c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
288d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
288e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
288f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
28900 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28910 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
28920 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
28930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28940 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
28950 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28960 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28970 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
28980 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28990 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
289a0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
289b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
289c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
289d0 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ID);..}...slotID
289e0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
289f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
28a00 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
28a10 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
28a20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
28a30 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
28a40 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
28a50 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
28a60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28a70 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
28a80 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
28a90 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
28aa0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
28ab0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
28ac0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
28ad0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
28ae0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
28af0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
28b00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28b10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
28b20 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
28b30 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
28b40 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
28b50 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
28b60 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
28b70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28b80 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
28b90 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28ba0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
28bb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28bc0 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
28bd0 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
28be0 49 4f 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  ION;...if (cacke
28bf0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d  y_pin_command ==
28c00 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
28c10 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
28c20 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
28c30 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
28c40 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  ;..} else {...ca
28c50 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
28c60 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  D].token_flags =
28c70 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
28c80 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28c90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28ca0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28cb0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28cc0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28cd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28ce0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
28cf0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28d00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28d10 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
28d20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28d30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
28d40 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
28d50 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
28d60 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
28d70 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28d80 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  V, C_CreateObjec
28d90 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
28da0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
28db0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
28dc0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
28dd0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
28de0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
28df0 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43  R phObject) {..C
28e00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28e10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
28e20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
28e30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
28e40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28e50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
28e60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
28e70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
28e80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
28e90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
28ea0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28eb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28ec0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28ed0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
28ee0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28ef0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
28f00 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
28f10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28f20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
28f30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
28f40 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  CopyObject)(CK_S
28f50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
28f60 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
28f70 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
28f80 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
28f90 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
28fa0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
28fb0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
28fc0 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74  _PTR phNewObject
28fd0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
28fe0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28ff0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29000 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29010 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29020 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29030 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29040 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29050 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29060 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29070 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29080 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29090 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
290a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
290b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
290c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
290d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
290e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
290f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29100 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29110 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  RV, C_DestroyObj
29120 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
29130 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
29140 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
29150 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41  E hObject) {..CA
29160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29170 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
29180 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
29190 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
291a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
291b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
291c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
291d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
291e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
291f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
29200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29210 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
29220 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29230 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
29240 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29250 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
29260 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
29270 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29280 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
29290 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
292a0 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b  etObjectSize)(CK
292b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
292c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
292d0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
292e0 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ct, CK_ULONG_PTR
292f0 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43   pulSize) {..CAC
29300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29310 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29320 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29330 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29350 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29360 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29370 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29380 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29390 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
293a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
293b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
293c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
293d0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
293e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
293f0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
29400 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
29410 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29420 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29430 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
29440 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
29450 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
29460 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
29470 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
29480 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
29490 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
294a0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
294b0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
294c0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
294d0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
294e0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
294f0 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ty;..unsigned lo
29500 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  ng identity_idx,
29510 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f   attr_idx, sess_
29520 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64  attr_idx, num_id
29530 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  s;..int mutex_re
29540 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74  tval;..CK_RV ret
29550 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43  val = CKR_OK;..C
29560 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75  K_VOID_PTR pValu
29570 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56  e;..CK_ULONG ulV
29580 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45  alueLen;...CACKE
29590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
295a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
295b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
295c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
295d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
295e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
295f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
29600 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
29610 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
29620 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
29630 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
29640 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
29650 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
29660 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
29670 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
29680 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29690 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
296a0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
296b0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
296c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
296d0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
296e0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f  ID);..}...if (hO
296f0 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09  bject == 0) {...
29700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29710 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a  NTF("Error.  Obj
29720 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ect handle out o
29730 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
29740 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
29750 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
29760 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43  D);..}...if (ulC
29770 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  ount == 0) {.../
29780 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c  * Short circuit,
29790 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73   if zero objects
297a0 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20   were specified 
297b0 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d  return zero item
297c0 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f  s immediately */
297d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
297e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
297f0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
29800 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
29810 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
29820 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
29830 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d  .if (pTemplate =
29840 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
29850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29860 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61  "Error.  pTempla
29870 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  te is NULL.");..
29880 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
29890 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
298a0 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d  ..identity_idx =
298b0 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09   hObject - 1;...
298c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
298d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
298e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
298f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
29900 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
29910 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29920 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
29930 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
29940 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
29950 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
29960 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
29970 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29980 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
29990 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
299a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
299b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
299c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
299d0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
299e0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
299f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
29a00 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
29a10 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20  ..}...num_ids = 
29a20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29a30 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
29a40 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66  ties_count;...if
29a50 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e   (identity_idx >
29a60 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63  = num_ids) {...c
29a70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29a80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29a90 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
29aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29ab0 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
29ac0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  e out of range. 
29ad0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20   identity_idx = 
29ae0 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25  %lu, num_ids = %
29af0 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu.", (unsigned 
29b00 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
29b10 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
29b20 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09  ng) num_ids);...
29b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
29b40 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
29b50 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
29b60 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
29b70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29b80 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69  dentities[identi
29b90 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28  ty_idx];...for (
29ba0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
29bb0 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  tr_idx < ulCount
29bc0 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
29bd0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70  ..curr_attr = &p
29be0 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64  Template[attr_id
29bf0 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20  x];....pValue = 
29c00 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
29c10 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
29c20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
29c30 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69  UG_PRINTF("Looki
29c40 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
29c50 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69   0x%08lx (identi
29c60 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75  ty:%lu) ...", (u
29c70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
29c80 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
29c90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
29ca0 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09  dentity_idx);...
29cb0 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
29cc0 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
29cd0 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
29ce0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  y->attributes_co
29cf0 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  unt; sess_attr_i
29d00 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69  dx++) {....if (i
29d10 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
29d20 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
29d30 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f  x].type == curr_
29d40 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  attr->type) {...
29d50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29d60 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e  RINTF(" ... foun
29d70 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25  d it, pValue = %
29d80 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  p, ulValueLen = 
29d90 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  %lu", identity->
29da0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
29db0 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
29dc0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
29dd0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
29de0 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
29df0 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c  );..........pVal
29e00 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61  ue = identity->a
29e10 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
29e20 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b  ttr_idx].pValue;
29e30 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
29e40 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
29e50 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
29e60 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
29e70 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
29e80 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61   (curr_attr->pVa
29e90 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b  lue && pValue) {
29ea0 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
29eb0 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d  r->ulValueLen >=
29ec0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09   ulValueLen) {..
29ed0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
29ee0 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61  ttr->pValue, pVa
29ef0 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29  lue, ulValueLen)
29f00 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
29f10 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
29f20 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
29f30 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
29f40 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
29f50 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72  ....}...}....cur
29f60 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
29f70 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  en = ulValueLen;
29f80 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
29f90 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
29fa0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
29fb0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
29fc0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
29fd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29fe0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29ff0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2a000 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2a010 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2a020 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  ROR);..}...if (r
2a030 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54  etval == CKR_ATT
2a040 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41  RIBUTE_TYPE_INVA
2a050 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  LID) {...CACKEY_
2a060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2a070 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52  turning CKR_ATTR
2a080 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
2a090 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  ID (%i)", (int) 
2a0a0 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
2a0b0 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43   if (retval == C
2a0c0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2a0d0 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ALL) {...CACKEY_
2a0e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2a0f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
2a100 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69  ER_TOO_SMALL (%i
2a110 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
2a120 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
2a130 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29  etval == CKR_OK)
2a140 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a150 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a160 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2a170 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
2a180 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
2a190 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a1a0 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
2a1b0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
2a1c0 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
2a1d0 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
2a1e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2a1f0 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  , C_SetAttribute
2a200 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f  Value)(CK_SESSIO
2a210 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2a220 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
2a230 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
2a240 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
2a250 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2a260 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41  G ulCount) {..CA
2a270 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a280 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2a290 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2a2a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2a2b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a2c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2a2d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2a2e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2a2f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2a300 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2a310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a320 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2a330 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a340 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2a350 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a360 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2a370 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2a380 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a390 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a3a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
2a3b0 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28  indObjectsInit)(
2a3c0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2a3d0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
2a3e0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
2a3f0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
2a400 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f   ulCount) {..CK_
2a410 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
2a420 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09  .CK_ULONG idx;..
2a430 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2a440 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2a450 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2a460 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2a470 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2a480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a490 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a4a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2a4b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a4c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2a4d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a4e0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
2a4f0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
2a500 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2a510 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
2a520 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2a530 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
2a540 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a550 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a560 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
2a570 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2a580 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2a590 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2a5a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2a5b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2a5c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2a5d0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2a5e0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2a5f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a600 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2a610 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2a620 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a630 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a640 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2a650 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a660 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2a670 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a680 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a690 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2a6a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a6b0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2a6c0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2a6d0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2a6e0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2a6f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
2a700 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a710 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
2a720 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2a730 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2a740 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2a750 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a760 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2a770 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63  earch already ac
2a780 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2a790 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2a7a0 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
2a7b0 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
2a7c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2a7d0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
2a7e0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
2a7f0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
2a800 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
2a810 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2a820 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
2a830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a840 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
2a850 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
2a860 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
2a870 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
2a880 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
2a890 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a8a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2a8b0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
2a8c0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
2a8d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a8e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a8f0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
2a900 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
2a910 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
2a920 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
2a930 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
2a940 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2a950 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a960 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2a970 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2a980 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
2a990 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74  ots[slotID].slot
2a9a0 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b  _reset) {...CACK
2a9b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a9c0 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65  "The slot has be
2a9d0 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77  en reset since w
2a9e0 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f  e last looked fo
2a9f0 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20  r identities -- 
2aa00 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09  rescanning");...
2aa10 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2aa20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2aa30 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
2aa40 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66  L) {....cackey_f
2aa50 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63  ree_identities(c
2aa60 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2aa70 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2aa80 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ies, cackey_sess
2aa90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2aaa0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
2aab0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
2aac0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2aad0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
2aae0 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
2aaf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ab00 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2ab10 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20   = 0;...}....if 
2ab20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
2ab30 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e  otID].label != N
2ab40 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  ULL) {....free(c
2ab50 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2ab60 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63  ID].label);....c
2ab70 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2ab80 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ID].label = NULL
2ab90 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
2aba0 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
2abb0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
2abc0 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79  otID]);...cackey
2abd0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73  _slots[slotID].s
2abe0 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
2abf0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
2ac00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ac10 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20  ].identities == 
2ac20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
2ac30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ac40 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
2ac50 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65   cackey_read_ide
2ac60 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f  ntities(&cackey_
2ac70 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26  slots[slotID], &
2ac80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ac90 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2aca0 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a  ties_count);..}.
2acb0 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20  ..if (pTemplate 
2acc0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20  != NULL) {...if 
2acd0 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b  (ulCount != 0) {
2ace0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2acf0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ad00 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
2ad10 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63   = ulCount;....c
2ad20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ad30 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2ad40 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75  query = malloc(u
2ad50 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  lCount * sizeof(
2ad60 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09  *pTemplate));...
2ad70 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
2ad80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ad90 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c  n].search_query,
2ada0 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f   pTemplate, ulCo
2adb0 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54  unt * sizeof(*pT
2adc0 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f  emplate));....fo
2add0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
2ade0 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b  < ulCount; idx++
2adf0 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d  ) {.....if (pTem
2ae00 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
2ae10 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  ueLen == 0) {...
2ae20 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2ae30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2ae40 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
2ae50 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  Value = NULL;...
2ae60 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
2ae70 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
2ae80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ae90 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
2aea0 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61  idx].pValue = ma
2aeb0 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69  lloc(pTemplate[i
2aec0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
2aed0 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
2aee0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2aef0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
2af00 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a  [idx].pValue) {.
2af10 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
2af20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2af30 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2af40 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  ry[idx].pValue, 
2af50 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70  pTemplate[idx].p
2af60 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65  Value, pTemplate
2af70 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
2af80 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  );.....}....}...
2af90 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b  } else {....cack
2afa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2afb0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2afc0 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
2afd0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2afe0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2aff0 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a  h_query = NULL;.
2b000 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
2b010 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30  if (ulCount != 0
2b020 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  ) {....cackey_mu
2b030 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2b040 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
2b050 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b060 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
2b070 72 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66  rch query specif
2b080 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74  ied as NULL, but
2b090 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79   number of query
2b0a0 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69   terms not speci
2b0b0 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09  fied as 0.");...
2b0c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2b0d0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d  UMENTS_BAD);...}
2b0e0 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2b0f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b100 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
2b110 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
2b120 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b130 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d  ].search_query =
2b140 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b   NULL;..}...cack
2b150 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b160 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
2b170 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79  ive = 1;..cackey
2b180 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b190 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
2b1a0 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f  id = 0;...mutex_
2b1b0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2b1c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2b1d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2b1e0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2b1f0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2b200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b210 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2b220 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2b230 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2b240 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2b250 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b260 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2b270 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2b280 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2b290 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  R_OK);.}..static
2b2a0 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73   int cackey_pkcs
2b2b0 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69  11_compare_attri
2b2c0 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55  butes(CK_ATTRIBU
2b2d0 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42  TE *a, CK_ATTRIB
2b2e0 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67  UTE *b) {..unsig
2b2f0 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62  ned char *smallb
2b300 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09  uf, *largebuf;..
2b310 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f  size_t smallbuf_
2b320 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65  len, largebuf_le
2b330 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65  n;...if (a->type
2b340 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09   != b->type) {..
2b350 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
2b360 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b370 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f  INTF("    ... fo
2b380 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70  und matching typ
2b390 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  e ...");...CACKE
2b3a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
2b3b0 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61  ("    ... our va
2b3c0 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65  lue:", a->pValue
2b3d0 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  , a->ulValueLen)
2b3e0 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75  ;...if (b->pValu
2b3f0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
2b400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b410 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
2b420 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61  ound wildcard ma
2b430 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tch");....return
2b440 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d  (1);..}...if (a-
2b450 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29  >pValue == NULL)
2b460 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
2b470 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56  .}.. .if (b->ulV
2b480 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c  alueLen == a->ul
2b490 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63  ValueLen && memc
2b4a0 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d  mp(a->pValue, b-
2b4b0 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61  >pValue, b->ulVa
2b4c0 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a  lueLen) == 0) {.
2b4d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b4e0 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e  RINTF("       ..
2b4f0 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61  . found exact ma
2b500 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tch");....return
2b510 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  (1);..}...switch
2b520 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63   (a->type) {...c
2b530 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a  ase CKA_MODULUS:
2b540 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c  ....if (a->ulVal
2b550 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61  ueLen == b->ulVa
2b560 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72  lueLen) {.....br
2b570 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  eak;....}.....if
2b580 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (a->ulValueLen 
2b590 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  > b->ulValueLen)
2b5a0 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20   {.....smallbuf 
2b5b0 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = b->pValue;....
2b5c0 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20  .smallbuf_len = 
2b5d0 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  b->ulValueLen;..
2b5e0 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61  ....largebuf = a
2b5f0 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61  ->pValue;.....la
2b600 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e  rgebuf_len = a->
2b610 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
2b620 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c   else {.....smal
2b630 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65  lbuf = a->pValue
2b640 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c  ;.....smallbuf_l
2b650 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  en = a->ulValueL
2b660 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75  en;......largebu
2b670 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = b->pValue;..
2b680 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  ...largebuf_len 
2b690 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = b->ulValueLen;
2b6a0 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b  ....}.....for (;
2b6b0 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d   largebuf_len !=
2b6c0 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c   smallbuf_len; l
2b6d0 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62  argebuf++,largeb
2b6e0 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09  uf_len--) {.....
2b6f0 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20  if (largebuf[0] 
2b700 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65  != 0) {......bre
2b710 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ak;.....}....}..
2b720 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f  ...if (largebuf_
2b730 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f  len != smallbuf_
2b740 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  len) {.....break
2b750 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d  ;....}.....if (m
2b760 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20  emcmp(largebuf, 
2b770 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62  smallbuf, smallb
2b780 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a  uf_len) == 0) {.
2b790 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2b7a0 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
2b7b0 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78  ... found approx
2b7c0 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a  imate match");..
2b7d0 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09  ....return(1);..
2b7e0 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
2b7f0 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  }...return(0);.}
2b800 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b810 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
2b820 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45  ndObjects)(CK_SE
2b830 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2b840 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
2b850 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62  _HANDLE_PTR phOb
2b860 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ject, CK_ULONG u
2b870 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c  lMaxObjectCount,
2b880 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2b890 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a  lObjectCount) {.
2b8a0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
2b8b0 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
2b8c0 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
2b8d0 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f  *curr_attr;..CK_
2b8e0 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64  ULONG curr_id_id
2b8f0 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  x, curr_out_id_i
2b900 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64  dx, curr_attr_id
2b910 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
2b920 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63  ;..CK_ULONG matc
2b930 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f  hed_count, prev_
2b940 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09  matched_count;..
2b950 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2b960 3b 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ;.#ifdef CACKEY_
2b970 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45  DEBUG_SEARCH_SPE
2b980 45 44 54 45 53 54 0a 09 73 74 72 75 63 74 20 74  EDTEST..struct t
2b990 69 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e  imeval start, en
2b9a0 64 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61  d;..uint64_t sta
2b9b0 72 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b  rt_int, end_int;
2b9c0 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
2b9d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2b9e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2b9f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2ba00 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2ba10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ba20 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2ba30 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2ba40 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2ba50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2ba60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f  );..}...if (pulO
2ba70 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55  bjectCount == NU
2ba80 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2ba90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2baa0 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f  or.  pulObjectCo
2bab0 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
2bac0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2bad0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2bae0 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20  ...if (phObject 
2baf0 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78  == NULL && ulMax
2bb00 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
2bb10 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
2bb20 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20  ircuit, if zero 
2bb30 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65  objects were spe
2bb40 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65  cified return ze
2bb50 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61  ro items immedia
2bb60 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62  tely */...*pulOb
2bb70 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a  jectCount = 0;..
2bb80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bb90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2bba0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
2bbb0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
2bbc0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
2bbd0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
2bbe0 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
2bbf0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2bc00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2bc10 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20  rror.  phObject 
2bc20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2bc30 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2bc40 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2bc50 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  f (ulMaxObjectCo
2bc60 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  unt == 0) {...CA
2bc70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bc80 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d  F("Error.  Maxim
2bc90 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  um number of obj
2bca0 65 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61  ects specified a
2bcb0 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65  s zero.");....re
2bcc0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2bcd0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2bce0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2bcf0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2bd00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2bd10 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2bd20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2bd30 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2bd40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bd50 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2bd60 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2bd70 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2bd80 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2bd90 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2bda0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2bdb0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2bdc0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2bdd0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2bde0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2bdf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2be00 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2be10 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2be20 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2be30 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2be40 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2be50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2be60 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2be70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2be80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2be90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bea0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2beb0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2bec0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2bed0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2bee0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2bef0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2bf00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2bf10 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
2bf20 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2bf30 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2bf40 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2bf50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bf60 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
2bf70 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
2bf80 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2bf90 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2bfa0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2bfb0 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
2bfc0 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45  DEBUG_SEARCH_SPE
2bfd0 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f  EDTEST..gettimeo
2bfe0 66 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c  fday(&start, NUL
2bff0 4c 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72  L);.#endif...cur
2c000 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30  r_out_id_idx = 0
2c010 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ;..for (curr_id_
2c020 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  idx = cackey_ses
2c030 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c040 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20  search_curr_id; 
2c050 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61  curr_id_idx < ca
2c060 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c070 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2c080 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61  es_count && ulMa
2c090 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75  xObjectCount; cu
2c0a0 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  rr_id_idx++) {..
2c0b0 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b  .curr_id = &cack
2c0c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c0d0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2c0e0 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a  [curr_id_idx];..
2c0f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c100 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e  RINTF("Processin
2c110 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c  g identity:%lu",
2c120 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2c130 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a   curr_id_idx);..
2c140 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  ..matched_count 
2c150 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72  = 0;....for (cur
2c160 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  r_attr_idx = 0; 
2c170 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20  curr_attr_idx < 
2c180 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c190 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2c1a0 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75  _query_count; cu
2c1b0 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  rr_attr_idx++) {
2c1c0 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64  ....prev_matched
2c1d0 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64  _count = matched
2c1e0 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72  _count;.....curr
2c1f0 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f  _attr = &cackey_
2c200 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c210 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
2c220 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a  curr_attr_idx];.
2c230 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c240 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b  _PRINTF("  Check
2c250 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74  ing for attribut
2c260 65 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69  e %s (0x%08lx) i
2c270 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e  n identity:%i...
2c280 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
2c290 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54  FUNC_ATTRIBUTE_T
2c2a0 4f 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d  O_STR(curr_attr-
2c2b0 3e 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65  >type), (unsigne
2c2c0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
2c2d0 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63  r->type, (int) c
2c2e0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09  urr_id_idx);....
2c2f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c300 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65  NTBUF("    Value
2c310 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20   looking for:", 
2c320 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
2c330 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  e, curr_attr->ul
2c340 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66  ValueLen);.....f
2c350 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
2c360 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
2c370 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e  _idx < curr_id->
2c380 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
2c390 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b  ; sess_attr_idx+
2c3a0 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63  +) {.....if (cac
2c3b0 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61  key_pkcs11_compa
2c3c0 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63  re_attributes(&c
2c3d0 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
2c3e0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
2c3f0 5d 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b  ], curr_attr)) {
2c400 0a 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f  ......matched_co
2c410 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65  unt++;.......bre
2c420 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ak;.....}....}..
2c430 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74  .../* If the att
2c440 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74  ribute could not
2c450 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20   be matched, do 
2c460 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68  not try to match
2c470 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72   additional attr
2c480 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20  ibutes */....if 
2c490 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f  (prev_matched_co
2c4a0 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63  unt == matched_c
2c4b0 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61  ount) {.....brea
2c4c0 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  k;....}...}....i
2c4d0 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  f (matched_count
2c4e0 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   == cackey_sessi
2c4f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2c500 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
2c510 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
2c520 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
2c530 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75  . All %i attribu
2c540 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20  tes checked for 
2c550 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64  found, adding id
2c560 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74  entity:%i to ret
2c570 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e  urned list", (in
2c580 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  t) cackey_sessio
2c590 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2c5a0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c  rch_query_count,
2c5b0 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
2c5c0 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63  dx);.....phObjec
2c5d0 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  t[curr_out_id_id
2c5e0 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78  x] = curr_id_idx
2c5f0 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f   + 1;.....ulMaxO
2c600 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09  bjectCount--;...
2c610 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  ..curr_out_id_id
2c620 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  x++;...} else {.
2c630 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c640 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f  PRINTF("  ... No
2c650 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66  t all %i (only f
2c660 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75  ound %i) attribu
2c670 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20  tes checked for 
2c680 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e  found, not addin
2c690 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20  g identity:%i", 
2c6a0 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73  (int) cackey_ses
2c6b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c6c0 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
2c6d0 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65  nt, (int) matche
2c6e0 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  d_count, (int) c
2c6f0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d  urr_id_idx);...}
2c700 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  ..}..cackey_sess
2c710 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c720 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
2c730 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70  curr_id_idx;..*p
2c740 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20  ulObjectCount = 
2c750 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b  curr_out_id_idx;
2c760 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
2c770 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45  DEBUG_SEARCH_SPE
2c780 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f  EDTEST..gettimeo
2c790 66 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29  fday(&end, NULL)
2c7a0 3b 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28  ;..start_int = (
2c7b0 73 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31  start.tv_sec * 1
2c7c0 30 30 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e  000000) + start.
2c7d0 74 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e  tv_usec;..end_in
2c7e0 74 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20  t = (end.tv_sec 
2c7f0 2a 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64  * 1000000) + end
2c800 2e 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e  .tv_usec;..fprin
2c810 74 66 28 73 74 64 65 72 72 2c 20 22 53 65 61 72  tf(stderr, "Sear
2c820 63 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72  ch took %lu micr
2c830 6f 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e  oseconds\n", (un
2c840 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e  signed long) (en
2c850 64 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e  d_int - start_in
2c860 74 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75  t));.#endif...mu
2c870 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2c880 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c890 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c8a0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2c8b0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2c8c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c8d0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2c8e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2c8f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2c900 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2c910 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c920 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2c930 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e  g CKR_OK (%i), n
2c940 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75  um objects = %lu
2c950 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f  ", CKR_OK, *pulO
2c960 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72  bjectCount);...r
2c970 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2c980 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2c990 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
2c9a0 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28  ndObjectsFinal)(
2c9b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c9c0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
2c9d0 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e  K_ULONG idx;..in
2c9e0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2c9f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ca00 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ca10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2ca20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2ca30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ca40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2ca50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2ca60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ca70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2ca80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2ca90 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2caa0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2cab0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2cac0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2cad0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2cae0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2caf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cb00 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2cb10 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2cb20 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2cb30 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2cb40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2cb50 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2cb60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2cb70 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2cb80 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2cb90 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2cba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cbb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2cbc0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2cbd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2cbe0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2cbf0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2cc00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cc10 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2cc20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2cc30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2cc40 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2cc50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2cc60 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2cc70 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2cc80 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2cc90 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2cca0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2ccb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ccc0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
2ccd0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2cce0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2ccf0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2cd00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cd10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2cd20 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e  arch not active.
2cd30 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2cd40 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
2cd50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2cd60 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
2cd70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cd80 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30  earch_active = 0
2cd90 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
2cda0 3b 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  ; idx < cackey_s
2cdb0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cdc0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
2cdd0 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
2cde0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2cdf0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ce00 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
2ce10 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72  .pValue) {....fr
2ce20 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
2ce30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
2ce40 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
2ce50 56 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  Value);...}..}..
2ce60 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2ce70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ce80 65 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09  earch_query) {..
2ce90 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
2cea0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ceb0 73 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09  search_query);..
2cec0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2ced0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2cee0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2cef0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2cf00 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2cf10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2cf20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cf30 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2cf40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2cf50 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2cf60 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
2cf70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2cf80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2cf90 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2cfa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2cfb0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2cfc0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2cfd0 45 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f  EncryptInit)(CK_
2cfe0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2cff0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2d000 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2d010 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2d020 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2d030 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d040 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2d050 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2d060 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2d070 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d080 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2d090 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2d0a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2d0b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2d0c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2d0d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d0e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d0f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d100 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2d110 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d120 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2d130 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2d140 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d150 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2d160 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2d170 5f 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53  _Encrypt)(CK_SES
2d180 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2d190 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2d1a0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2d1b0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2d1c0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2d1d0 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  tedData, CK_ULON
2d1e0 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
2d1f0 65 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41  edDataLen) {..CA
2d200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d210 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2d220 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2d230 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2d240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d250 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2d260 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2d270 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2d280 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2d290 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2d2a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d2b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2d2c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d2d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2d2e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d2f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2d300 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2d310 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2d320 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2d330 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
2d340 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
2d350 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2d360 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2d370 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2d380 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
2d390 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2d3a0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2d3b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
2d3c0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
2d3d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d3e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d3f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d400 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d410 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d420 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d430 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d440 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d450 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d460 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d470 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d480 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d490 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d4a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2d4b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d4c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2d4d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2d4e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d4f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2d500 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2d510 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29   C_EncryptFinal)
2d520 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2d530 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2d540 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e  BYTE_PTR pLastEn
2d550 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2d560 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73  ULONG_PTR pulLas
2d570 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  tEncryptedPartLe
2d580 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2d590 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2d5a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2d5b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d5c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d5d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d5e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d5f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d600 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d610 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d620 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d630 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d640 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2d650 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2d660 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2d670 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d680 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2d690 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d6a0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2d6b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d6c0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e  _RV, C_DecryptIn
2d6d0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2d6e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2d6f0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2d700 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2d710 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2d720 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  ey) {..int mutex
2d730 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d  _retval;...hKey-
2d740 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  -;...CACKEY_DEBU
2d750 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d760 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d770 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d780 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d790 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d7a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d7b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d7c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d7d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d7e0 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
2d7f0 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  m == NULL) {...C
2d800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d810 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
2d820 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29  anism is NULL.")
2d830 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d840 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2d850 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
2d860 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21  ism->mechanism !
2d870 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20  = CKM_RSA_PKCS) 
2d880 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d890 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d8a0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
2d8b0 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66  anism not specif
2d8c0 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50  ied as CKM_RSA_P
2d8d0 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  KCS");....return
2d8e0 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  (CKR_MECHANISM_P
2d8f0 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  ARAM_INVALID);..
2d900 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
2d910 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
2d920 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
2d930 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
2d940 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2d950 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
2d960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d970 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d980 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
2d990 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
2d9a0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2d9b0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2d9c0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2d9d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2d9e0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2d9f0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2da00 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2da10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2da20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2da30 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2da40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2da50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2da60 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2da70 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2da80 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2da90 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2daa0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2dab0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2dac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2dad0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2dae0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2daf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2db00 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2db10 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
2db20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2db30 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2db40 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2db50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2db60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2db70 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2db80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2db90 20 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64    Decrypt alread
2dba0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29  y in progress.")
2dbb0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2dbc0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49  R_OPERATION_ACTI
2dbd0 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b  VE);..}...if (hK
2dbe0 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73  ey >= cackey_ses
2dbf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2dc00 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2dc10 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2dc20 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2dc30 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2dc40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dc50 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68  F("Error.  Key h
2dc60 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
2dc70 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65  ge (requested ke
2dc80 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20  y %lu, only %lu 
2dc90 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c  identities avail
2dca0 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e  able).", (unsign
2dcb0 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28  ed long) hKey, (
2dcc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
2dcd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2dce0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
2dcf0 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  ies_count);....r
2dd00 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
2dd10 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2dd20 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
2dd30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2dd40 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31  crypt_active = 1
2dd50 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
2dd60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2dd70 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20  crypt_mechanism 
2dd80 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  = pMechanism->me
2dd90 63 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79  chanism;..cackey
2dda0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ddb0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
2ddc0 5f 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69  _parm = pMechani
2ddd0 73 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a  sm->pParameter;.
2dde0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2ddf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2de00 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20  pt_mech_parmlen 
2de10 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c  = pMechanism->ul
2de20 50 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63  ParameterLen;..c
2de30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2de40 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2de50 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  _identity = &cac
2de60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2de70 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2de80 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78  s[hKey];...mutex
2de90 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2dea0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2deb0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2dec0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2ded0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2dee0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2def0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2df00 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2df10 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2df20 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2df30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2df40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2df50 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2df60 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2df70 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2df80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2df90 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28  _RV, C_Decrypt)(
2dfa0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2dfb0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2dfc0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2dfd0 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
2dfe0 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61   ulEncryptedData
2dff0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2e000 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2e010 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29  _PTR pulDataLen)
2e020 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74   {..CK_ULONG dat
2e030 61 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74  alen_update, dat
2e040 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f  alen_final;..CK_
2e050 52 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a  RV decrypt_ret;.
2e060 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2e070 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2e080 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e090 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e0a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e0b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e0c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e0d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e0e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e0f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e100 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e110 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65  ...if (pulDataLe
2e120 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
2e130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e140 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61  TF("Error. pulDa
2e150 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  taLen is NULL.")
2e160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e170 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2e180 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64  .}...datalen_upd
2e190 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65  ate = *pulDataLe
2e1a0 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74  n;...decrypt_ret
2e1b0 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61   = C_DecryptUpda
2e1c0 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e  te(hSession, pEn
2e1d0 63 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45  cryptedData, ulE
2e1e0 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
2e1f0 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e   pData, &datalen
2e200 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64  _update);..if (d
2e210 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
2e220 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
2e230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e240 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70  rror.  DecryptUp
2e250 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
2e260 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
2e270 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
2e280 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65  long) decrypt_re
2e290 74 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79  t);....if (decry
2e2a0 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55  pt_ret != CKR_BU
2e2b0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
2e2c0 7b 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74  {..../* Terminat
2e2d0 65 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65  e decryption ope
2e2e0 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75  ration */.....mu
2e2f0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2e300 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2e310 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2e320 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
2e330 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
2e340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e350 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2e360 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2e370 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2e380 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2e390 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
2e3a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e3b0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2e3c0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
2e3d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2e3e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
2e3f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e400 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2e410 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2e420 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
2e430 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2e440 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2e450 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
2e460 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e470 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
2e480 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
2e490 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2e4a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2e4b0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
2e4c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e4d0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
2e4e0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2e4f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2e500 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2e510 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09  ALIZED);....}...
2e520 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2e530 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2e540 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
2e550 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
2e560 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2e570 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2e580 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2e590 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2e5a0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2e5b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e5c0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2e5d0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72  ailed.");......r
2e5e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2e5f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09  L_ERROR);....}..
2e600 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63  .}....return(dec
2e610 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  rypt_ret);..}...
2e620 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70  if (pData) {...p
2e630 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f  Data += datalen_
2e640 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61  update;..}..data
2e650 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c  len_final = *pul
2e660 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65  DataLen - datale
2e670 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72  n_update;...decr
2e680 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
2e690 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f  yptFinal(hSessio
2e6a0 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c  n, pData, &datal
2e6b0 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28  en_final);..if (
2e6c0 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
2e6d0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
2e6e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e6f0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46  Error.  DecryptF
2e700 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
2e710 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
2e720 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
2e730 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65  long) decrypt_re
2e740 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65  t);....return(de
2e750 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a  crypt_ret);..}..
2e760 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64  .*pulDataLen = d
2e770 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20  atalen_update + 
2e780 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a  datalen_final;..
2e790 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e7a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2e7b0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2e7c0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2e7d0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2e7e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2e7f0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55  K_RV, C_DecryptU
2e800 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2e810 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2e820 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e830 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
2e840 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
2e850 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
2e860 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2e870 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
2e880 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  artLen) {..stati
2e890 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36  c CK_BYTE buf[16
2e8a0 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62  384];..ssize_t b
2e8b0 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f  uflen;..CK_SLOT_
2e8c0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52  ID slotID;..CK_R
2e8d0 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  V retval = CKR_G
2e8e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69  ENERAL_ERROR;..i
2e8f0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2e900 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e910 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2e920 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2e930 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2e940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e950 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2e960 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2e970 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e980 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2e990 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2e9a0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
2e9b0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
2e9c0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2e9d0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
2e9e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2e9f0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
2ea00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ea10 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2ea20 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
2ea30 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2ea40 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2ea50 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2ea60 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64  ..if (pEncrypted
2ea70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  Part == NULL && 
2ea80 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2ea90 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  en == 0) {.../* 
2eaa0 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66  Short circuit if
2eab0 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f   we are asked to
2eac0 20 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67   decrypt nothing
2ead0 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ... */...CACKEY_
2eae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2eaf0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2eb00 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
2eb10 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
2eb20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2eb30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72  ;..}...if (pEncr
2eb40 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c  yptedPart == NUL
2eb50 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2eb60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2eb70 72 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  r. pEncryptedPar
2eb80 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75  t is NULL, but u
2eb90 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2eba0 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a  n is not 0.");..
2ebb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2ebc0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2ebd0 0a 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65  ..if (ulEncrypte
2ebe0 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
2ebf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ec00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75  PRINTF("Error. u
2ec10 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2ec20 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72  n is 0, but pPar
2ec30 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  t is not NULL.")
2ec40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ec50 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2ec60 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74  .}...if (pulPart
2ec70 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
2ec80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ec90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
2eca0 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
2ecb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ecc0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2ecd0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2ece0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2ecf0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2ed00 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2ed10 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2ed20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ed30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ed40 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2ed50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ed60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2ed70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2ed80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ed90 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2eda0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2edb0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2edc0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2edd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ede0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2edf0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2ee00 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2ee10 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2ee20 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2ee30 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2ee40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2ee50 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
2ee60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2ee70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2ee80 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2ee90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2eea0 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
2eeb0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2eec0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2eed0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2eee0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  LIZED);..}...slo
2eef0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
2ef00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ef10 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
2ef20 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
2ef30 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
2ef40 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
2ef50 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
2ef60 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2ef70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ef80 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
2ef90 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
2efa0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
2efb0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
2efc0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
2efd0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2efe0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
2eff0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2f000 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
2f010 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f020 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f030 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
2f040 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
2f050 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
2f060 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
2f070 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
2f080 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2f090 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
2f0a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2f0b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
2f0c0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
2f0d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f0e0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69  .decrypt_mechani
2f0f0 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  sm) {...case CKM
2f100 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
2f110 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63   Ask card to dec
2f120 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65  rypt */....bufle
2f130 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
2f140 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
2f150 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
2f160 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f170 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2f180 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79  identity, pEncry
2f190 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72  ptedPart, ulEncr
2f1a0 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75  yptedPartLen, bu
2f1b0 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  f, sizeof(buf), 
2f1c0 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62  0, 1);.....if (b
2f1d0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2f1e0 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
2f1f0 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63   && cackey_pin_c
2f200 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20  ommand != NULL) 
2f210 7b 0a 09 09 09 09 69 66 20 28 43 5f 4c 6f 67 69  {.....if (C_Logi
2f220 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69  nMutexArg(hSessi
2f230 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55  on, CKU_USER, NU
2f240 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52  LL, 0, 0) == CKR
2f250 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c  _OK) {......bufl
2f260 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
2f270 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
2f280 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63  slots[slotID], c
2f290 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2f2a0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2f2b0 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72  _identity, pEncr
2f2c0 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63  yptedPart, ulEnc
2f2d0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62  ryptedPartLen, b
2f2e0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c  uf, sizeof(buf),
2f2f0 20 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09   0, 1);.....}...
2f300 09 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  .}.....if (bufle
2f310 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
2f320 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65  Decryption faile
2f330 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75  d. */.....if (bu
2f340 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2f350 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
2f360 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2f370 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
2f380 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
2f390 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d  lse if (buflen =
2f3a0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2f3b0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
2f3c0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2f3d0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
2f3e0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
2f3f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f400 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
2f410 6f 20 73 65 6e 64 20 41 50 44 55 2c 20 65 72 72  o send APDU, err
2f420 6f 72 20 3d 20 25 6c 69 22 2c 20 28 6c 6f 6e 67  or = %li", (long
2f430 20 69 6e 74 29 20 62 75 66 6c 65 6e 29 3b 0a 0a   int) buflen);..
2f440 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
2f450 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
2f460 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
2f470 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
2f480 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20  long) buflen) > 
2f490 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70  *pulPartLen && p
2f4a0 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44  Part) {...../* D
2f4b0 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f  ecrypted data to
2f4c0 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72  o large */.....r
2f4d0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2f4e0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
2f4f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
2f500 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09   (pPart) {......
2f510 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75  memcpy(pPart, bu
2f520 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
2f530 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c  }......*pulPartL
2f540 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09  en = buflen;....
2f550 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
2f560 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
2f570 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
2f580 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2f590 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2f5a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2f5b0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2f5c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2f5d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f5e0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2f5f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2f600 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2f610 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2f620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f630 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
2f640 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
2f650 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
2f660 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2f670 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2f680 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _DecryptFinal)(C
2f690 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2f6a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2f6b0 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74  TE_PTR pLastPart
2f6c0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2f6d0 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b  ulLastPartLen) {
2f6e0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2f6f0 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  al;..int termina
2f700 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a  te_decrypt = 1;.
2f710 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f720 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2f730 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2f740 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2f750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f760 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2f770 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2f780 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f790 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2f7a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2f7b0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2f7c0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2f7d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2f7e0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2f7f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2f800 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2f810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f820 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2f830 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2f840 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2f850 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2f860 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2f870 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74  .if (pulLastPart
2f880 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
2f890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f8a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
2f8b0 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e  LastPartLen is N
2f8c0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2f8d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2f8e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
2f8f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2f900 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2f910 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2f920 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2f930 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2f940 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f950 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2f960 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2f970 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2f980 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2f990 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2f9a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2f9b0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2f9c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2f9d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2f9e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f9f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2fa00 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2fa10 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2fa20 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2fa30 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2fa40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2fa50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2fa60 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
2fa70 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2fa80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2fa90 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2faa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fab0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
2fac0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2fad0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2fae0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2faf0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2fb00 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  .*pulLastPartLen
2fb10 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73   = 0;...if (pLas
2fb20 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tPart == NULL) {
2fb30 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  ...terminate_dec
2fb40 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  rypt = 0;..}...i
2fb50 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  f (terminate_dec
2fb60 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  rypt) {...cackey
2fb70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2fb80 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2fb90 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
2fba0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2fbb0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2fbc0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2fbd0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2fbe0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2fbf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fc00 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2fc10 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2fc20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2fc30 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2fc40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fc50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2fc60 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2fc70 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2fc80 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2fc90 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2fca0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49  CK_RV, C_DigestI
2fcb0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2fcc0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2fcd0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2fce0 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  R pMechanism) {.
2fcf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fd00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2fd10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2fd20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2fd30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fd40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2fd50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2fd60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2fd70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2fd80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2fd90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fda0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2fdb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fdc0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2fdd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fde0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2fdf0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2fe00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fe10 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2fe20 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2fe30 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53  C_Digest)(CK_SES
2fe40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2fe50 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2fe60 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2fe70 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2fe80 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
2fe90 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2fea0 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
2feb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fec0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2fed0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2fee0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2fef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ff00 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ff10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2ff20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2ff30 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2ff40 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2ff50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ff60 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2ff70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ff80 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2ff90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ffa0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2ffb0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2ffc0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ffd0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2ffe0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2fff0 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  _DigestUpdate)(C
30000 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30010 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
30020 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
30030 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
30040 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
30050 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
30060 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
30070 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
30080 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
300a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
300b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
300c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
300d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
300e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
300f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
30100 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
30110 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
30120 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
30130 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30140 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
30150 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30160 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
30170 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
30180 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29  RV, C_DigestKey)
30190 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
301a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
301b0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
301c0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
301d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
301e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
301f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
30200 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30210 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30220 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
30230 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
30240 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
30250 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
30260 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
30270 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30280 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
30290 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
302a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
302b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
302c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
302d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
302e0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
302f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
30300 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69  K_RV, C_DigestFi
30310 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
30320 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
30330 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
30340 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
30350 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
30360 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
30370 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
30380 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
30390 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
303a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
303b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
303c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
303d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
303e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
303f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
30400 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30410 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30420 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30430 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
30440 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
30450 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
30460 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
30470 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30480 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
30490 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
304a0 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43  V, C_SignInit)(C
304b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
304c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
304d0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
304e0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
304f0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
30500 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
30510 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
30520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30530 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30540 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
30550 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
30560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30570 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
30580 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
30590 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
305a0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
305b0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
305c0 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
305d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
305e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
305f0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
30600 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
30610 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
30620 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
30630 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
30640 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
30650 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
30660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30670 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
30680 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
30690 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
306a0 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
306b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
306c0 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
306d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
306e0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
306f0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
30700 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
30710 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
30720 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
30730 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
30740 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30750 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
30760 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
30770 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
30780 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
30790 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
307a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
307b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
307c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
307d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
307e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
307f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30800 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
30810 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
30820 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
30830 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
30840 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
30850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30860 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
30870 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
30880 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
30890 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
308a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
308b0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
308c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
308d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
308e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
308f0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
30900 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30910 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
30920 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
30930 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
30940 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
30950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30960 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61  ("Error.  Sign a
30970 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
30980 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
30990 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
309a0 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
309b0 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
309c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
309d0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
309e0 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
309f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
30a00 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
30a10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30a20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30a30 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
30a40 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
30a50 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
30a60 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
30a70 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
30a80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
30a90 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
30aa0 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
30ab0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
30ac0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
30ad0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
30ae0 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
30af0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
30b00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30b10 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
30b20 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73   1;...cackey_ses
30b30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30b40 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  sign_mechanism =
30b50 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
30b60 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79  hanism;...cackey
30b70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
30b80 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
30b90 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73  = 128;..cackey_s
30ba0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30bb0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
30bc0 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   0;..cackey_sess
30bd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
30be0 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  ign_buf = malloc
30bf0 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
30c00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
30c10 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
30c20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
30c30 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
30c40 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  flen);...CACKEY_
30c50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
30c60 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69  ssion %lu sign_i
30c70 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69  dentity is %p (i
30c80 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20  dentity #%lu)", 
30c90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
30ca0 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20  hSession, (void 
30cb0 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  *) &cackey_sessi
30cc0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
30cd0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20  entities[hKey], 
30ce0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
30cf0 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73  hKey);..cackey_s
30d00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
30d10 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  ].sign_identity 
30d20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
30d30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
30d40 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
30d50 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
30d60 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
30d70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
30d80 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
30d90 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
30da0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30db0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
30dc0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
30dd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30de0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
30df0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
30e00 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
30e10 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
30e20 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
30e30 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
30e40 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30e50 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
30e60 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
30e70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
30e80 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
30e90 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
30ea0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
30eb0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
30ec0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
30ed0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75  gnatureLen) {..u
30ee0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61  nsigned long sta
30ef0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
30f00 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74  ..CK_RV sign_ret
30f10 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
30f20 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
30f30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
30f40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
30f50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
30f60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30f70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30f80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
30f90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
30fa0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
30fb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
30fc0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
30fd0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
30fe0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
30ff0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
31000 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
31010 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
31020 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31030 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
31040 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
31050 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
31060 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
31070 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
31080 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e  ..}...start_sign
31090 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65  _bufused = cacke
310a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
310b0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
310c0 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  d;...sign_ret = 
310d0 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
310e0 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
310f0 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
31100 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
31110 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
31120 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31130 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
31140 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
31150 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
31160 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
31170 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66  sign_ret);....if
31180 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
31190 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
311a0 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72  LL) {....mutex_r
311b0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
311c0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
311d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
311e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
311f0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
31200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31210 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
31220 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
31230 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
31240 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
31250 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
31260 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31270 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
31280 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
31290 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
312a0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
312b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
312c0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
312d0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
312e0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
312f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
31300 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
31310 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
31320 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
31330 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
31340 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
31350 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
31360 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
31370 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31380 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
31390 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
313a0 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
313b0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
313c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
313d0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
313e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
313f0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
31400 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  ;.....mutex_retv
31410 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
31420 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
31430 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
31440 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
31450 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
31460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31470 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
31480 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
31490 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
314a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
314b0 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73  ...}....return(s
314c0 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73  ign_ret);..}...s
314d0 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e  ign_ret = C_Sign
314e0 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
314f0 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53  pSignature, pulS
31500 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69  ignatureLen);..i
31510 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
31520 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73  KR_OK) {...if (s
31530 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42  ign_ret == CKR_B
31540 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
31550 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
31560 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46  UG_PRINTF("SignF
31570 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
31580 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
31590 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c  MALL (rv = %lu),
315a0 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55   undoing C_SignU
315b0 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67  pdate()", (unsig
315c0 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
315d0 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  et);.....cackey_
315e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
315f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
31600 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
31610 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e  used;.....return
31620 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a  (sign_ret);...}.
31630 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31640 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
31650 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
31660 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
31670 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
31680 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
31690 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
316a0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
316b0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d  if (pSignature =
316c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
316d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
316e0 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63  "pSignature spec
316f0 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75  ified as NULL, u
31700 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
31710 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b  ate()");....cack
31720 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31730 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
31740 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f  ed = start_sign_
31750 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75  bufused;....retu
31760 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
31770 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31780 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
31790 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
317a0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
317b0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
317c0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
317d0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70  (CK_RV, C_SignUp
317e0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
317f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
31800 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
31810 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
31820 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
31830 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
31840 6e 74 20 72 65 73 69 7a 65 52 65 74 72 79 3b 0a  nt resizeRetry;.
31850 09 69 6e 74 20 6e 65 65 64 52 65 73 69 7a 65 3b  .int needResize;
31860 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31870 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
31880 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
31890 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
318a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
318b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
318c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
318d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
318e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
318f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
31900 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
31910 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
31920 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
31930 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
31940 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
31950 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
31960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31970 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
31980 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
31990 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
319a0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
319b0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
319c0 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
319d0 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e  ULL && ulPartLen
319e0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
319f0 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
31a00 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73  e are asked to s
31a10 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ign nothing... *
31a20 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
31a30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
31a40 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
31a50 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
31a60 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
31a70 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
31a80 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
31a90 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
31aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31ab0 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55  ror. pPart is NU
31ac0 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65  LL, but ulPartLe
31ad0 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a  n is not 0.");..
31ae0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
31af0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
31b00 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20  ..if (ulPartLen 
31b10 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
31b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31b30 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20  rror. ulPartLen 
31b40 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
31b50 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
31b60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
31b70 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
31b80 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
31b90 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
31ba0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
31bb0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
31bc0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
31bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31be0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
31bf0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
31c00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
31c10 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
31c20 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
31c30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31c40 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
31c50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
31c60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
31c70 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
31c80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31c90 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
31ca0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
31cb0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
31cc0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
31cd0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
31ce0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
31cf0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
31d00 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
31d10 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
31d20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
31d30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31d40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
31d50 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
31d60 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
31d70 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
31d80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
31d90 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
31da0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
31db0 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
31dc0 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
31dd0 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
31de0 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72  * Accumulate dir
31df0 65 63 74 6c 79 20 2a 2f 0a 09 09 09 66 6f 72 20  ectly */....for 
31e00 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d 20 30  (resizeRetry = 0
31e10 3b 20 72 65 73 69 7a 65 52 65 74 72 79 20 3c 20  ; resizeRetry < 
31e20 31 31 3b 20 72 65 73 69 7a 65 52 65 74 72 79 2b  11; resizeRetry+
31e30 2b 29 20 7b 0a 09 09 09 09 6e 65 65 64 52 65 73  +) {.....needRes
31e40 69 7a 65 20 3d 20 30 3b 0a 09 09 09 09 69 66 20  ize = 0;.....if 
31e50 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ((cackey_session
31e60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31e70 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72  _bufused + ulPar
31e80 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73  tLen) > cackey_s
31e90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
31ea0 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b  ].sign_buflen) {
31eb0 0a 09 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65  ......needResize
31ec0 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   = 1;.....}.....
31ed0 09 69 66 20 28 21 6e 65 65 64 52 65 73 69 7a 65  .if (!needResize
31ee0 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
31ef0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
31f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31f10 52 65 73 69 7a 69 6e 67 20 73 69 67 6e 69 6e 67  Resizing signing
31f20 20 62 75 66 66 65 72 20 28 74 72 79 20 23 25 69   buffer (try #%i
31f30 20 6f 66 20 31 30 20 2d 2d 20 31 31 74 68 20 69   of 10 -- 11th i
31f40 73 20 66 61 74 61 6c 29 22 2c 20 72 65 73 69 7a  s fatal)", resiz
31f50 65 52 65 74 72 79 29 3b 0a 0a 09 09 09 09 69 66  eRetry);......if
31f60 20 28 72 65 73 69 7a 65 52 65 74 72 79 20 3d 3d   (resizeRetry ==
31f70 20 31 30 29 20 7b 0a 09 09 09 09 09 66 72 65 65   10) {......free
31f80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
31f90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31fa0 62 75 66 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b  buf);.......cack
31fb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31fc0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
31fd0 6e 20 3d 20 30 3b 0a 09 09 09 09 09 63 61 63 6b  n = 0;......cack
31fe0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31ff0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
32000 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 62 72 65   NULL;.......bre
32010 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ak;.....}......c
32020 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32030 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
32040 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09  flen *= 2;......
32050 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32060 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
32070 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63  uf = realloc(cac
32080 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32090 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
320a0 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f   sizeof(*cackey_
320b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
320c0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
320d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
320e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
320f0 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  flen);....}.....
32100 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
32110 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32120 67 6e 5f 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  gn_buf == NULL) 
32130 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
32140 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
32150 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
32160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
32170 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
32180 6e 69 6e 67 20 62 75 66 66 65 72 20 69 73 20 4e  ning buffer is N
32190 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  ULL.");......ret
321a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
321b0 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
321c0 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
321d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
321e0 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63  ].sign_buf + cac
321f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32200 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
32210 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61  sed, pPart, ulPa
32220 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b  rtLen);.....cack
32230 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32240 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
32250 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b  ed += ulPartLen;
32260 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
32270 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
32280 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
32290 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
322a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
322b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
322c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
322d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
322e0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
322f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
32300 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
32310 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
32320 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
32330 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
32340 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
32350 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
32360 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
32370 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
32380 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  nFinal)(CK_SESSI
32390 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
323a0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
323b0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
323c0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
323d0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61  atureLen) {..sta
323e0 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62  tic CK_BYTE sigb
323f0 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65  uf[1024];..ssize
32400 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43  _t sigbuflen;..C
32410 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
32420 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
32430 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
32440 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  ROR;..int termin
32450 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69  ate_sign = 1;..i
32460 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
32470 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
32480 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
32490 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
324a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
324b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
324c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
324d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
324e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
324f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
32500 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
32510 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72  .if (pulSignatur
32520 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  eLen == NULL) {.
32530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
32550 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73  lSignatureLen is
32560 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
32570 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
32580 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
32590 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
325a0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
325b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
325c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
325d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
325e0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
325f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
32600 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
32610 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
32620 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
32630 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
32640 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
32650 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
32660 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
32670 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
32680 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
32690 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
326a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
326b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
326c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
326d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
326e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
326f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
32700 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
32710 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
32720 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
32730 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
32740 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32750 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
32760 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
32770 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
32780 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
32790 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
327a0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
327b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
327c0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
327d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
327e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
327f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
32800 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32810 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
32820 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
32830 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
32840 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
32850 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c  ALIZED);..}...sl
32860 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
32870 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32880 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
32890 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
328a0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
328b0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
328c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
328d0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
328e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
328f0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
32900 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
32910 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
32920 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
32930 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
32940 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
32950 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
32960 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
32970 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
32980 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32990 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
329a0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
329b0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
329c0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
329d0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
329e0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
329f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
32a00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
32a10 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
32a20 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
32a30 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
32a40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32a50 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
32a60 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
32a70 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
32a80 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20  sk card to sign 
32a90 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  */....CACKEY_DEB
32aa0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e  UG_PRINTF("Askin
32ab0 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69  g to sign from i
32ac0 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65  dentity %p in se
32ad0 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69  ssion %lu", (voi
32ae0 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73  d *) cackey_sess
32af0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32b00 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75  ign_identity, (u
32b10 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53  nsigned long) hS
32b20 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62  ession);....sigb
32b30 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
32b40 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
32b50 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
32b60 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
32b70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
32b80 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65  _identity, cacke
32b90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32ba0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63  ion].sign_buf, c
32bb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32bc0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
32bd0 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73  fused, sigbuf, s
32be0 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31  izeof(sigbuf), 1
32bf0 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69  , 0);.....if (si
32c00 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  gbuflen == CACKE
32c10 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
32c20 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e  IN && cackey_pin
32c30 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
32c40 29 20 7b 0a 09 09 09 09 69 66 20 28 43 5f 4c 6f  ) {.....if (C_Lo
32c50 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73  ginMutexArg(hSes
32c60 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20  sion, CKU_USER, 
32c70 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43  NULL, 0, 0) == C
32c80 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 69  KR_OK) {......si
32c90 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  gbuflen = cackey
32ca0 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
32cb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
32cc0 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
32cd0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32ce0 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63  gn_identity, cac
32cf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32d00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
32d10 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
32d20 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
32d30 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c  bufused, sigbuf,
32d40 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c   sizeof(sigbuf),
32d50 20 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09 09   1, 0);.....}...
32d60 09 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75  .}.....if (sigbu
32d70 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09  flen < 0) {.....
32d80 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65  /* Signing faile
32d90 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69  d. */.....if (si
32da0 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  gbuflen == CACKE
32db0 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
32dc0 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  IN) {......retva
32dd0 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54  l = CKR_USER_NOT
32de0 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09  _LOGGED_IN;.....
32df0 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75  } else if (sigbu
32e00 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
32e10 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
32e20 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  T) {......retval
32e30 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45   = CKR_DEVICE_RE
32e40 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73  MOVED;.....} els
32e50 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  e {......retval 
32e60 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
32e70 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  ROR;.....}....} 
32e80 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67  else if (((unsig
32e90 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
32ea0 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61  len) > *pulSigna
32eb0 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e  tureLen && pSign
32ec0 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20  ature) {...../* 
32ed0 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20  Signed data too 
32ee0 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43  large */.....CAC
32ef0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32f00 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ("retval = CKR_B
32f10 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
32f20 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c    sigbuflen = %l
32f30 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  u, pulSignatureL
32f40 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69  en = %lu", (unsi
32f50 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
32f60 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20  flen, (unsigned 
32f70 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74  long) *pulSignat
32f80 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65  ureLen);......re
32f90 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
32fa0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09  R_TOO_SMALL;....
32fb0 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
32fc0 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20   = 0;....} else 
32fd0 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  {.....terminate_
32fe0 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69  sign = 0;......i
32ff0 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b  f (pSignature) {
33000 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69  ......memcpy(pSi
33010 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c  gnature, sigbuf,
33020 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09   sigbuflen);....
33030 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
33040 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09  n = 1;.....}....
33050 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  ..*pulSignatureL
33060 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a  en = sigbuflen;.
33070 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
33080 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  R_OK;....}.....b
33090 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74  reak;..}...if (t
330a0 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b  erminate_sign) {
330b0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
330c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
330d0 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09  .sign_buf) {....
330e0 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
330f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
33100 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09  ign_buf);...}...
33110 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
33120 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
33130 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
33140 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
33150 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
33160 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
33170 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
33180 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
33190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
331a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
331b0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
331c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
331d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
331e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
331f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
33200 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
33210 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
33220 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
33230 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
33240 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65  (CK_RV, C_SignRe
33250 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
33260 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
33270 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
33280 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
33290 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
332a0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
332b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
332c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
332d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
332e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
332f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33300 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
33310 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
33320 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
33330 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
33340 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
33350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33360 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
33370 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33380 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
33390 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
333a0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
333b0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
333c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
333d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
333e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
333f0 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ignRecover)(CK_S
33400 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33410 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
33420 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
33430 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
33440 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
33450 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
33460 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
33470 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
33480 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
33490 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
334a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
334b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
334c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
334d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
334e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
334f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
33500 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
33510 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
33520 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
33530 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
33540 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
33550 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
33560 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33570 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
33580 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33590 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
335a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
335b0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49  CK_RV, C_VerifyI
335c0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
335d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
335e0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
335f0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
33600 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
33610 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
33620 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
33630 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
33640 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
33650 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
33660 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
33670 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
33680 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
33690 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
336a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
336b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
336c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
336d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
336e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
336f0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
33700 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33710 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
33720 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33730 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
33740 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
33750 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29  CK_RV, C_Verify)
33760 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33770 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33780 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
33790 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
337a0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
337b0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
337c0 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
337d0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
337e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
337f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
33800 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
33810 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
33820 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
33830 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
33840 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
33850 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
33860 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
33870 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
33880 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
33890 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
338a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
338b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
338c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
338d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
338e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
338f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
33900 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
33910 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55  CK_RV, C_VerifyU
33920 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
33930 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33940 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
33950 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
33960 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
33970 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33980 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
33990 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
339a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
339b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
339c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
339d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
339e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
339f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
33a00 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
33a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33a20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
33a30 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33a40 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
33a50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
33a60 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
33a70 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
33a80 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
33a90 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
33aa0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
33ab0 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45  rifyFinal)(CK_SE
33ac0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
33ad0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
33ae0 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
33af0 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74  K_ULONG ulSignat
33b00 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ureLen) {..CACKE
33b10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
33b20 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
33b30 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
33b40 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
33b50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
33b60 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
33b70 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
33b80 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
33b90 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
33ba0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
33bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
33bc0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
33bd0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33be0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
33bf0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33c00 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
33c10 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
33c20 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
33c30 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
33c40 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
33c50 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43  fyRecoverInit)(C
33c60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
33c70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
33c80 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
33c90 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
33ca0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
33cb0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33cc0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
33cd0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
33ce0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
33cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33d00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
33d10 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
33d20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
33d30 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
33d40 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
33d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33d60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
33d70 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33d80 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
33d90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33da0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
33db0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
33dc0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33dd0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
33de0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
33df0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
33e00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
33e10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
33e20 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
33e30 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
33e40 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43  lSignatureLen, C
33e50 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
33e60 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
33e70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41  ulDataLen) {..CA
33e80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33e90 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
33ea0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
33eb0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
33ec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
33ed0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
33ee0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
33ef0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
33f00 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
33f10 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
33f20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
33f30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
33f40 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33f50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
33f60 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33f70 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
33f80 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
33f90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33fa0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
33fb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
33fc0 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
33fd0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
33fe0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
33ff0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
34000 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
34010 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
34020 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
34030 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
34040 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
34050 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
34060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
34070 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
34080 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
34090 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
340a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
340b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
340c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
340d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
340e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
340f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
34100 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
34110 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
34120 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
34130 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
34140 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34150 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
34160 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34170 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
34180 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
34190 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
341a0 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b  DigestUpdate)(CK
341b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
341c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
341d0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
341e0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
341f0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
34200 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
34210 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
34220 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
34230 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34240 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
34250 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
34260 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
34270 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34280 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
34290 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
342a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
342b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
342c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
342d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
342e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
342f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34300 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
34310 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34320 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
34330 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
34340 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34350 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
34360 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
34370 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70   C_SignEncryptUp
34380 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
34390 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
343a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
343b0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
343c0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
343d0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
343e0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
343f0 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
34400 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
34410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
34420 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
34430 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
34440 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
34450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
34460 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
34470 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
34480 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
34490 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
344a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
344b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
344c0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
344d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
344e0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
344f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34500 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
34510 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34520 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
34530 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
34540 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
34550 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28  ptVerifyUpdate)(
34560 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
34570 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
34580 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
34590 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
345a0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
345b0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
345c0 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
345d0 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29  _PTR pulPartLen)
345e0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
345f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34600 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
34610 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
34620 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34630 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
34640 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
34650 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
34660 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
34670 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34680 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34690 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
346a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
346b0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
346c0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
346d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
346e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
346f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34700 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
34710 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
34720 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
34730 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
34740 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
34750 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
34760 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
34770 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
34780 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
34790 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
347a0 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
347b0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
347c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
347d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
347e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
347f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
34800 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
34810 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
34820 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
34830 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
34840 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
34850 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
34860 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
34870 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
34880 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
34890 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
348a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
348b0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
348c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
348d0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
348e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
348f0 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
34900 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53  eKeyPair)(CK_SES
34910 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
34920 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
34930 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
34940 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
34950 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65  PTR pPublicKeyTe
34960 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
34970 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72   ulPublicKeyAttr
34980 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41  ibuteCount, CK_A
34990 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72  TTRIBUTE_PTR pPr
349a0 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65  ivateKeyTemplate
349b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69  , CK_ULONG ulPri
349c0 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65  vateKeyAttribute
349d0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
349e0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75  _HANDLE_PTR phPu
349f0 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  blicKey, CK_OBJE
34a00 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
34a10 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43  PrivateKey) {..C
34a20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34a30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
34a40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
34a50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
34a60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34a70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
34a80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
34a90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
34aa0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
34ab0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
34ac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34ad0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
34ae0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34af0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
34b00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
34b10 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
34b20 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
34b30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
34b40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
34b50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
34b60 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  WrapKey)(CK_SESS
34b70 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
34b80 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
34b90 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
34ba0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
34bb0 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c  LE hWrappingKey,
34bc0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
34bd0 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  E hKey, CK_BYTE_
34be0 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
34bf0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
34c00 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20  lWrappedKeyLen) 
34c10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
34c20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
34c30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
34c40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
34c50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34c60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
34c70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
34c80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
34c90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
34ca0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
34cb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34cc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
34cd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34ce0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
34cf0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
34d00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
34d10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
34d20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34d30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
34d40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
34d50 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43  , C_UnwrapKey)(C
34d60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
34d70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
34d80 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
34d90 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
34da0 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70  T_HANDLE hUnwrap
34db0 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45  pingKey, CK_BYTE
34dc0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
34dd0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61  , CK_ULONG ulWra
34de0 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41  ppedKeyLen, CK_A
34df0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
34e00 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
34e10 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
34e20 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
34e30 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
34e40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34e50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
34e60 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
34e70 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
34e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34e90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
34ea0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
34eb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
34ec0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
34ed0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
34ee0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34ef0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
34f00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34f10 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
34f20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34f30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
34f40 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
34f50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34f60 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
34f70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
34f80 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b   C_DeriveKey)(CK
34f90 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34fa0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
34fb0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
34fc0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
34fd0 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79  _HANDLE hBaseKey
34fe0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
34ff0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
35000 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75  _ULONG ulAttribu
35010 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
35020 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
35030 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
35040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
35050 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
35060 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
35070 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
35080 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
35090 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
350a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
350b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
350c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
350d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
350e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
350f0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
35100 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
35110 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
35120 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
35130 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
35140 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
35150 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
35160 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
35170 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e  CK_RV, C_SeedRan
35180 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  dom)(CK_SESSION_
35190 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
351a0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65   CK_BYTE_PTR pSe
351b0 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  ed, CK_ULONG ulS
351c0 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  eedLen) {..CACKE
351d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
351e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
351f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
35200 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
35210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
35220 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
35230 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
35240 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
35250 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
35260 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
35270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
35280 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
35290 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
352a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
352b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
352c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
352d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
352e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
352f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
35300 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
35310 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  rateRandom)(CK_S
35320 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
35330 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
35340 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c  PTR pRandomData,
35350 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64   CK_ULONG ulRand
35360 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  omLen) {..CACKEY
35370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
35380 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
35390 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
353a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
353b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
353c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
353d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
353e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
353f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
35400 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
35410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
35420 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
35430 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
35440 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
35450 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
35460 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
35470 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
35480 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f  SUPPORTED);.}../
35490 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
354a0 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
354b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
354c0 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
354d0 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49  Status)(CK_SESSI
354e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
354f0 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
35500 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
35510 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
35520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
35530 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
35540 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
35550 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
35560 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
35570 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
35580 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
35590 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
355a0 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
355b0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
355c0 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
355d0 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70  ing */.}../* Dep
355e0 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  recated Function
355f0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
35600 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
35610 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28  CancelFunction)(
35620 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
35630 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
35640 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35650 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
35660 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35670 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
35680 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35690 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
356a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
356b0 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
356c0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
356d0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
356e0 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
356f0 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
35700 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
35710 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
35720 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
35730 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
35740 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43  tFunctionList)(C
35750 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
35760 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69  PTR_PTR ppFuncti
35770 6f 6e 4c 69 73 74 29 20 7b 0a 09 73 74 61 74 69  onList) {..stati
35780 63 20 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  c CK_FUNCTION_LI
35790 53 54 5f 50 54 52 20 73 70 46 75 6e 63 74 69 6f  ST_PTR spFunctio
357a0 6e 4c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 43  nList = NULL;..C
357b0 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
357c0 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  PTR pFunctionLis
357d0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
357e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
357f0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e  .");...if (ppFun
35800 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c  ctionList == NUL
35810 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
35820 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
35830 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r. ppFunctionLis
35840 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
35850 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
35860 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
35870 09 69 66 20 28 73 70 46 75 6e 63 74 69 6f 6e 4c  .if (spFunctionL
35880 69 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist != NULL) {..
35890 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  .*ppFunctionList
358a0 20 3d 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73   = spFunctionLis
358b0 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  t;....CACKEY_DEB
358c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
358d0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
358e0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
358f0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
35900 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  }...pFunctionLis
35910 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  t = malloc(sizeo
35920 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  f(*pFunctionList
35930 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ));...pFunctionL
35940 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a  ist->version.maj
35950 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
35960 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
35970 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78  ODE) >> 16) & 0x
35980 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ff;..pFunctionLi
35990 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f  st->version.mino
359a0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
359b0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
359c0 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  DE) >> 8) & 0xff
359d0 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ;...pFunctionLis
359e0 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20  t->C_Initialize 
359f0 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a  = C_Initialize;.
35a00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35a10 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46  C_Finalize = C_F
35a20 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74  inalize;..pFunct
35a30 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e  ionList->C_GetIn
35a40 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a  fo = C_GetInfo;.
35a50 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35a60 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20  C_GetSlotList = 
35a70 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09  C_GetSlotList;..
35a80 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35a90 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43  _GetSlotInfo = C
35aa0 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70  _GetSlotInfo;..p
35ab0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35ac0 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43  GetTokenInfo = C
35ad0 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09  _GetTokenInfo;..
35ae0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35af0 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
35b00 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  t = C_WaitForSlo
35b10 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69  tEvent;..pFuncti
35b20 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
35b30 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47  hanismList = C_G
35b40 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b  etMechanismList;
35b50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35b60 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49  >C_GetMechanismI
35b70 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61  nfo = C_GetMecha
35b80 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  nismInfo;..pFunc
35b90 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
35ba0 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f  Token = C_InitTo
35bb0 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ken;..pFunctionL
35bc0 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d  ist->C_InitPIN =
35bd0 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75   C_InitPIN;..pFu
35be0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
35bf0 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b  tPIN = C_SetPIN;
35c00 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35c10 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d  >C_OpenSession =
35c20 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a   C_OpenSession;.
35c30 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35c40 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d  C_CloseSession =
35c50 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b   C_CloseSession;
35c60 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35c70 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69  >C_CloseAllSessi
35c80 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c  ons = C_CloseAll
35c90 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63  Sessions;..pFunc
35ca0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
35cb0 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47  essionInfo = C_G
35cc0 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09  etSessionInfo;..
35cd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35ce0 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
35cf0 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74  te = C_GetOperat
35d00 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63  ionState;..pFunc
35d10 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f  tionList->C_SetO
35d20 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
35d30 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
35d40 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
35d50 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43  ist->C_Login = C
35d60 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69  _Login;..pFuncti
35d70 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74  onList->C_Logout
35d80 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46   = C_Logout;..pF
35d90 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
35da0 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f  reateObject = C_
35db0 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70  CreateObject;..p
35dc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35dd0 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43  CopyObject = C_C
35de0 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  opyObject;..pFun
35df0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73  ctionList->C_Des
35e00 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44  troyObject = C_D
35e10 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70  estroyObject;..p
35e20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35e30 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20  GetObjectSize = 
35e40 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b  C_GetObjectSize;
35e50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35e60 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56  >C_GetAttributeV
35e70 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72  alue = C_GetAttr
35e80 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75  ibuteValue;..pFu
35e90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
35ea0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
35eb0 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  = C_SetAttribute
35ec0 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
35ed0 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
35ee0 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e  ectsInit = C_Fin
35ef0 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70  dObjectsInit;..p
35f00 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35f10 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f  FindObjects = C_
35f20 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46  FindObjects;..pF
35f30 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
35f40 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20  indObjectsFinal 
35f50 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  = C_FindObjectsF
35f60 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
35f70 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49  List->C_EncryptI
35f80 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49  nit = C_EncryptI
35f90 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
35fa0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d  ist->C_Encrypt =
35fb0 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75   C_Encrypt;..pFu
35fc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
35fd0 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
35fe0 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
35ff0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
36000 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _EncryptFinal = 
36010 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_EncryptFinal;.
36020 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
36030 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20  C_DecryptInit = 
36040 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_DecryptInit;..
36050 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
36060 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63  _Decrypt = C_Dec
36070 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
36080 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55  List->C_DecryptU
36090 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
360a0 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
360b0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
360c0 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72  ptFinal = C_Decr
360d0 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
360e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
360f0 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73  stInit = C_Diges
36100 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
36110 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20  nList->C_Digest 
36120 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75  = C_Digest;..pFu
36130 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
36140 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
36150 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46  igestUpdate;