Hex Artifact Content

Artifact 96360137abd562baf593ed4fa28041c48ab35c7b:


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 69 73 20 6e 6f 74 20 61 6c 72 65 61  ing is 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 69 6e 63 6c 75 64 65 5f 72 65 61 64  int include_read
20600 65 72 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  er;...CACKEY_DEB
20610 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20620 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43  d.");...if (pulC
20630 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
20640 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20650 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
20660 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  lCount is NULL."
20670 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20680 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
20690 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
206a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
206b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
206c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
206d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
206e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
206f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20700 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20710 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
20720 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
20730 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20740 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
20750 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
20760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20770 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
20780 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
20790 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
207a0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
207b0 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74  .../* Clear list
207c0 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 69 66   of slots */..if
207d0 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09   (pSlotList) {..
207e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
207f0 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c  INTF("Purging al
20800 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  l slot informati
20810 6f 6e 2e 22 29 3b 0a 0a 09 09 2f 2a 20 4f 6e 6c  on.");..../* Onl
20820 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
20830 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
20840 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
20850 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73  ing supply the s
20860 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
20870 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  */...cackey_slot
20880 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
20890 28 31 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72  (1);....for (cur
208a0 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
208b0 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
208c0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
208d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
208e0 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
208f0 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ++) {....if (cac
20900 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
20910 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  ot].internal) {.
20920 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
20930 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  .}.....cackey_sl
20940 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
20950 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  tive = 0;...}..}
20960 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
20970 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
20980 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
20990 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
209a0 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
209b0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
209c0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
209d0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
209e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
209f0 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
20a00 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73  PC/SC failed, as
20a10 73 75 6d 69 6e 67 20 6e 6f 20 68 61 72 64 77 61  suming no hardwa
20a20 72 65 20 73 6c 6f 74 73 22 29 3b 0a 09 7d 20 65  re slots");..} e
20a30 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61  lse {...pcsc_rea
20a40 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09  ders_len = 0;...
20a50 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  .scard_listreade
20a60 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
20a70 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65  stReaders(*cacke
20a80 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e  y_pcsc_handle, N
20a90 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63  ULL, NULL, &pcsc
20aa0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a  _readers_len);..
20ab0 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
20ac0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
20ad0 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
20ae0 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  R) {....CACKEY_D
20af0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20b00 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61  or. SCardListRea
20b10 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20  ders() returned 
20b20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52  SCARD_F_COMM_ERR
20b30 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e  OR, assuming Con
20b40 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
20b50 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f   went away. Reco
20b60 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09  nnecting.");....
20b70 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
20b80 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61  connect();....ca
20b90 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
20ba0 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  t();.....CACKEY_
20bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
20bc0 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65  ying SCardListRe
20bd0 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b  aders() again");
20be0 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65  ....scard_listre
20bf0 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72  aders_ret = SCar
20c00 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61  dListReaders(*ca
20c10 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
20c20 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70  , NULL, NULL, &p
20c30 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
20c40 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ;...}....if (sca
20c50 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
20c60 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e  et == SCARD_E_IN
20c70 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
20c80 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  R) {....CACKEY_D
20c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20ca0 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61  or. SCardListRea
20cb0 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20  ders() returned 
20cc0 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43  SCARD_E_INSUFFIC
20cd0 49 45 4e 54 5f 42 55 46 46 45 52 2c 20 61 73 73  IENT_BUFFER, ass
20ce0 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61 20  uming this is a 
20cf0 62 75 67 20 28 65 2e 67 2e 2c 20 47 6f 6f 67 6c  bug (e.g., Googl
20d00 65 20 50 43 53 43 29 20 61 6e 64 20 61 6c 6c 6f  e PCSC) and allo
20d10 63 61 74 69 6e 67 20 61 20 6d 61 73 73 69 76 65  cating a massive
20d20 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
20d30 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 61   to hold the rea
20d40 64 65 72 20 6c 69 73 74 2e 22 29 3b 0a 0a 09 09  der list.");....
20d50 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  .pcsc_readers_le
20d60 6e 20 3d 20 33 32 37 36 38 3b 0a 09 09 09 73 63  n = 32768;....sc
20d70 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
20d80 72 65 74 20 3d 20 53 43 41 52 44 5f 53 5f 53 55  ret = SCARD_S_SU
20d90 43 43 45 53 53 3b 0a 09 09 7d 0a 0a 09 09 69 66  CCESS;...}....if
20da0 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
20db0 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
20dc0 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63  _S_SUCCESS && pc
20dd0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21  sc_readers_len !
20de0 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72  = 0) {....pcsc_r
20df0 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28  eaders = malloc(
20e00 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
20e10 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65  );....pcsc_reade
20e20 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_s = pcsc_read
20e30 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c  ers;.....scard_l
20e40 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
20e50 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
20e60 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
20e70 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73  andle, NULL, pcs
20e80 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63  c_readers, &pcsc
20e90 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
20ea0 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
20eb0 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
20ec0 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
20ed0 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  {.....pcsc_reade
20ee0 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_e = pcsc_read
20ef0 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65  ers + pcsc_reade
20f00 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20  rs_len;....../* 
20f10 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20  Start with Slot 
20f20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61  ID 1, to avoid a
20f30 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52   bug in GDM on R
20f40 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75  HEL */...../* Bu
20f50 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a  g 594911: https:
20f60 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61  //bugzilla.redha
20f70 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63  t.com/show_bug.c
20f80 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a  gi?id=594911 */.
20f90 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31  ....currslot = 1
20fa0 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63 73  ;.....while (pcs
20fb0 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73 63  c_readers < pcsc
20fc0 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09  _readers_e) {...
20fd0 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20  .../* Find next 
20fe0 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a  available slot *
20ff0 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75  /......for (; cu
21000 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
21010 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
21020 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
21030 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
21040 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69  lot++) {.......i
21050 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
21060 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
21070 65 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61  e) {........brea
21080 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  k;.......}......
21090 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61  }.......curr_rea
210a0 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  der_len = strlen
210b0 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
210c0 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63 5f  ......if ((pcsc_
210d0 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72  readers + curr_r
210e0 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73  eader_len) > pcs
210f0 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09  c_readers_e) {..
21100 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
21110 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72  .}.......if (cur
21120 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20  r_reader_len == 
21130 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  0) {.......break
21140 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
21150 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28  f (currslot >= (
21160 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
21170 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
21180 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
21190 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
211a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
211b0 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73  und more readers
211c0 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20   than slots are 
211d0 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09  available!");...
211e0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
211f0 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  .}.......CACKEY_
21200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
21210 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 20 28  und reader: %s (
21220 63 75 72 72 73 6c 6f 74 20 3d 20 25 6c 75 29 22  currslot = %lu)"
21230 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20  , pcsc_readers, 
21240 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21250 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  currslot);......
21260 09 69 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64  .if (cackey_read
21270 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
21280 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
21290 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
212a0 52 49 4e 54 46 28 22 41 73 6b 65 64 20 74 6f 20  RINTF("Asked to 
212b0 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20 72 65 61  include only rea
212c0 64 65 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25  ders matching: %
212d0 73 22 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65  s", cackey_reade
212e0 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 29  rs_include_only)
212f0 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c 75 64 65  ;........include
21300 5f 72 65 61 64 65 72 20 3d 20 30 3b 0a 09 09 09  _reader = 0;....
21310 09 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  ...reader_check_
21320 70 61 74 74 65 72 6e 20 3d 20 63 61 63 6b 65 79  pattern = cackey
21330 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64 65  _readers_include
21340 5f 6f 6e 6c 79 3b 0a 09 09 09 09 09 7d 20 65 6c  _only;......} el
21350 73 65 20 69 66 20 28 63 61 63 6b 65 79 5f 72 65  se if (cackey_re
21360 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20 21 3d  aders_exclude !=
21370 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43   NULL) {.......C
21380 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21390 54 46 28 22 41 73 6b 65 64 20 74 6f 20 65 78 63  TF("Asked to exc
213a0 6c 75 64 65 20 72 65 61 64 65 72 73 20 6d 61 74  lude readers mat
213b0 63 68 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b  ching: %s", cack
213c0 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75  ey_readers_exclu
213d0 64 65 29 3b 0a 0a 09 09 09 09 09 09 69 6e 63 6c  de);........incl
213e0 75 64 65 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a  ude_reader = 1;.
213f0 09 09 09 09 09 09 72 65 61 64 65 72 5f 63 68 65  ......reader_che
21400 63 6b 5f 70 61 74 74 65 72 6e 20 3d 20 63 61 63  ck_pattern = cac
21410 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
21420 75 64 65 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ude;......} else
21430 20 7b 0a 09 09 09 09 09 09 69 6e 63 6c 75 64 65   {.......include
21440 5f 72 65 61 64 65 72 20 3d 20 31 3b 0a 09 09 09  _reader = 1;....
21450 09 09 09 72 65 61 64 65 72 5f 63 68 65 63 6b 5f  ...reader_check_
21460 70 61 74 74 65 72 6e 20 3d 20 4e 55 4c 4c 3b 0a  pattern = NULL;.
21470 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
21480 28 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61  (reader_check_pa
21490 74 74 65 72 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  ttern != NULL) {
214a0 0a 09 09 09 09 09 09 69 66 20 28 73 74 72 73 74  .......if (strst
214b0 72 28 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20  r(pcsc_readers, 
214c0 72 65 61 64 65 72 5f 63 68 65 63 6b 5f 70 61 74  reader_check_pat
214d0 74 65 72 6e 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  tern) != NULL) {
214e0 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
214f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 69  EBUG_PRINTF("Thi
21500 73 20 72 65 61 64 65 72 20 6d 61 74 63 68 65 64  s reader matched
21510 20 74 68 65 20 70 61 74 74 65 72 6e 2e 22 29 3b   the pattern.");
21520 0a 09 09 09 09 09 09 0a 09 09 09 09 09 09 09 69  ...............i
21530 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d 20  nclude_reader = 
21540 21 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 3b  !include_reader;
21550 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
21560 0a 09 09 09 09 09 69 66 20 28 69 6e 63 6c 75 64  ......if (includ
21570 65 5f 72 65 61 64 65 72 20 21 3d 20 31 29 20 7b  e_reader != 1) {
21580 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
21590 42 55 47 5f 50 52 49 4e 54 46 28 22 53 6b 69 70  BUG_PRINTF("Skip
215a0 70 69 6e 67 20 74 68 69 73 20 72 65 61 64 65 72  ping this reader
215b0 2e 22 29 3b 0a 0a 09 09 09 09 09 09 70 63 73 63  .");........pcsc
215c0 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72  _readers += curr
215d0 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b  _reader_len + 1;
215e0 0a 0a 09 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ........continue
215f0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 2f  ;......}......./
21600 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
21610 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
21620 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
21630 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73  ly being asked s
21640 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
21650 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
21660 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
21670 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79  ) {.......cackey
21680 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
21690 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
216a0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
216b0 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
216c0 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61  al = 0;.......ca
216d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
216e0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
216f0 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72   = strdup(pcsc_r
21700 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 63  eaders);.......c
21710 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
21720 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
21730 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
21740 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
21750 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
21760 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
21770 30 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
21780 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
21790 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
217a0 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
217b0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ....if (cackey_p
217c0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55  in_command == NU
217d0 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 63 61 63  LL) {........cac
217e0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
217f0 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
21800 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
21810 49 52 45 44 3b 0a 09 09 09 09 09 09 7d 20 65 6c  IRED;.......} el
21820 73 65 20 7b 0a 09 09 09 09 09 09 09 63 61 63 6b  se {........cack
21830 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
21840 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t].token_flags =
21850 20 30 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09   0;.......}.....
21860 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
21870 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d  urrslot].label =
21880 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 63 61   NULL;........ca
21890 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
218a0 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  eset(&cackey_slo
218b0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09  ts[currslot]);..
218c0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
218d0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
218e0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
218f0 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09  ctive) {........
21900 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20  /* Artificially 
21910 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d  increase the num
21920 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c  ber of active sl
21930 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c  ots by what will
21940 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a   become active *
21950 2f 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  /........CACKEY_
21960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
21970 75 6e 64 20 69 6e 2d 61 63 74 69 76 65 20 73 6c  und in-active sl
21980 6f 74 20 25 6c 75 2c 20 62 75 74 20 69 74 20 77  ot %lu, but it w
21990 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66  ill be active af
219a0 74 65 72 20 61 20 72 65 73 65 74 20 2d 2d 20 6d  ter a reset -- m
219b0 61 72 6b 69 6e 67 20 61 73 20 61 63 74 69 76 65  arking as active
219c0 20 66 6f 72 20 61 63 63 6f 75 6e 74 69 6e 67 20   for accounting 
219d0 70 75 72 70 6f 73 65 73 22 2c 20 28 75 6e 73 69  purposes", (unsi
219e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73  gned long) currs
219f0 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c  lot);.........sl
21a00 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09  ot_count++;.....
21a10 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 09  ..}......}......
21a20 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09  currslot++;.....
21a30 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
21a40 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
21a50 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 09 09 09  n + 1;.....}....
21a60 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
21a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21a80 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f  ("Second call to
21a90 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
21aa0 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
21ab0 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
21ac0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
21ad0 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
21ae0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
21af0 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
21b00 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21b10 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
21b20 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29  (pcsc_readers_s)
21b30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
21b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21b50 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20  NTF("First call 
21b60 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
21b70 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
21b80 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
21b90 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
21ba0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
21bb0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
21bc0 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
21bd0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
21be0 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 6f  et);...}..}...fo
21bf0 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
21c00 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
21c10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21c20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21c30 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
21c40 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66  rrslot++) {...if
21c50 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
21c60 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
21c70 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
21c80 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
21c90 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75   active slot %lu
21ca0 2c 20 72 65 61 64 65 72 20 3d 20 25 73 22 2c 20  , reader = %s", 
21cb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
21cc0 63 75 72 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79  currslot, cackey
21cd0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
21ce0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  .pcsc_reader);..
21cf0 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
21d00 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
21d10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21d20 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21d30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21d40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21d50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21d70 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
21d80 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
21d90 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21da0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
21db0 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20  f (pSlotList == 
21dc0 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
21dd0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
21de0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
21df0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21e00 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e  ing CKR_OK (%i).
21e10 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64    Found %lu read
21e20 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f  ers, but not sto
21e30 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c  ring IDs (pSlotL
21e40 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43  ist == NULL)", C
21e50 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64  KR_OK, (unsigned
21e60 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e   long) slot_coun
21e70 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
21e80 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e  R_OK);..}...coun
21e90 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09  t = *pulCount;..
21ea0 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74  if (count < slot
21eb0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b  _count) {...CACK
21ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21ed0 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
21ee0 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
21ef0 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20  es, but we have 
21f00 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63  %lu entries.", c
21f10 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74  ount, slot_count
21f20 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
21f30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21f40 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f  ning CKR_BUFFER_
21f50 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09  TOO_SMALL");....
21f60 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
21f70 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
21f80 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
21f90 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
21fa0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21fb0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21fc0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21fe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
21ff0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22000 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22010 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22020 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20  .}...slot_idx = 
22030 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  0;..for (currslo
22040 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74  t = 0; (currslot
22050 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
22060 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
22070 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
22080 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  ]))); currslot++
22090 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
220a0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
220b0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63  ].active) {....c
220c0 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
220d0 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20  if (slot_idx >= 
220e0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
220f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22100 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c  "Error. User all
22110 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69  ocated %lu entri
22120 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20  es, but we just 
22130 74 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74  tried to write t
22140 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20  o the %lu index 
22150 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f  -- ignoring", co
22160 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a  unt, slot_idx);.
22170 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
22180 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73  }....pSlotList[s
22190 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73  lot_idx] = currs
221a0 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b  lot;...slot_idx+
221b0 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  +;..}...mutex_re
221c0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
221d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
221e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
221f0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
22200 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22210 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22220 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking 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 2a 70 75  ERROR);..}...*pu
22260 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
22270 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  unt;...CACKEY_DE
22280 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22290 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
222a0 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65  ).  Found %lu re
222b0 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c  aders.", CKR_OK,
222c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
222d0 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
222e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
222f0 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d  ..tokenPresent =
22300 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f   tokenPresent; /
22310 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
22320 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
22330 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
22340 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22350 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29  , C_GetSlotInfo)
22360 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
22370 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f  ID, CK_SLOT_INFO
22380 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
22390 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
223a0 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  R slotDescriptio
223b0 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c  n[] = "CACKey Sl
223c0 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ot";..int mutex_
223d0 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74  retval;..int byt
223e0 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41  es_to_copy;...CA
223f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22400 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22410 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
22420 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
22430 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22440 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
22450 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22460 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
22470 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
22480 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22490 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
224a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
224b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
224c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
224d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
224e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
224f0 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
22500 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
22510 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
22520 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
22530 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
22540 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22550 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22560 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
22570 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
22580 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
22590 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
225a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
225b0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
225c0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
225d0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
225e0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
225f0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22600 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22610 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22620 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22630 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
22640 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22650 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22660 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
22670 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22680 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
22690 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
226a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
226b0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
226c0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
226d0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
226e0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
226f0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
22700 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22710 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
22720 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
22730 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49  NVALID);..}...pI
22740 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
22750 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28  _HW_SLOT;...if (
22760 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  !cackey_slots[sl
22770 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  otID].internal) 
22780 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  {...pInfo->flags
22790 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c   |= CKF_REMOVABL
227a0 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69  E_DEVICE;..}...i
227b0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
227c0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
227d0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d  slots[slotID]) =
227e0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
227f0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
22800 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c  ..pInfo->flags |
22810 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53  = CKF_TOKEN_PRES
22820 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f  ENT;..}...bytes_
22830 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e  to_copy = strlen
22840 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
22850 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
22860 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28  r);..if (sizeof(
22870 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
22880 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74  rerID) < bytes_t
22890 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65  o_copy) {...byte
228a0 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65  s_to_copy = size
228b0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
228c0 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d  cturerID);..}..m
228d0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
228e0 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63  ufacturerID, cac
228f0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22900 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62  ].pcsc_reader, b
22910 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a  ytes_to_copy);..
22920 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
22930 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
22940 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22950 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
22960 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
22970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22980 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
22990 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
229a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
229b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
229c0 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
229d0 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
229e0 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
229f0 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
22a00 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
22a10 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  py(pInfo->slotDe
22a20 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44  scription, slotD
22a30 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65  escription, size
22a40 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69  of(slotDescripti
22a50 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  on) - 1);...mems
22a60 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
22a70 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
22a80 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
22a90 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a  ufacturerID));..
22aa0 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
22ab0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
22ac0 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
22ad0 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
22ae0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
22af0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
22b00 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
22b10 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
22b20 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
22b30 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
22b40 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
22b50 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
22b60 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
22b70 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  00;...CACKEY_DEB
22b80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22b90 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
22ba0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
22bb0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
22bc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22bd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
22be0 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c  TokenInfo)(CK_SL
22bf0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
22c00 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20  _TOKEN_INFO_PTR 
22c10 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63  pInfo) {..static
22c20 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e   CK_UTF8CHAR man
22c30 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20  ufacturerID[] = 
22c40 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74  "U.S. Government
22c50 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
22c60 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61  F8CHAR defaultLa
22c70 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e  bel[] = "Unknown
22c80 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63   Token";..static
22c90 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64   CK_UTF8CHAR mod
22ca0 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65  el[] = "CAC Toke
22cb0 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  n";..struct cack
22cc0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
22cd0 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
22ce0 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
22cf0 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73  g num_certs;..ss
22d00 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b  ize_t label_ret;
22d10 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
22d20 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66  al;..int use_def
22d30 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41  ault_label;...CA
22d40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22d50 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22d60 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
22d70 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
22d80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22d90 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
22da0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22db0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
22dc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
22dd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22de0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22df0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22e00 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22e10 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22e20 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22e30 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22e40 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
22e50 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
22e60 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
22e70 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
22e80 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
22e90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22ea0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22eb0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
22ec0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
22ed0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
22ee0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
22ef0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22f00 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
22f10 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
22f20 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22f30 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
22f40 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22f50 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22f60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22f70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22f80 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
22f90 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22fa0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22fb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
22fc0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22fd0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
22fe0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22ff0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
23000 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
23010 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
23020 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
23030 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
23040 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
23050 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23060 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
23070 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
23080 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
23090 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
230a0 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
230b0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
230c0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
230d0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
230e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
230f0 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69  INTF("No token i
23100 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f  s present in slo
23110 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74  tID = %lu", slot
23120 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
23130 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23140 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23150 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
23160 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09  _NOT_PRESENT);..
23170 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
23180 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f   token label fro
23190 6d 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a  m certificates *
231a0 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  /..memset(pInfo-
231b0 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a  >label, ' ', siz
231c0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
231d0 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74  ));..use_default
231e0 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66  _label = 1;...if
231f0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
23200 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20  lotID].label == 
23210 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69  NULL) {...pcsc_i
23220 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
23230 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63  ey_read_certs(&c
23240 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23250 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  ID], NULL, &num_
23260 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63  certs);...if (pc
23270 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
23280 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
23290 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b  num_certs > 0) {
232a0 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d  .....label_ret =
232b0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
232c0 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70  ntity_to_label(p
232d0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
232e0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69  pInfo->label, si
232f0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
23300 6c 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62  l));.....if (lab
23310 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09  el_ret > 0) {...
23320 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  ...use_default_l
23330 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09  abel = 0;.......
23340 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23350 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c  tID].label = mal
23360 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f  loc(sizeof(pInfo
23370 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09  ->label));......
23380 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
23390 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
233a0 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  el, pInfo->label
233b0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
233c0 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09  label));.....}..
233d0 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
233e0 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
233f0 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
23400 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d  erts, 1);...}..}
23410 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79   else {...memcpy
23420 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63  (pInfo->label, c
23430 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23440 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  ID].label, sizeo
23450 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
23460 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74  ;....use_default
23470 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a  _label = 0;..}..
23480 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
23490 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
234a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
234b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
234c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
234d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
234e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
234f0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
23500 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23510 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23520 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65  ..}...if (use_de
23530 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09  fault_label) {..
23540 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
23550 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62  abel, defaultLab
23560 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75  el, sizeof(defau
23570 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09  ltLabel) - 1);..
23580 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  }...memset(pInfo
23590 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
235a0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
235b0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
235c0 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  rID));..memcpy(p
235d0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
235e0 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72  erID, manufactur
235f0 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e  erID, sizeof(man
23600 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31  ufacturerID) - 1
23610 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
23620 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73  o->model, ' ', s
23630 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64  izeof(pInfo->mod
23640 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  el));..memcpy(pI
23650 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65  nfo->model, mode
23660 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29  l, sizeof(model)
23670 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
23680 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
23690 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ber, ' ', sizeof
236a0 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
236b0 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74  mber));...memset
236c0 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c  (pInfo->utcTime,
236d0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
236e0 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a  fo->utcTime));..
236f0 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
23700 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
23710 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
23720 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
23730 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  ff;..pInfo->hard
23740 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  wareVersion.mino
23750 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
23760 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
23770 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0xff;...pInfo->
23780 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
23790 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70  major = 0x00;..p
237a0 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65  Info->firmwareVe
237b0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78  rsion.minor = 0x
237c0 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  00;...pInfo->fla
237d0 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50  gs = CKF_WRITE_P
237e0 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55  ROTECTED | CKF_U
237f0 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49  SER_PIN_INITIALI
23800 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f  ZED | CKF_TOKEN_
23810 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61  INITIALIZED | ca
23820 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23830 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a  D].token_flags;.
23840 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e  ..if (cackey_pin
23850 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c  _command != NULL
23860 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
23870 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43  gs |= CKF_PROTEC
23880 54 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49  TED_AUTHENTICATI
23890 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49  ON_PATH;..}...pI
238a0 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f  nfo->ulMaxSessio
238b0 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66  nCount = (sizeof
238c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
238d0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
238e0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20  y_sessions[0])) 
238f0 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53  - 1;..pInfo->ulS
23900 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
23910 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
23920 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
23930 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e  ->ulMaxRwSession
23940 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66  Count = 0;..pInf
23950 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f  o->ulRwSessionCo
23960 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
23970 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
23980 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50  ;..pInfo->ulMaxP
23990 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49  inLen = 128;..pI
239a0 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e  nfo->ulMinPinLen
239b0 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
239c0 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72  TotalPublicMemor
239d0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
239e0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
239f0 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75  .pInfo->ulFreePu
23a00 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
23a10 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
23a20 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
23a30 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d  >ulTotalPrivateM
23a40 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
23a50 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
23a60 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
23a70 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  eePrivateMemory 
23a80 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
23a90 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09  _INFORMATION;...
23aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23ab0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23ac0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
23ad0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
23ae0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
23af0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23b00 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c  _RV, C_WaitForSl
23b10 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47  otEvent)(CK_FLAG
23b20 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54  S flags, CK_SLOT
23b30 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c  _ID_PTR pSlotID,
23b40 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65   CK_VOID_PTR pRe
23b50 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45  served) {..CACKE
23b60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23b70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23b80 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
23b90 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
23ba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23bb0 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
23bc0 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
23bd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
23be0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
23bf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23c00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23c10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23c20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23c30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23c40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23c50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23c60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  LIZED);..}.../* 
23c70 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65  XXX: TODO: Imple
23c80 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a  ment this... */.
23c90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23ca0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23cb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23cc0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
23cd0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
23ce0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
23cf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
23d00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23d10 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
23d20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
23d30 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
23d40 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  List)(CK_SLOT_ID
23d50 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
23d60 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70  ANISM_TYPE_PTR p
23d70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43  MechanismList, C
23d80 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
23d90 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
23da0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23db0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23dc0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23dd0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23de0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23df0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23e00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23e10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23e20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23e30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f  ;..}...if (pulCo
23e40 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
23e50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23e60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75  INTF("Error.  pu
23e70 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22  lCount is NULL."
23e80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23e90 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
23ea0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
23eb0 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  nismList == NULL
23ec0 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20  ) {...*pulCount 
23ed0 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 1;....CACKEY_D
23ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23ef0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
23f00 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
23f10 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
23f20 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f  ..}...if (*pulCo
23f30 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43  unt < 1) {...CAC
23f40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23f50 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72  ("Error.  Buffer
23f60 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a   too small.");..
23f70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46  ..return(CKR_BUF
23f80 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a  FER_TOO_SMALL);.
23f90 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c  .}...pMechanismL
23fa0 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41  ist[0] = CKM_RSA
23fb0 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e  _PKCS;..*pulCoun
23fc0 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
23fd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23fe0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
23ff0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
24000 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
24010 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
24020 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
24030 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
24040 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
24050 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
24060 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f  M_TYPE type, CK_
24070 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50  MECHANISM_INFO_P
24080 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74  TR pInfo) {..int
24090 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
240a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
240b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
240c0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
240d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
240e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
240f0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
24100 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
24110 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
24120 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
24130 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24140 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24160 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24170 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24180 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24190 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
241a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
241b0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
241c0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
241d0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
241e0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
241f0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
24200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24210 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
24220 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
24230 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
24240 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
24250 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
24260 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
24270 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
24280 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
24290 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
242a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
242b0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
242c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
242d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
242e0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
242f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
24300 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24310 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
24320 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
24330 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
24340 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24350 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24360 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
24370 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
24380 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
24390 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
243a0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
243b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
243c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
243d0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
243e0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
243f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
24400 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24410 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24420 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
24430 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
24440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24450 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
24460 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
24470 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24480 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24490 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79  ..}...switch (ty
244a0 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  pe) {...case CKM
244b0 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49  _RSA_PKCS:....pI
244c0 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a  nfo->ulMinKeySiz
244d0 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66  e = 512;....pInf
244e0 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20  o->ulMaxKeySize 
244f0 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f  = 8192;....pInfo
24500 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
24510 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c   | CKF_ENCRYPT |
24520 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43   CKF_DECRYPT | C
24530 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45  KF_SIGN | CKF_VE
24540 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a  RIFY;....break;.
24550 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24560 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24570 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
24580 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
24590 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
245a0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
245b0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
245c0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
245d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
245e0 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c  InitToken)(CK_SL
245f0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
24600 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
24610 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
24620 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
24630 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b  AR_PTR pLabel) {
24640 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24650 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24660 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24670 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24680 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24690 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
246a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
246b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
246c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
246d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
246e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
246f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24700 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
24710 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
24720 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
24730 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
24740 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
24750 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
24760 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
24770 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
24780 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
24790 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
247a0 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f  , C_InitPIN)(CK_
247b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
247c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
247d0 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
247e0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
247f0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
24800 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24810 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24820 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
24830 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24840 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24850 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24860 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24870 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
24880 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
24890 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
248a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
248b0 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
248c0 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
248d0 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
248e0 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
248f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
24900 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
24910 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
24920 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24930 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
24940 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24950 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
24960 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
24970 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
24980 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
24990 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
249a0 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
249b0 4c 65 6e 29 20 7b 0a 09 63 68 61 72 20 6f 6c 64  Len) {..char old
249c0 70 69 6e 62 75 66 5b 36 34 5d 2c 20 6e 65 77 70  pinbuf[64], newp
249d0 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 63 61 63 6b  inbuf[64];..cack
249e0 65 79 5f 72 65 74 20 73 65 74 5f 70 69 6e 5f 72  ey_ret set_pin_r
249f0 65 74 2c 20 67 65 74 5f 70 69 6e 5f 72 65 74 3b  et, get_pin_ret;
24a00 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
24a10 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
24a20 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
24a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24a40 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24a50 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
24a60 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
24a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24a80 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
24a90 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
24aa0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
24ab0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
24ac0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
24ad0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
24ae0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
24af0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
24b00 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
24b10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24b20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24b30 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
24b40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24b50 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
24b60 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
24b70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24b80 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
24b90 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
24ba0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24bb0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
24bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24bd0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
24be0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
24bf0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24c00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24c10 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
24c20 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
24c30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24c40 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
24c50 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
24c60 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
24c70 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
24c80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
24c90 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
24ca0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24cb0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
24cc0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
24cd0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
24ce0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
24cf0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
24d00 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24d10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24d20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
24d30 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
24d40 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
24d50 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
24d60 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
24d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24d80 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
24d90 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
24da0 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
24db0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
24dc0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
24dd0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24de0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24df0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
24e00 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24e10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
24e20 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
24e30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 47  = NULL) {.../* G
24e40 65 74 20 6f 6c 64 20 50 49 4e 20 2a 2f 0a 09 09  et old PIN */...
24e50 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61  get_pin_ret = ca
24e60 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6f 6c 64  ckey_get_pin(old
24e70 70 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28  pinbuf);....if (
24e80 67 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  get_pin_ret != C
24e90 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
24ea0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
24eb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24ec0 20 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4f   while getting O
24ed0 6c 64 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e  ld PIN, returnin
24ee0 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  g CKR_PIN_INCORR
24ef0 45 43 54 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ECT.");.....cack
24f00 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24f10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24f20 0a 09 09 09 0a 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
24f30 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
24f40 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f 6c 64 50 69  );...}....pOldPi
24f50 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
24f60 5f 50 54 52 29 20 6f 6c 64 70 69 6e 62 75 66 3b  _PTR) oldpinbuf;
24f70 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d  ...ulOldPinLen =
24f80 20 73 74 72 6c 65 6e 28 6f 6c 64 70 69 6e 62 75   strlen(oldpinbu
24f90 66 29 3b 0a 0a 09 09 2f 2a 20 47 65 74 20 6e 65  f);..../* Get ne
24fa0 77 20 50 49 4e 20 2a 2f 0a 09 09 67 65 74 5f 70  w PIN */...get_p
24fb0 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  in_ret = cackey_
24fc0 67 65 74 5f 70 69 6e 28 6e 65 77 70 69 6e 62 75  get_pin(newpinbu
24fd0 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70  f);....if (get_p
24fe0 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
24ff0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
25000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25010 49 4e 54 46 28 22 45 72 72 6f 72 20 77 68 69 6c  INTF("Error whil
25020 65 20 67 65 74 74 69 6e 67 20 4e 65 77 20 50 49  e getting New PI
25030 4e 2c 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 52  N, returning CKR
25040 5f 50 49 4e 5f 49 4e 56 41 4c 49 44 2e 22 29 3b  _PIN_INVALID.");
25050 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
25060 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25070 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 0a 09 09  biglock);.......
25080 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
25090 49 4e 56 41 4c 49 44 29 3b 0a 09 09 7d 0a 0a 09  INVALID);...}...
250a0 09 70 4e 65 77 50 69 6e 20 3d 20 28 43 4b 5f 55  .pNewPin = (CK_U
250b0 54 46 38 43 48 41 52 5f 50 54 52 29 20 6e 65 77  TF8CHAR_PTR) new
250c0 70 69 6e 62 75 66 3b 0a 09 09 75 6c 4e 65 77 50  pinbuf;...ulNewP
250d0 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6e  inLen = strlen(n
250e0 65 77 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  ewpinbuf);..}...
250f0 69 66 20 28 70 4f 6c 64 50 69 6e 20 3d 3d 20 4e  if (pOldPin == N
25100 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
25110 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c  DEBUG_PRINTF("Ol
25120 64 20 50 49 4e 20 76 61 6c 75 65 20 69 73 20 77  d PIN value is w
25130 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e 22 29 3b 0a  rong (null).");.
25140 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25150 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25160 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
25170 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
25180 45 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  ECT);..}...if (u
25190 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d 3d 20 30 20  lOldPinLen == 0 
251a0 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3e  || ulOldPinLen >
251b0 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   8) {...CACKEY_D
251c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 6c 64  EBUG_PRINTF("Old
251d0 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20 77   PIN length is w
251e0 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c 20 28 75 6e  rong: %lu.", (un
251f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 4f  signed long) ulO
25200 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a 09 09 63 61  ldPinLen);....ca
25210 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25220 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25230 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25240 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
25250 0a 09 7d 0a 0a 09 69 66 20 28 70 4e 65 77 50 69  ..}...if (pNewPi
25260 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
25270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25280 54 46 28 22 4e 65 77 20 50 49 4e 20 76 61 6c 75  TF("New PIN valu
25290 65 20 69 73 20 77 72 6f 6e 67 20 28 65 69 74 68  e is wrong (eith
252a0 65 72 20 4e 55 4c 4c 2c 20 6f 72 20 74 6f 6f 20  er NULL, or too 
252b0 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e 22 29 3b 0a  long/short).");.
252c0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
252d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
252e0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
252f0 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49  n(CKR_PIN_INVALI
25300 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4e  D);..}...if (ulN
25310 65 77 50 69 6e 4c 65 6e 20 3c 20 35 20 7c 7c 20  ewPinLen < 5 || 
25320 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3e 20 38 29  ulNewPinLen > 8)
25330 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25340 47 5f 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49  G_PRINTF("New PI
25350 4e 20 6c 65 6e 67 74 68 20 69 73 20 77 72 6f 6e  N length is wron
25360 67 3a 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20  g: %lu, must be 
25370 61 74 6c 65 61 73 74 20 35 20 61 6e 64 20 6e 6f  atleast 5 and no
25380 20 6d 6f 72 65 20 74 68 61 6e 20 38 2e 22 2c 20   more than 8.", 
25390 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
253a0 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulNewPinLen);...
253b0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
253c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
253d0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
253e0 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f 52 41 4e 47  CKR_PIN_LEN_RANG
253f0 45 29 3b 0a 09 7d 0a 0a 09 73 65 74 5f 70 69 6e  E);..}...set_pin
25400 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
25410 74 5f 70 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c  t_pin(&cackey_sl
25420 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 4f 6c  ots[slotID], pOl
25430 64 50 69 6e 2c 20 75 6c 4f 6c 64 50 69 6e 4c 65  dPin, ulOldPinLe
25440 6e 2c 20 70 4e 65 77 50 69 6e 2c 20 75 6c 4e 65  n, pNewPin, ulNe
25450 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  wPinLen);...if (
25460 73 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43  set_pin_ret != C
25470 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
25480 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
25490 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
254a0 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  ULL) {....cackey
254b0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
254c0 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
254d0 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
254e0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 74  ;...}....if (set
254f0 5f 70 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  _pin_ret == CACK
25500 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
25510 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  ) {....cackey_sl
25520 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
25530 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
25540 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a  SER_PIN_LOCKED;.
25550 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
25560 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
25570 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25580 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
25590 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
255a0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
255b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
255c0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
255d0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
255e0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
255f0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
25600 69 74 63 68 20 28 73 65 74 5f 70 69 6e 5f 72 65  itch (set_pin_re
25610 74 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  t) {...case CACK
25620 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 3a 0a 09 09  EY_PCSC_S_OK:...
25630 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25640 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
25650 6c 79 20 73 65 74 20 50 49 4e 2e 22 29 3b 0a 0a  ly set PIN.");..
25660 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
25670 29 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  );...case CACKEY
25680 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 3a 0a  _PCSC_E_BADPIN:.
25690 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
256a0 50 52 49 4e 54 46 28 22 50 49 4e 20 77 61 73 20  PRINTF("PIN was 
256b0 69 6e 76 61 6c 69 64 2e 22 29 3b 0a 0a 09 09 09  invalid.");.....
256c0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
256d0 4e 56 41 4c 49 44 29 3b 0a 09 09 63 61 73 65 20  NVALID);...case 
256e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
256f0 43 4b 45 44 3a 0a 09 09 09 43 41 43 4b 45 59 5f  CKED:....CACKEY_
25700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
25710 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 20 6f 72  ken is locked or
25720 20 74 68 69 73 20 63 68 61 6e 67 65 20 69 73 20   this change is 
25730 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 22 29  not permitted.")
25740 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
25750 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
25760 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b  default:....CACK
25770 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25780 22 53 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 20  "Something else 
25790 77 65 6e 74 20 77 72 6f 6e 67 20 63 68 61 6e 67  went wrong chang
257a0 69 6e 67 20 74 68 65 20 50 49 4e 3a 20 25 69 22  ing the PIN: %i"
257b0 2c 20 73 65 74 5f 70 69 6e 5f 72 65 74 29 3b 0a  , set_pin_ret);.
257c0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
257d0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
257e0 7d 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  }...return(CKR_G
257f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 7d  ENERAL_ERROR);.}
25800 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25810 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70  TION(CK_RV, C_Op
25820 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c  enSession)(CK_SL
25830 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
25840 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
25850 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
25860 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46  cation, CK_NOTIF
25870 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53  Y notify, CK_SES
25880 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20  SION_HANDLE_PTR 
25890 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e  phSession) {..un
258a0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b  signed long idx;
258b0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
258c0 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73  al;..int found_s
258d0 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41  ession = 0;...CA
258e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
258f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
25900 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46  if ((flags & CKF
25910 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29  _SERIAL_SESSION)
25920 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53   != CKF_SERIAL_S
25930 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75  ESSION) {...retu
25940 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50  rn(CKR_SESSION_P
25950 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50  ARALLEL_NOT_SUPP
25960 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  ORTED);..}...if 
25970 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
25980 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
25990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
259a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
259b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
259c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
259d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
259e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
259f0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
25a00 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
25a10 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
25a20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
25a30 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
25a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25a50 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
25a60 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
25a70 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
25a80 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
25a90 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
25aa0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
25ab0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
25ac0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25ad0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
25ae0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25af0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25b00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25b20 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
25b30 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
25b40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25b50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
25b60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
25b70 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
25b80 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25b90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25ba0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
25bb0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
25bc0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
25bd0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
25be0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
25bf0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25c00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
25c10 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
25c20 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
25c30 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
25c40 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63  t the card is ac
25c50 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c  tually in the sl
25c60 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20  ot. */../* XXX: 
25c70 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
25c80 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68  re this is in th
25c90 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66  e PKCS#11 specif
25ca0 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  ication */..if (
25cb0 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
25cc0 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
25cd0 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43  ts[slotID]) != C
25ce0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
25cf0 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43  ENPRESENT) {...C
25d00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25d10 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64  TF("Error.  Card
25d20 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52   not present.  R
25d30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56  eturning CKR_DEV
25d40 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a  ICE_REMOVED");..
25d50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25d60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25d70 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
25d80 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f  (CKR_DEVICE_REMO
25d90 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  VED);..}...for (
25da0 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28  idx = 1; idx < (
25db0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
25dc0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
25dd0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25de0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
25df0 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
25e00 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
25e10 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73  ve) {....found_s
25e20 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09  ession = 1;.....
25e30 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78  *phSession = idx
25e40 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
25e50 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
25e60 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79  e = 1;....cackey
25e70 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
25e80 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a  lotID = slotID;.
25e90 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
25ea0 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20  ns[idx].state = 
25eb0 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
25ec0 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79  SSION;....cackey
25ed0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66  _sessions[idx].f
25ee0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09  lags = flags;...
25ef0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25f00 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72  [idx].ulDeviceEr
25f10 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  ror = 0;....cack
25f20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
25f30 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20  .pApplication = 
25f40 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09  pApplication;...
25f50 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25f60 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e  [idx].Notify = n
25f70 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65  otify;.....cacke
25f80 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
25f90 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
25fa0 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
25fb0 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
25fc0 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
25fd0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
25fe0 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68  ions[idx].search
25ff0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
26000 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
26010 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76  [idx].sign_activ
26020 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
26030 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
26040 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
26050 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
26060 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
26070 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
26080 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
26090 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
260a0 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f  lotID], &cackey_
260b0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
260c0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
260d0 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
260e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
260f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26100 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26110 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
26120 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
26130 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26140 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26150 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
26160 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
26170 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26180 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
26190 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b  found_session) {
261a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
261b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
261c0 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  g CKR_SESSION_CO
261d0 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53  UNT (%i)", CKR_S
261e0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a  ESSION_COUNT);..
261f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
26200 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a  SION_COUNT);..}.
26210 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26220 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26230 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
26240 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
26250 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
26260 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
26270 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65  CK_RV, C_CloseSe
26280 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ssion)(CK_SESSIO
26290 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
262a0 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
262b0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
262c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
262d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
262e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
262f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26310 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26320 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26330 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26340 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26350 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
26360 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
26370 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
26380 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26390 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
263a0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
263b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
263c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
263d0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
263e0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
263f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
26400 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
26410 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
26420 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
26430 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
26440 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
26450 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
26460 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26470 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26480 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
26490 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
264a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
264b0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
264c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
264d0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
264e0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
264f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26500 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
26510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26520 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
26530 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
26540 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26550 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26560 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
26570 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26580 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20  Session].active 
26590 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65  = 0;..cackey_fre
265a0 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
265b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
265c0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
265d0 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
265e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
265f0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
26600 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
26610 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
26620 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26630 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
26640 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
26650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26660 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
26670 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
26680 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26690 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
266a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
266b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
266c0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
266d0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
266e0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
266f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26700 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
26710 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28  oseAllSessions)(
26720 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
26730 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  D) {..uint32_t i
26740 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
26750 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
26760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26770 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26780 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
26790 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
267a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
267b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
267c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
267d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
267e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
267f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
26800 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
26810 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
26820 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
26830 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
26840 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
26850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26860 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
26870 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
26880 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
26890 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
268a0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
268b0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
268c0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
268d0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
268e0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
268f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26900 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
26910 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26930 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
26940 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
26950 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26960 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
26970 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26980 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
26990 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
269a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
269b0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
269c0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
269d0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
269e0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
269f0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
26a00 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26a10 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
26a20 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
26a30 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
26a40 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
26a50 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
26a60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
26a70 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
26a80 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
26a90 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
26aa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
26ab0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66  .active) {....if
26ac0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
26ad0 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d  s[idx].slotID !=
26ae0 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63   slotID) {.....c
26af0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
26b00 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
26b10 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26b20 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73  lock);....C_Clos
26b30 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
26b40 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  ..cackey_mutex_l
26b50 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26b60 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  ck);...}..}...mu
26b70 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
26b80 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26b90 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26ba0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26bb0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26bd0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
26be0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26bf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26c00 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26c10 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26c20 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26c30 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
26c40 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
26c50 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
26c60 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
26c70 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73  (CK_RV, C_GetSes
26c80 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53  sionInfo)(CK_SES
26c90 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
26ca0 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e  sion, CK_SESSION
26cb0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
26cc0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
26cd0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
26ce0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26cf0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
26d00 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
26d10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26d20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
26d30 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
26d40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
26d50 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
26d60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26d70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26d90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26da0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26db0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26dc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26dd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
26de0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
26df0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
26e00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
26e10 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
26e20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26e30 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
26e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26e50 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
26e60 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
26e70 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26e80 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
26e90 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
26ea0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
26eb0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
26ec0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26ed0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
26ee0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
26ef0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26f00 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
26f10 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
26f20 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
26f30 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
26f40 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
26f50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
26f60 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
26f70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26f80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26f90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26fa0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26fb0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
26fc0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
26fd0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
26fe0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
26ff0 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74  .}...pInfo->slot
27000 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
27010 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
27020 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73  lotID;..pInfo->s
27030 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65  tate = cackey_se
27040 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27050 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e  .state;..pInfo->
27060 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73  flags = cackey_s
27070 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27080 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d  ].flags;..pInfo-
27090 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  >ulDeviceError =
270a0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
270b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76  [hSession].ulDev
270c0 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65  iceError;...mute
270d0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
270e0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
270f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27100 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27110 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27130 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
27140 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27150 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27160 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
27170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27180 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
27190 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
271a0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
271b0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
271c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
271d0 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61  K_RV, C_GetOpera
271e0 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
271f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27200 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
27210 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
27220 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  te, CK_ULONG_PTR
27230 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61   pulOperationSta
27240 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  teLen) {..CACKEY
27250 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27260 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27270 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27280 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27290 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
272a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
272b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
272c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
272d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
272e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
272f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27300 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27310 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27320 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
27330 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27340 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
27350 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27360 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
27370 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27380 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70  N(CK_RV, C_SetOp
27390 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
273a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
273b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
273c0 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
273d0 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  State, CK_ULONG 
273e0 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
273f0 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Len, CK_OBJECT_H
27400 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f  ANDLE hEncryptio
27410 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nKey, CK_OBJECT_
27420 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69  HANDLE hAuthenti
27430 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41  cationKey) {..CA
27440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27450 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27460 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
27470 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
27480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27490 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
274a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
274b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
274c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
274d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
274e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
274f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27500 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27510 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
27520 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27530 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
27540 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
27550 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27560 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
27570 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
27580 6f 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43 4b  oginMutexArg)(CK
27590 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
275a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45  hSession, CK_USE
275b0 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c  R_TYPE userType,
275c0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
275d0 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
275e0 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f  ulPinLen, int lo
275f0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f  ck_mutex) {..CK_
27600 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
27610 09 63 61 63 6b 65 79 5f 72 65 74 20 67 65 74 5f  .cackey_ret get_
27620 70 69 6e 5f 72 65 74 3b 0a 09 63 68 61 72 20 70  pin_ret;..char p
27630 69 6e 62 75 66 5b 36 34 5d 3b 0a 09 69 6e 74 20  inbuf[64];..int 
27640 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
27650 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  nt tries_remaini
27660 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72  ng;..int login_r
27670 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...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 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
27720 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
27730 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
27740 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
27750 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27760 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
27770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27780 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
27790 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
277a0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
277b0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
277c0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
277d0 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70  .}...if (userTyp
277e0 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b  e != CKU_USER) {
277f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27800 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27810 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
27820 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64  USER mode, asked
27830 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c   for %lu mode.",
27840 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
27850 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65   userType)....re
27860 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59  turn(CKR_USER_TY
27870 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  PE_INVALID);..}.
27880 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
27890 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76  ) {...mutex_retv
278a0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
278b0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
278c0 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75  glock);...if (mu
278d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
278e0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
278f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27900 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
27910 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
27920 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27930 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  OR);...}..}...if
27940 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27950 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
27960 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63  ive) {...if (loc
27970 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
27980 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27990 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
279a0 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
279b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
279c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
279d0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
279e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
279f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
27a00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
27a10 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
27a20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
27a30 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
27a40 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
27a50 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
27a60 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
27a70 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
27a80 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
27a90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27aa0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
27ab0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
27ac0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
27ad0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
27ae0 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f  otID);....if (lo
27af0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
27b00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27b10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27b20 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  k);...}....retur
27b30 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
27b40 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
27b50 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
27b60 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
27b70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27b80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27b90 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
27ba0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
27bb0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
27bc0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
27bd0 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f  D);....if (lock_
27be0 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b  mutex) {....cack
27bf0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27c00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27c10 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
27c20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27c30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
27c40 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
27c50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
27c60 70 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pPin != NULL) {.
27c70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27c80 50 52 49 4e 54 46 28 22 50 72 6f 74 65 63 74 65  PRINTF("Protecte
27c90 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  d authentication
27ca0 20 70 61 74 68 20 69 6e 20 65 66 66 65 63 74 20   path in effect 
27cb0 61 6e 64 20 50 49 4e 20 70 72 6f 76 69 64 65 64  and PIN provided
27cc0 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09 67 65   !?");...}....ge
27cd0 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  t_pin_ret = cack
27ce0 65 79 5f 67 65 74 5f 70 69 6e 28 70 69 6e 62 75  ey_get_pin(pinbu
27cf0 66 29 3b 0a 0a 09 09 69 66 20 28 67 65 74 5f 70  f);....if (get_p
27d00 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
27d10 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
27d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27d30 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 67 65 74  INTF("cackey_get
27d40 5f 70 69 6e 28 29 20 72 65 74 75 72 6e 65 64 20  _pin() returned 
27d50 69 6e 20 66 61 69 6c 75 72 65 2c 20 61 73 73 75  in failure, assu
27d60 6d 69 6e 67 20 74 68 65 20 50 49 4e 20 77 61 73  ming the PIN was
27d70 20 69 6e 63 6f 72 72 65 63 74 2e 22 29 3b 0a 0a   incorrect.");..
27d80 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
27d90 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  x) {.....cackey_
27da0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27db0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
27dc0 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  .}.....return(CK
27dd0 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
27de0 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20  ;...}....pPin = 
27df0 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52  (CK_UTF8CHAR_PTR
27e00 29 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69  ) pinbuf;...ulPi
27e10 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69  nLen = strlen(pi
27e20 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  nbuf);..}...logi
27e30 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
27e40 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
27e50 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e  ts[slotID], pPin
27e60 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69  , ulPinLen, &tri
27e70 65 73 5f 72 65 6d 61 69 6e 69 6e 67 2c 20 33 29  es_remaining, 3)
27e80 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ;..if (login_ret
27e90 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
27ea0 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 6c 6f  S_OK) {...if (lo
27eb0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
27ec0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27ed0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27ee0 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6c  k);...}....if (l
27ef0 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
27f00 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
27f10 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
27f20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27f30 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
27f40 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ked.");.....cack
27f50 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
27f60 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
27f70 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
27f80 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  KED;.....CACKEY_
27f90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27fa0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f  turning CKR_PIN_
27fb0 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20 28 69  LOCKED (%i)", (i
27fc0 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  nt) CKR_PIN_LOCK
27fd0 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  ED);.....return(
27fe0 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
27ff0 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
28000 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
28010 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
28020 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
28030 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28040 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
28050 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
28060 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
28070 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
28080 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
28090 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
280a0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
280b0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
280c0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
280d0 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
280e0 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
280f0 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  Y;....}.....CACK
28100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28110 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50  "Returning CKR_P
28120 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25 69  IN_INCORRECT (%i
28130 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49  )", (int) CKR_PI
28140 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09  N_INCORRECT);...
28150 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
28160 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d  _INCORRECT);...}
28170 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28180 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28190 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72   Unknown error r
281a0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63  eturned from cac
281b0 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29  key_login() (%i)
281c0 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a  ", login_ret);..
281d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
281e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
281f0 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
28200 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
28210 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52  gs &= ~(CKF_USER
28220 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b  _PIN_LOCKED | CK
28230 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
28240 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e  _LOW | CKF_LOGIN
28250 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f  _REQUIRED | CKF_
28260 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
28270 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  RY);...cackey_se
28280 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28290 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
282a0 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a  USER_FUNCTIONS;.
282b0 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
282c0 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76  ) {...mutex_retv
282d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
282e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
282f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28  biglock);...if (
28300 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
28310 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
28320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28330 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
28340 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
28350 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28360 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
28370 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28380 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28390 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
283a0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
283b0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
283c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
283d0 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28  CK_RV, C_Login)(
283e0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
283f0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
28400 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
28410 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
28420 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
28430 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 72  G ulPinLen) {..r
28440 65 74 75 72 6e 28 43 5f 4c 6f 67 69 6e 4d 75 74  eturn(C_LoginMut
28450 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20  exArg(hSession, 
28460 75 73 65 72 54 79 70 65 2c 20 70 50 69 6e 2c 20  userType, pPin, 
28470 75 6c 50 69 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d  ulPinLen, 1));.}
28480 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28490 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
284a0 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gout)(CK_SESSION
284b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
284c0 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
284d0 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
284e0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
284f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28500 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28510 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28520 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28540 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28550 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28560 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
28570 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
28580 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
28590 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
285a0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
285b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
285c0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
285d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
285e0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
285f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28600 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
28610 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
28620 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
28630 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
28640 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
28650 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28660 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
28670 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
28680 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
28690 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
286a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
286b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
286c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
286d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
286e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
286f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
28700 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
28710 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
28720 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28730 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28740 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28750 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
28760 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
28770 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
28780 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
28790 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
287a0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
287b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
287c0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
287d0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
287e0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
287f0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
28800 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
28810 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
28820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28830 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
28840 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
28850 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
28860 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
28870 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
28880 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28890 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
288a0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
288b0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
288c0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
288d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
288e0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
288f0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
28900 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
28910 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
28920 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
28930 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28940 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28950 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
28960 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
28970 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
28980 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
28990 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42  ate = CKS_RO_PUB
289a0 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69  LIC_SESSION;...i
289b0 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  f (cackey_pin_co
289c0 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  mmand == NULL) {
289d0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
289e0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
289f0 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
28a00 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73  REQUIRED;..} els
28a10 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  e {...cackey_slo
28a20 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
28a30 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _flags = 0;..}..
28a40 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
28a50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28a60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28a70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
28a80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
28a90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28aa0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
28ab0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
28ac0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28ad0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28ae0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
28af0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28b00 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
28b10 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
28b20 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
28b30 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
28b40 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
28b50 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
28b60 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28b70 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
28b80 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
28b90 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
28ba0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
28bb0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
28bc0 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
28bd0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
28be0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
28bf0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
28c00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28c10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28c20 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
28c30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28c40 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
28c50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28c60 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
28c70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28c80 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
28c90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
28ca0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
28cb0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28cc0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28cd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28ce0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
28cf0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
28d00 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
28d10 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
28d20 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28d30 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
28d40 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
28d50 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
28d60 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
28d70 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
28d80 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
28d90 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
28da0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28db0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28dc0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28dd0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28df0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28e00 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28e10 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
28e20 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
28e30 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
28e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28e50 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
28e60 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28e70 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
28e80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28e90 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
28ea0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
28eb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
28ec0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28ed0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
28ee0 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
28ef0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
28f00 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
28f10 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
28f20 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
28f30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28f40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28f50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28f60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28f70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28f80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28f90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28fa0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
28fb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28fc0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
28fd0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28fe0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
28ff0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
29000 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
29010 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29020 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
29030 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29040 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
29050 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
29060 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
29070 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
29080 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29090 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
290a0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
290b0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
290c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
290d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
290e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
290f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29100 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29110 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29120 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29130 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29140 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29150 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29160 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29170 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29180 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
29190 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
291a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
291b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
291c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
291d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
291e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
291f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29200 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
29210 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
29220 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
29230 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
29240 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
29250 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
29260 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
29270 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
29280 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
29290 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
292a0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
292b0 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
292c0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
292d0 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
292e0 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
292f0 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
29300 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
29310 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
29320 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
29330 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
29340 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
29350 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29360 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29370 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29380 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
293a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
293b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
293c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
293d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
293e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
293f0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
29400 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
29410 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
29420 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
29430 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
29440 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
29450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29460 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
29470 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
29480 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29490 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
294a0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
294b0 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
294c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
294d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
294e0 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
294f0 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
29500 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29510 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
29520 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29530 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
29540 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
29550 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
29560 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
29570 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
29580 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
29590 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
295a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
295b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
295c0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
295d0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
295e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
295f0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
29600 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
29610 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29620 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29630 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
29640 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
29650 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
29660 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
29670 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
29680 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
29690 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
296a0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
296b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
296c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
296d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
296e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
296f0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
29700 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29710 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29720 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
29730 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29740 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
29750 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
29760 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29770 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
29780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29790 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
297a0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
297b0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
297c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
297d0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
297e0 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
297f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29800 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
29810 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
29820 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
29830 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
29840 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29850 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29870 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
29880 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
29890 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
298a0 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
298b0 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
298c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
298d0 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
298e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
298f0 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
29900 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
29910 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29920 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
29930 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29940 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
29950 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
29960 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
29970 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
29980 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
29990 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
299a0 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
299b0 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
299c0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
299d0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
299e0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
299f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29a00 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
29a10 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
29a20 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
29a30 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
29a40 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
29a50 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
29a60 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
29a70 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
29a80 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
29a90 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
29aa0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
29ab0 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
29ac0 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
29ad0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
29ae0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
29af0 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
29b00 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
29b10 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
29b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
29b30 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
29b40 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
29b50 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
29b60 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
29b70 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
29b80 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
29b90 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
29ba0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
29bb0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
29bc0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
29bd0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
29be0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
29bf0 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
29c00 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
29c10 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
29c20 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
29c30 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
29c40 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
29c50 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
29c60 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
29c70 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
29c80 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
29c90 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
29ca0 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
29cb0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
29cc0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
29cd0 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
29ce0 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
29cf0 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
29d00 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
29d10 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
29d20 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
29d30 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
29d40 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
29d50 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29d60 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
29d70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29d80 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
29d90 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
29da0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29db0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
29dc0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
29dd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
29de0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29df0 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
29e00 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
29e10 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
29e20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29e30 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29e40 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
29e50 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
29e60 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
29e70 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
29e80 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
29e90 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
29ea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29eb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29ec0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
29ed0 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
29ee0 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
29ef0 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
29f00 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
29f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29f20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
29f30 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
29f40 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
29f50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29f60 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29f70 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
29f80 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
29f90 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
29fa0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29fb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
29fc0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
29fd0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29fe0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
29ff0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
2a000 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
2a010 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
2a020 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
2a030 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
2a040 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2a050 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2a060 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2a070 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a080 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a090 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2a0a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2a0b0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2a0c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2a0d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2a0e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2a0f0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2a100 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2a110 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2a120 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2a130 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2a140 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a150 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2a160 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2a170 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
2a180 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
2a190 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2a1a0 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
2a1b0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
2a1c0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
2a1d0 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
2a1e0 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e  slotID;..CK_ULON
2a1f0 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
2a200 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2a210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a220 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2a230 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2a240 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2a250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a260 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2a270 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2a280 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2a290 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2a2a0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
2a2b0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2a2c0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2a2d0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2a2e0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2a2f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2a300 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2a310 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a320 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2a330 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2a340 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2a350 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2a360 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2a370 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2a380 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2a390 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2a3a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2a3b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a3c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a3d0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2a3e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2a3f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2a400 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2a410 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2a420 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2a430 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2a440 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2a450 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2a460 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a470 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a480 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2a490 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2a4a0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2a4b0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2a4c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2a4d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2a4e0 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
2a4f0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2a500 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a510 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2a520 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a530 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c  rror.  Search al
2a540 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b  ready active.");
2a550 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2a560 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
2a570 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  E);..}...slotID 
2a580 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2a590 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
2a5a0 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
2a5b0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
2a5c0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2a5d0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
2a5e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
2a5f0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2a600 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a610 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
2a620 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
2a630 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
2a640 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
2a650 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
2a660 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2a670 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2a680 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2a690 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
2a6a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a6b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2a6c0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2a6d0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
2a6e0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
2a6f0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
2a700 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2a710 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2a720 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
2a730 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2a740 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
2a750 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2a760 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ID].slot_reset) 
2a770 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a780 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f  _PRINTF("The slo
2a790 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74  t has been reset
2a7a0 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c   since we last l
2a7b0 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69  ooked for identi
2a7c0 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69  ties -- rescanni
2a7d0 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  ng");....if (cac
2a7e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a7f0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2a800 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
2a810 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
2a820 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
2a830 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a840 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
2a850 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a860 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2a870 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61  s_count);.....ca
2a880 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a890 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2a8a0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
2a8b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a8c0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2a8d0 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
2a8e0 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
2a8f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
2a900 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel != NULL) {..
2a910 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
2a920 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
2a930 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  l);....cackey_sl
2a940 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
2a950 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
2a960 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
2a970 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
2a980 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a  slots[slotID]);.
2a990 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
2a9a0 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
2a9b0 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
2a9c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a9d0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2a9e0 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
2a9f0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2aa00 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2aa10 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
2aa20 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
2aa30 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
2aa40 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
2aa50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2aa60 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
2aa70 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  nt);..}...if (pT
2aa80 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29  emplate != NULL)
2aa90 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
2aaa0 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
2aab0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2aac0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2aad0 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75  ry_count = ulCou
2aae0 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  nt;....cackey_se
2aaf0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2ab00 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
2ab10 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a  malloc(ulCount *
2ab20 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
2ab30 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79  te));.....memcpy
2ab40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2ab50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2ab60 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61  h_query, pTempla
2ab70 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69  te, ulCount * si
2ab80 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
2ab90 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d  );....for (idx =
2aba0 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e   0; idx < ulCoun
2abb0 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  t; idx++) {.....
2abc0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  if (pTemplate[id
2abd0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  x].ulValueLen ==
2abe0 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65   0) {......cacke
2abf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2ac00 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2ac10 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
2ac20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74  NULL;.......cont
2ac30 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  inue;.....}.....
2ac40 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2ac50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2ac60 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
2ac70 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65  lue = malloc(pTe
2ac80 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
2ac90 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  lueLen);......if
2aca0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2acb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2acc0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
2acd0 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  alue) {......mem
2ace0 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(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 5b 69 64 78 5d 2e  arch_query[idx].
2ad10 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74  pValue, pTemplat
2ad20 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  e[idx].pValue, p
2ad30 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
2ad40 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d  ValueLen);.....}
2ad50 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
2ad60 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2ad70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ad80 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
2ad90 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
2ada0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2adb0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
2adc0 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65  = NULL;...}..} e
2add0 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  lse {...if (ulCo
2ade0 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
2adf0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2ae00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2ae10 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
2ae20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ae30 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72  or.  Search quer
2ae40 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  y specified as N
2ae50 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20  ULL, but number 
2ae60 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e  of query terms n
2ae70 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
2ae80 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  0.");.....return
2ae90 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2aea0 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  AD);...}....cack
2aeb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2aec0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2aed0 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
2aee0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2aef0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2af00 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
2af10 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
2af20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2af30 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b  arch_active = 1;
2af40 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2af50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2af60 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a  ch_curr_id = 0;.
2af70 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2af80 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2af90 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2afa0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2afb0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2afc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2afd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2afe0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2aff0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b000 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2b010 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2b020 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2b030 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2b040 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2b050 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2b060 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ..static int cac
2b070 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61  key_pkcs11_compa
2b080 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  re_attributes(CK
2b090 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43  _ATTRIBUTE *a, C
2b0a0 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29 20  K_ATTRIBUTE *b) 
2b0b0 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
2b0c0 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72   *smallbuf, *lar
2b0d0 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73  gebuf;..size_t s
2b0e0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72  mallbuf_len, lar
2b0f0 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20  gebuf_len;...if 
2b100 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74  (a->type != b->t
2b110 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ype) {...return(
2b120 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  0);..}...CACKEY_
2b130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
2b140 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63    ... found matc
2b150 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b  hing type ...");
2b160 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b170 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e  PRINTBUF("    ..
2b180 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61  . our value:", a
2b190 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56  ->pValue, a->ulV
2b1a0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  alueLen);...if (
2b1b0 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  b->pValue == NUL
2b1c0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2b1d0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
2b1e0 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c     ... found wil
2b1f0 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a  dcard match");..
2b200 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
2b210 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20  ..if (a->pValue 
2b220 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
2b230 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66  urn(0);..}.. .if
2b240 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (b->ulValueLen 
2b250 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  == a->ulValueLen
2b260 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56   && memcmp(a->pV
2b270 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c  alue, b->pValue,
2b280 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
2b290 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2b2a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
2b2b0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
2b2c0 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a  exact match");..
2b2d0 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
2b2e0 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70  ..switch (a->typ
2b2f0 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f  e) {...case CKA_
2b300 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28  MODULUS:....if (
2b310 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  a->ulValueLen ==
2b320 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
2b330 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
2b340 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56  }.....if (a->ulV
2b350 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56  alueLen > b->ulV
2b360 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73  alueLen) {.....s
2b370 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61  mallbuf = b->pVa
2b380 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  lue;.....smallbu
2b390 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c  f_len = b->ulVal
2b3a0 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67  ueLen;......larg
2b3b0 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65  ebuf = a->pValue
2b3c0 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c  ;.....largebuf_l
2b3d0 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  en = a->ulValueL
2b3e0 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  en;....} else {.
2b3f0 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61  ....smallbuf = a
2b400 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d  ->pValue;.....sm
2b410 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e  allbuf_len = a->
2b420 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
2b430 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70  .largebuf = b->p
2b440 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65  Value;.....large
2b450 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56  buf_len = b->ulV
2b460 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09  alueLen;....}...
2b470 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75  ..for (; largebu
2b480 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75  f_len != smallbu
2b490 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b  f_len; largebuf+
2b4a0 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d  +,largebuf_len--
2b4b0 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67  ) {.....if (larg
2b4c0 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a  ebuf[0] != 0) {.
2b4d0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2b4e0 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  }....}.....if (l
2b4f0 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
2b500 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  mallbuf_len) {..
2b510 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
2b520 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61  ...if (memcmp(la
2b530 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  rgebuf, smallbuf
2b540 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  , smallbuf_len) 
2b550 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  == 0) {.....CACK
2b560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b570 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
2b580 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61  d approximate ma
2b590 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  tch");......retu
2b5a0 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  rn(1);....}.....
2b5b0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75  break;..}...retu
2b5c0 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  rn(0);.}..CK_DEF
2b5d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2b5e0 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
2b5f0 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
2b600 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2b610 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
2b620 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b  PTR phObject, CK
2b630 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65  _ULONG ulMaxObje
2b640 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e  ctCount, CK_ULON
2b650 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43  G_PTR pulObjectC
2b660 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
2b670 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
2b680 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54  *curr_id;..CK_AT
2b690 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
2b6a0 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75  tr;..CK_ULONG cu
2b6b0 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  rr_id_idx, curr_
2b6c0 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72  out_id_idx, curr
2b6d0 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f  _attr_idx, sess_
2b6e0 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c  attr_idx;..CK_UL
2b6f0 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ONG matched_coun
2b700 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  t, prev_matched_
2b710 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65  count;..int mute
2b720 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66  x_retval;.#ifdef
2b730 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2b740 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2b750 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
2b760 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74  tart, end;..uint
2b770 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20  64_t start_int, 
2b780 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a  end_int;.#endif.
2b790 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b7a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2b7b0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2b7c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2b7d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b7e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2b7f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2b800 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b810 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2b820 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b830 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75  if (pulObjectCou
2b840 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
2b850 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b860 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
2b870 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e  ObjectCount is N
2b880 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2b890 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2b8a0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
2b8b0 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20  hObject == NULL 
2b8c0 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  && ulMaxObjectCo
2b8d0 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
2b8e0 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
2b8f0 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
2b900 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
2b910 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
2b920 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
2b930 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
2b940 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59  t = 0;....CACKEY
2b950 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b960 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2b970 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
2b980 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
2b990 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2b9a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
2b9b0 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ject == NULL) {.
2b9c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b9d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
2b9e0 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e  hObject is NULL.
2b9f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ba00 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2ba10 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78  ;..}...if (ulMax
2ba20 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
2ba30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ba40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ba50 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  .  Maximum numbe
2ba60 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65  r of objects spe
2ba70 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22  cified as zero."
2ba80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ba90 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2baa0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2bab0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2bac0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2bad0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2bae0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2baf0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2bb00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bb10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2bb20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2bb30 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2bb40 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2bb50 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2bb60 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2bb70 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2bb80 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2bb90 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2bba0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2bbb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bbc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bbd0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2bbe0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2bbf0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2bc00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2bc10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bc20 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2bc30 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2bc40 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2bc50 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2bc60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bc70 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2bc80 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2bc90 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2bca0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2bcb0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2bcc0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2bcd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2bce0 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
2bcf0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2bd00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2bd10 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2bd20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2bd30 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61  r.  Search not a
2bd40 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2bd50 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2bd60 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2bd70 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  ZED);..}..#ifdef
2bd80 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2bd90 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2bda0 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74  gettimeofday(&st
2bdb0 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  art, NULL);.#end
2bdc0 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64  if...curr_out_id
2bdd0 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28  _idx = 0;..for (
2bde0 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61  curr_id_idx = ca
2bdf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2be00 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
2be10 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f  urr_id; curr_id_
2be20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
2be30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2be40 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
2be50 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43   && ulMaxObjectC
2be60 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64  ount; curr_id_id
2be70 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64  x++) {...curr_id
2be80 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
2be90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2bea0 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64  entities[curr_id
2beb0 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59  _idx];....CACKEY
2bec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
2bed0 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69  rocessing identi
2bee0 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ty:%lu", (unsign
2bef0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64  ed long) curr_id
2bf00 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65  _idx);....matche
2bf10 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  d_count = 0;....
2bf20 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69  for (curr_attr_i
2bf30 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  dx = 0; curr_att
2bf40 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  r_idx < cackey_s
2bf50 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2bf60 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
2bf70 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f  ount; curr_attr_
2bf80 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76  idx++) {....prev
2bf90 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
2bfa0 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a   matched_count;.
2bfb0 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
2bfc0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2bfd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2bfe0 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74  h_query[curr_att
2bff0 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b  r_idx];.....CACK
2c000 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c010 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20  "  Checking for 
2c020 61 74 74 72 69 62 75 74 65 20 25 73 20 28 30 78  attribute %s (0x
2c030 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69  %08lx) in identi
2c040 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45  ty:%i...", CACKE
2c050 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54  Y_DEBUG_FUNC_ATT
2c060 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75  RIBUTE_TO_STR(cu
2c070 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20  rr_attr->type), 
2c080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2c090 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
2c0a0 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
2c0b0 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  dx);....CACKEY_D
2c0c0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
2c0d0 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67     Value looking
2c0e0 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74   for:", curr_att
2c0f0 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
2c100 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
2c110 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73  );.....for (sess
2c120 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
2c130 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  ess_attr_idx < c
2c140 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
2c150 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
2c160 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
2c170 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73  .if (cackey_pkcs
2c180 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69  11_compare_attri
2c190 62 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e  butes(&curr_id->
2c1a0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
2c1b0 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f  attr_idx], curr_
2c1c0 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61  attr)) {......ma
2c1d0 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  tched_count++;..
2c1e0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
2c1f0 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66  }....}...../* If
2c200 20 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63   the attribute c
2c210 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63  ould not be matc
2c220 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20  hed, do not try 
2c230 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f  to match additio
2c240 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a  nal attributes *
2c250 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61  /....if (prev_ma
2c260 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d  tched_count == m
2c270 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a  atched_count) {.
2c280 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
2c290 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68  ..}....if (match
2c2a0 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b  ed_count == cack
2c2b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c2c0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2c2d0 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ry_count) {....C
2c2e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c2f0 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69  TF("  ... All %i
2c300 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
2c310 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61  ked for found, a
2c320 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
2c330 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69  i to returned li
2c340 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  st", (int) cacke
2c350 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c360 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2c370 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  y_count, (int) c
2c380 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
2c390 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f  .phObject[curr_o
2c3a0 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72  ut_id_idx] = cur
2c3b0 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09  r_id_idx + 1;...
2c3c0 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  ..ulMaxObjectCou
2c3d0 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f  nt--;.....curr_o
2c3e0 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d  ut_id_idx++;...}
2c3f0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
2c400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c410 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69    ... Not all %i
2c420 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29   (only found %i)
2c430 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
2c440 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e  ked for found, n
2c450 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  ot adding identi
2c460 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61  ty:%i", (int) ca
2c470 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c480 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2c490 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
2c4a0 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  ) matched_count,
2c4b0 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
2c4c0 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63  dx);...}..}..cac
2c4d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c4e0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
2c4f0 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f  rr_id = curr_id_
2c500 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74  idx;..*pulObject
2c510 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74  Count = curr_out
2c520 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66  _id_idx;..#ifdef
2c530 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
2c540 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
2c550 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e  gettimeofday(&en
2c560 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74  d, NULL);..start
2c570 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76  _int = (start.tv
2c580 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20  _sec * 1000000) 
2c590 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b  + start.tv_usec;
2c5a0 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64  ..end_int = (end
2c5b0 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
2c5c0 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63  0) + end.tv_usec
2c5d0 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
2c5e0 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20  r, "Search took 
2c5f0 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  %lu microseconds
2c600 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \n", (unsigned l
2c610 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20  ong) (end_int - 
2c620 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e  start_int));.#en
2c630 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  dif...mutex_retv
2c640 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2c650 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c660 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2c670 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2c680 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c690 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c6a0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2c6b0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2c6c0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2c6d0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2c6e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c6f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2c700 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63   (%i), num objec
2c710 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f  ts = %lu", CKR_O
2c720 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  K, *pulObjectCou
2c730 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
2c740 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2c750 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2c760 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
2c770 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  sFinal)(CK_SESSI
2c780 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2c790 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  on) {..CK_ULONG 
2c7a0 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
2c7b0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2c7c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2c7d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2c7e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2c7f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2c800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c810 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2c820 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2c830 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2c840 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2c850 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2c860 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2c870 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2c880 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c890 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2c8a0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2c8b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c8c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c8d0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2c8e0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2c8f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2c900 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2c910 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2c920 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2c930 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2c940 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2c950 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2c960 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2c970 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c980 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2c990 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2c9a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2c9b0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2c9c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c9d0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2c9e0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2c9f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2ca00 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2ca10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ca20 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2ca30 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2ca40 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2ca50 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2ca60 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2ca70 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2ca80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2ca90 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
2caa0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2cab0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2cac0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2cad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2cae0 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
2caf0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2cb00 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2cb10 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2cb20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  LIZED);..}...cac
2cb30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cb40 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
2cb50 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20  tive = 0;...for 
2cb60 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
2cb70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cb80 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2cb90 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64  _query_count; id
2cba0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
2cbb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cbc0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2cbd0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29  ery[idx].pValue)
2cbe0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
2cbf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2cc00 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2cc10 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a  y[idx].pValue);.
2cc20 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  ..}..}...if (cac
2cc30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cc40 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2cc50 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61  ery) {...free(ca
2cc60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2cc70 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
2cc80 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  uery);..}...mute
2cc90 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2cca0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ccb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ccc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2ccd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2cce0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ccf0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2cd00 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2cd10 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2cd20 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2cd30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cd40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2cd50 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2cd60 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2cd70 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2cd80 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2cd90 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49  K_RV, C_EncryptI
2cda0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2cdb0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2cdc0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2cdd0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2cde0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2cdf0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
2ce00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2ce10 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2ce20 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2ce30 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2ce40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ce50 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2ce60 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2ce70 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2ce80 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2ce90 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2cea0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2ceb0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2cec0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2ced0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2cee0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2cef0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2cf00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2cf10 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2cf20 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2cf30 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
2cf40 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2cf50 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2cf60 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2cf70 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2cf80 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2cf90 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
2cfa0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2cfb0 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
2cfc0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2cfd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2cfe0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2cff0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d000 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d010 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d020 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d030 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d040 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d050 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d060 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d070 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d080 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2d090 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2d0a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2d0b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d0c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2d0d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d0e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2d0f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d100 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70  _RV, C_EncryptUp
2d110 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2d120 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d130 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2d140 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2d150 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2d160 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2d170 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2d180 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
2d190 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2d1a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d1b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d1c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d1d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d1e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d1f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d200 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d210 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d220 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d230 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d250 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2d260 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d270 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2d280 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d290 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d2a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d2b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d2c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d2d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2d2e0 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  ptFinal)(CK_SESS
2d2f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d300 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2d310 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50   pLastEncryptedP
2d320 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2d330 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74  R pulLastEncrypt
2d340 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
2d350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d360 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2d370 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2d380 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2d390 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d3a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2d3b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2d3c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2d3d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2d3e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2d3f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d400 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2d410 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d420 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2d430 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d440 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2d450 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2d460 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2d470 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2d480 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2d490 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ecryptInit)(CK_S
2d4a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d4b0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2d4c0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2d4d0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2d4e0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69  ANDLE hKey) {..i
2d4f0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2d500 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43  ...hKey--;...CAC
2d510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d520 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2d530 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2d540 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2d550 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d560 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2d570 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2d580 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2d590 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2d5a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2d5b0 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c  Mechanism == NUL
2d5c0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2d5d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d5e0 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73  r. pMechanism is
2d5f0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2d600 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2d610 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2d620 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63  (pMechanism->mec
2d630 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53  hanism != CKM_RS
2d640 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
2d650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d660 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
2d670 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
2d680 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
2d690 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  KM_RSA_PKCS");..
2d6a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
2d6b0 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
2d6c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2d6d0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2d6e0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2d6f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2d700 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2d710 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2d720 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2d730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d740 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2d750 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2d760 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d770 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d780 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2d790 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2d7a0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2d7b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2d7c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2d7d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2d7e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d7f0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2d800 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2d810 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d820 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2d830 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d840 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2d850 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2d860 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d870 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2d880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d890 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d8a0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2d8b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2d8c0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2d8d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2d8e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
2d8f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d900 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2d910 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2d920 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2d930 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2d940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d950 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
2d960 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f  t already in pro
2d970 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72  gress.");......r
2d980 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2d990 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
2d9a0 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61  ..if (hKey >= ca
2d9b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d9c0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2d9d0 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61  es_count) {...ca
2d9e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d9f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2da00 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2da10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2da20 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75  .  Key handle ou
2da30 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75  t of range (requ
2da40 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f  ested key %lu, o
2da50 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69  nly %lu identiti
2da60 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c  es available).",
2da70 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2da80 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64   hKey, (unsigned
2da90 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65   long) cackey_se
2daa0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2dab0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
2dac0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
2dad0 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56  R_KEY_HANDLE_INV
2dae0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
2daf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2db00 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2db10 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
2db20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2db30 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
2db40 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
2db50 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
2db60 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2db70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2db80 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20  ypt_mech_parm = 
2db90 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72  pMechanism->pPar
2dba0 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f  ameter;..cackey_
2dbb0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2dbc0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
2dbd0 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61  parmlen = pMecha
2dbe0 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65  nism->ulParamete
2dbf0 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65  rLen;..cackey_se
2dc00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2dc10 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
2dc20 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
2dc30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2dc40 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b  dentities[hKey];
2dc50 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2dc60 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2dc70 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2dc80 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2dc90 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2dca0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2dcb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2dcc0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2dcd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2dce0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2dcf0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2dd00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2dd10 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2dd20 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2dd30 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2dd40 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2dd50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2dd60 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ecrypt)(CK_SESSI
2dd70 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2dd80 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2dd90 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
2dda0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
2ddb0 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  ptedDataLen, CK_
2ddc0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2ddd0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2dde0 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55  DataLen) {..CK_U
2ddf0 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64  LONG datalen_upd
2de00 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e  ate, datalen_fin
2de10 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79  al;..CK_RV decry
2de20 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  pt_ret;..int mut
2de30 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2de40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2de50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2de60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2de70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2de80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2de90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2dea0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2deb0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2dec0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ded0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2dee0 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c  ulDataLen == NUL
2def0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2df00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2df10 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73  r. pulDataLen is
2df20 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2df30 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2df40 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74  S_BAD);..}...dat
2df50 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70  alen_update = *p
2df60 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63  ulDataLen;...dec
2df70 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63  rypt_ret = C_Dec
2df80 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73  ryptUpdate(hSess
2df90 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44  ion, pEncryptedD
2dfa0 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  ata, ulEncrypted
2dfb0 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20  DataLen, pData, 
2dfc0 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29  &datalen_update)
2dfd0 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
2dfe0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
2dff0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e000 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
2e010 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72  ecryptUpdate() r
2e020 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2e030 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2e040 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
2e050 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69  crypt_ret);....i
2e060 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
2e070 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2e080 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20  _SMALL) {..../* 
2e090 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70  Terminate decryp
2e0a0 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
2e0b0 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  /.....mutex_retv
2e0c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2e0d0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2e0e0 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2e0f0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2e100 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2e110 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e120 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2e130 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2e140 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2e150 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
2e160 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2e170 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e180 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2e190 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2e1a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2e1b0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2e1c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e1d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2e1e0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2e1f0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2e200 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2e210 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ALID);....}.....
2e220 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2e230 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2e240 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
2e250 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2e260 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2e270 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2e280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e290 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2e2a0 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
2e2b0 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2e2c0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2e2d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2e2e0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
2e2f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e300 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2e310 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65  ve = 0;.....mute
2e320 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2e330 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2e340 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2e350 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
2e360 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
2e370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e380 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2e390 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2e3a0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2e3b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2e3c0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
2e3d0 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
2e3e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74  );..}...if (pDat
2e3f0 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20  a) {...pData += 
2e400 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
2e410 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61  .}..datalen_fina
2e420 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20  l = *pulDataLen 
2e430 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  - datalen_update
2e440 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
2e450 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
2e460 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61  (hSession, pData
2e470 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  , &datalen_final
2e480 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
2e490 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
2e4a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e4b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e4c0 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72  DecryptFinal() r
2e4d0 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2e4e0 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2e4f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
2e500 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72  crypt_ret);....r
2e510 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
2e520 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74  t);..}...*pulDat
2e530 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75  aLen = datalen_u
2e540 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f  pdate + datalen_
2e550 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  final;...CACKEY_
2e560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2e570 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2e580 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2e590 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2e5a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e5b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e5c0 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43  DecryptUpdate)(C
2e5d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2e5e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2e5f0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2e600 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2e610 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2e620 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2e630 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2e640 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2e650 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
2e660 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73  E buf[16384];..s
2e670 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09  size_t buflen;..
2e680 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
2e690 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
2e6a0 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2e6b0 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78  RROR;..int mutex
2e6c0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
2e6d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e6e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2e6f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2e700 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2e710 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e720 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2e730 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2e740 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2e750 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2e760 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2e770 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2e780 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2e790 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2e7a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2e7b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2e7c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e7d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e7e0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2e7f0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2e800 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2e810 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2e820 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45  ID);..}...if (pE
2e830 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20  ncryptedPart == 
2e840 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70  NULL && ulEncryp
2e850 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  tedPartLen == 0)
2e860 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2e870 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
2e880 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74  asked to decrypt
2e890 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
2e8a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e8b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2e8c0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
2e8d0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
2e8e0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
2e8f0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
2e900 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
2e910 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
2e920 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e930 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72  TF("Error. pEncr
2e940 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c  yptedPart is NUL
2e950 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74  L, but ulEncrypt
2e960 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  edPartLen is not
2e970 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
2e980 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2e990 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
2e9a0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2e9b0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2e9c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e9d0 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74  Error. ulEncrypt
2e9e0 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  edPartLen is 0, 
2e9f0 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
2ea00 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2ea10 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2ea20 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2ea30 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  (pulPartLen == N
2ea40 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2ea50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ea60 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20  ror. pulPartLen 
2ea70 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2ea80 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2ea90 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
2eaa0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2eab0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2eac0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2ead0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2eae0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2eaf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2eb00 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2eb10 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2eb20 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2eb30 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2eb40 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2eb50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2eb60 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2eb70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2eb80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2eb90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2eba0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ebb0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2ebc0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2ebd0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2ebe0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2ebf0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2ec00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ec10 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2ec20 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2ec30 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2ec40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2ec50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ec60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
2ec70 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
2ec80 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2ec90 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
2eca0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2ecb0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
2ecc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ecd0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
2ece0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
2ecf0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
2ed00 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
2ed10 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
2ed20 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
2ed30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ed40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ed50 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2ed60 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
2ed70 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
2ed80 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
2ed90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2eda0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2edb0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
2edc0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
2edd0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
2ede0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2edf0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
2ee00 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
2ee10 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
2ee20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
2ee30 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
2ee40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2ee50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2ee60 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
2ee70 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2ee80 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
2ee90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2eea0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2eeb0 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
2eec0 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
2eed0 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
2eee0 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a  d to decrypt */.
2eef0 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  ...buflen = cack
2ef00 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
2ef10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2ef20 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
2ef30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ef40 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
2ef50 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  , pEncryptedPart
2ef60 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  , ulEncryptedPar
2ef70 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f  tLen, buf, sizeo
2ef80 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a  f(buf), 0, 1);..
2ef90 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  ...if (buflen ==
2efa0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e   CACKEY_PCSC_E_N
2efb0 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b  EEDLOGIN && cack
2efc0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
2efd0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66  = NULL) {.....if
2efe0 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72   (C_LoginMutexAr
2eff0 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f  g(hSession, CKU_
2f000 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30  USER, NULL, 0, 0
2f010 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  ) == CKR_OK) {..
2f020 09 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63  ....buflen = cac
2f030 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
2f040 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
2f050 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
2f060 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2f070 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
2f080 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  y, pEncryptedPar
2f090 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  t, ulEncryptedPa
2f0a0 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65  rtLen, buf, size
2f0b0 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a  of(buf), 0, 1);.
2f0c0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
2f0d0 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  f (buflen < 0) {
2f0e0 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69  ...../* Decrypti
2f0f0 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  on failed. */...
2f100 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  ..if (buflen == 
2f110 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
2f120 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
2f130 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
2f140 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
2f150 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
2f160 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
2f170 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
2f180 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
2f190 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
2f1a0 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
2f1b0 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  lse {......CACKE
2f1c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f1d0 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41  Failed to send A
2f1e0 50 44 55 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69  PDU, error = %li
2f1f0 22 2c 20 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75  ", (long int) bu
2f200 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74  flen);.......ret
2f210 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2f220 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
2f230 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
2f240 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
2f250 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74  flen) > *pulPart
2f260 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a  Len && pPart) {.
2f270 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64  ..../* Decrypted
2f280 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
2f290 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
2f2a0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2f2b0 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20  MALL;....} else 
2f2c0 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29  {.....if (pPart)
2f2d0 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
2f2e0 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65  Part, buf, bufle
2f2f0 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a  n);.....}......*
2f300 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66  pulPartLen = buf
2f310 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
2f320 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
2f330 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2f340 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2f350 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2f360 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2f370 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2f380 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2f390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f3a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2f3b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2f3c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f3d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2f3e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2f3f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f400 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
2f410 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
2f420 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2f430 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2f440 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
2f450 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2f460 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2f470 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2f480 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  LastPart, CK_ULO
2f490 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61  NG_PTR pulLastPa
2f4a0 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
2f4b0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
2f4c0 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79   terminate_decry
2f4d0 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  pt = 1;...CACKEY
2f4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2f4f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2f500 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2f510 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2f520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f530 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2f540 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2f550 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2f560 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2f570 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2f580 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2f590 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2f5a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2f5b0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2f5c0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2f5d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f5e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f5f0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2f600 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2f610 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2f620 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2f630 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
2f640 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  LastPartLen == N
2f650 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2f660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f670 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74  ror. pulLastPart
2f680 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2f690 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2f6a0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2f6b0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2f6c0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2f6d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2f6e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2f6f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2f700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f710 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2f720 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2f730 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2f740 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2f750 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2f760 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f770 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2f780 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2f790 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2f7a0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2f7b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f7c0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2f7d0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2f7e0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2f7f0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2f800 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2f810 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f820 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2f830 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2f840 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f850 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f860 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2f870 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f880 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2f890 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2f8a0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2f8b0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2f8c0 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73  D);..}...*pulLas
2f8d0 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09  tPartLen = 0;...
2f8e0 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d  if (pLastPart ==
2f8f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69   NULL) {...termi
2f900 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30  nate_decrypt = 0
2f910 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
2f920 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a  nate_decrypt) {.
2f930 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2f940 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2f950 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
2f960 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2f970 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2f980 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2f990 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2f9a0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2f9b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f9c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f9d0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2f9e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f9f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2fa00 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2fa10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2fa20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2fa30 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2fa40 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2fa50 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2fa60 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2fa70 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f  _DigestInit)(CK_
2fa80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2fa90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2faa0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2fab0 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nism) {..CACKEY_
2fac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2fad0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2fae0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2faf0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2fb00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fb10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2fb20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2fb30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2fb40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2fb50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2fb60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2fb70 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2fb80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fb90 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2fba0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fbb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2fbc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fbd0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2fbe0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2fbf0 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2fc00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2fc10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2fc20 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2fc30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2fc40 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2fc50 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
2fc60 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
2fc70 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2fc80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2fc90 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2fca0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2fcb0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2fcc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fcd0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2fce0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2fcf0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2fd00 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2fd10 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2fd20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2fd30 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2fd40 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2fd50 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2fd60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2fd70 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2fd80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2fd90 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2fda0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2fdb0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55  CK_RV, C_DigestU
2fdc0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2fdd0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2fde0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2fdf0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2fe00 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
2fe10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fe20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2fe30 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2fe40 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2fe50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fe60 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2fe70 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2fe80 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2fe90 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2fea0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2feb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fec0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2fed0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2fee0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2fef0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ff00 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2ff10 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2ff20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2ff30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2ff40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2ff50 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53  gestKey)(CK_SESS
2ff60 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ff70 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
2ff80 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2ff90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ffa0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ffb0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ffc0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ffd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ffe0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2fff0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30000 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30010 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30020 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30030 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30040 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
30050 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30060 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
30070 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30080 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
30090 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
300a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
300b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
300c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
300d0 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f  DigestFinal)(CK_
300e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
300f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
30100 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
30110 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
30120 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
30130 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30140 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30150 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30160 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
30170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30180 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
30190 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
301a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
301b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
301c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
301d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
301e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
301f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30200 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
30210 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30220 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
30230 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
30240 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
30250 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30260 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
30270 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  nInit)(CK_SESSIO
30280 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
30290 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
302a0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
302b0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
302c0 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75   hKey) {..int mu
302d0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b  tex_retval;...hK
302e0 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ey--;...CACKEY_D
302f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
30300 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
30310 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
30320 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
30330 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30340 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
30350 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
30360 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
30370 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
30380 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
30390 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  nism == NULL) {.
303a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
303b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
303c0 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c  echanism is NULL
303d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
303e0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
303f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
30400 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
30410 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  m != CKM_RSA_PKC
30420 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
30430 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30440 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  r. pMechanism->m
30450 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65  echanism not spe
30460 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53  cified as CKM_RS
30470 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74  A_PKCS");....ret
30480 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53  urn(CKR_MECHANIS
30490 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29  M_PARAM_INVALID)
304a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
304b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
304c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
304d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
304e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
304f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
30500 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
30510 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
30520 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
30530 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
30540 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
30550 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
30560 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
30570 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
30580 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
30590 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
305a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
305b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
305c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
305d0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
305e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
305f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
30600 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
30610 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30620 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
30630 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
30640 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
30650 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
30660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30670 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
30680 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
30690 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
306a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
306b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
306c0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
306d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
306e0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
306f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
30700 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
30710 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
30720 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30730 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69    Sign already i
30740 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
30750 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
30760 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
30770 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
30780 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
30790 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
307a0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
307b0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
307c0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
307d0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
307e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
307f0 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
30800 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
30810 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
30820 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
30830 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
30840 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
30850 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
30860 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
30870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30880 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
30890 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
308a0 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
308b0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
308c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
308d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
308e0 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
308f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
30900 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
30910 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
30920 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
30930 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
30940 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
30950 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09  _buflen = 128;..
30960 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30970 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
30980 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63  ufused = 0;..cac
30990 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
309a0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
309b0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
309c0 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
309d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
309e0 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
309f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30a00 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a  .sign_buflen);..
30a10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30a20 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c  INTF("Session %l
30a30 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  u sign_identity 
30a40 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20  is %p (identity 
30a50 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  #%lu)", (unsigne
30a60 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
30a70 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b  , (void *) &cack
30a80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
30a90 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
30aa0 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65  [hKey], (unsigne
30ab0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09  d long) hKey);..
30ac0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30ad0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
30ae0 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
30af0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
30b00 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
30b10 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
30b20 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
30b30 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
30b40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
30b50 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
30b60 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
30b70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30b80 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
30b90 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
30ba0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
30bb0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
30bc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30bd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30be0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
30bf0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
30c00 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
30c10 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
30c20 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45  V, C_Sign)(CK_SE
30c30 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30c40 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
30c50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
30c60 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
30c70 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
30c80 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
30c90 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
30ca0 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
30cb0 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f  long start_sign_
30cc0 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20  bufused;..CK_RV 
30cd0 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  sign_ret;..int m
30ce0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
30cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30d00 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30d10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
30d20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
30d30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30d40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30d50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30d60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30d70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30d80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
30d90 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
30da0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
30db0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
30dc0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
30dd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30de0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
30df0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30e00 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
30e10 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
30e20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
30e30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
30e40 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74  NVALID);..}...st
30e50 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
30e60 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
30e70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
30e80 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67  n_bufused;...sig
30e90 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70  n_ret = C_SignUp
30ea0 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
30eb0 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29  Data, ulDataLen)
30ec0 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
30ed0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
30ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30ef0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
30f00 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
30f10 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
30f20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
30f30 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
30f40 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  );....if (sign_r
30f50 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
30f60 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
30f70 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
30f80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
30f90 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
30fa0 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
30fb0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
30fc0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30fd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30fe0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
30ff0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
31000 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
31010 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
31020 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
31030 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
31040 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
31050 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
31060 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
31070 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31080 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
31090 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
310a0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
310b0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
310c0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
310d0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
310e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
310f0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
31100 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
31110 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
31120 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
31130 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
31140 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31150 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
31160 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
31170 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
31180 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
31190 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
311a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
311b0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
311c0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
311d0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
311e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
311f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
31200 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
31210 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
31220 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31230 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
31240 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
31250 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
31260 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
31270 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
31280 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
31290 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20  ;..}...sign_ret 
312a0 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53  = C_SignFinal(hS
312b0 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75  ession, pSignatu
312c0 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  re, pulSignature
312d0 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
312e0 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
312f0 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ...if (sign_ret 
31300 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
31310 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41  O_SMALL) {....CA
31320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31330 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72  F("SignFinal() r
31340 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46  eturned CKR_BUFF
31350 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76  ER_TOO_SMALL (rv
31360 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67   = %lu), undoing
31370 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22   C_SignUpdate()"
31380 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
31390 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
313a0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
313b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
313c0 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
313d0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
313e0 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
313f0 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  t);...}....CACKE
31400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31410 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61  Error.  SignFina
31420 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
31430 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
31440 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
31450 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
31460 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
31470 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67  );..}...if (pSig
31480 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20  nature == NULL) 
31490 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
314a0 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74  _PRINTF("pSignat
314b0 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73  ure specified as
314c0 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43   NULL, undoing C
314d0 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b  _SignUpdate()");
314e0 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
314f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31500 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
31510 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
31520 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
31530 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ret);..}...CACKE
31540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31550 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
31560 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
31570 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
31580 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
31590 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
315a0 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b  C_SignUpdate)(CK
315b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
315c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
315d0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
315e0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
315f0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
31600 74 76 61 6c 3b 0a 09 69 6e 74 20 72 65 73 69 7a  tval;..int resiz
31610 65 52 65 74 72 79 3b 0a 09 69 6e 74 20 6e 65 65  eRetry;..int nee
31620 64 52 65 73 69 7a 65 3b 0a 0a 09 43 41 43 4b 45  dResize;...CACKE
31630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
31640 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
31650 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
31660 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
31670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31680 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
31690 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
316a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
316b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
316c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
316d0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
316e0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
316f0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
31700 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
31710 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
31720 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
31730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31740 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
31750 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
31760 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
31770 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
31780 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
31790 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
317a0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
317b0 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
317c0 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
317d0 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
317e0 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
317f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31800 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
31810 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
31820 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
31830 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
31840 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
31850 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
31860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
31870 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
31880 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
31890 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
318a0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
318b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
318c0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
318d0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
318e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
318f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
31900 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
31910 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
31920 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
31930 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
31940 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
31950 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
31960 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
31970 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
31980 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
31990 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
319a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
319b0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
319c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
319d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
319e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
319f0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
31a00 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
31a10 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
31a20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
31a30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
31a40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31a50 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
31a60 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
31a70 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
31a80 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
31a90 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
31aa0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
31ab0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
31ac0 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
31ad0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
31ae0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31af0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
31b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
31b10 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
31b20 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
31b30 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
31b40 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
31b50 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
31b60 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
31b70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31b80 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
31b90 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
31ba0 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
31bb0 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
31bc0 0a 09 09 09 66 6f 72 20 28 72 65 73 69 7a 65 52  ....for (resizeR
31bd0 65 74 72 79 20 3d 20 30 3b 20 72 65 73 69 7a 65  etry = 0; resize
31be0 52 65 74 72 79 20 3c 20 31 31 3b 20 72 65 73 69  Retry < 11; resi
31bf0 7a 65 52 65 74 72 79 2b 2b 29 20 7b 0a 09 09 09  zeRetry++) {....
31c00 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 30 3b  .needResize = 0;
31c10 0a 09 09 09 09 69 66 20 28 28 63 61 63 6b 65 79  .....if ((cackey
31c20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
31c30 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
31c40 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20   + ulPartLen) > 
31c50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31c60 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
31c70 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 09 6e 65  uflen) {......ne
31c80 65 64 52 65 73 69 7a 65 20 3d 20 31 3b 0a 09 09  edResize = 1;...
31c90 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 21 6e 65  ..}......if (!ne
31ca0 65 64 52 65 73 69 7a 65 29 20 7b 0a 09 09 09 09  edResize) {.....
31cb0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
31cc0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31cd0 50 52 49 4e 54 46 28 22 52 65 73 69 7a 69 6e 67  PRINTF("Resizing
31ce0 20 73 69 67 6e 69 6e 67 20 62 75 66 66 65 72 20   signing buffer 
31cf0 28 74 72 79 20 23 25 69 20 6f 66 20 31 30 20 2d  (try #%i of 10 -
31d00 2d 20 31 31 74 68 20 69 73 20 66 61 74 61 6c 29  - 11th is fatal)
31d10 22 2c 20 72 65 73 69 7a 65 52 65 74 72 79 29 3b  ", resizeRetry);
31d20 0a 0a 09 09 09 09 69 66 20 28 72 65 73 69 7a 65  ......if (resize
31d30 52 65 74 72 79 20 3d 3d 20 31 30 29 20 7b 0a 09  Retry == 10) {..
31d40 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
31d50 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
31d60 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 0a 09  n].sign_buf);...
31d70 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
31d80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31d90 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 30 3b 0a 09  gn_buflen = 0;..
31da0 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
31db0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31dc0 67 6e 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a  gn_buf = NULL;..
31dd0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
31de0 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  }......cackey_se
31df0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31e00 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20  .sign_buflen *= 
31e10 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  2;......cackey_s
31e20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
31e30 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61  ].sign_buf = rea
31e40 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73  lloc(cackey_sess
31e50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31e60 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  ign_buf, sizeof(
31e70 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
31e80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31e90 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
31ea0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
31eb0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09  .sign_buflen);..
31ec0 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b  ..}.....if (cack
31ed0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
31ee0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
31ef0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 61  = NULL) {.....ca
31f00 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
31f10 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
31f20 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
31f30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31f40 6f 72 2e 20 20 53 69 67 6e 69 6e 67 20 62 75 66  or.  Signing buf
31f50 66 65 72 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  fer is NULL.");.
31f60 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
31f70 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
31f80 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
31f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31fa0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
31fb0 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73  uf + cackey_sess
31fc0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31fd0 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61  ign_bufused, pPa
31fe0 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a  rt, ulPartLen);.
31ff0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
32000 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32010 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c  gn_bufused += ul
32020 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65  PartLen;.....bre
32030 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ak;..}...mutex_r
32040 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
32050 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
32060 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
32070 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
32080 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
32090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
320a0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
320b0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
320c0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
320d0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
320e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
320f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
32100 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
32110 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
32120 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
32130 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
32140 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28  V, C_SignFinal)(
32150 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
32160 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
32170 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
32180 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
32190 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
321a0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
321b0 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d  YTE sigbuf[1024]
321c0 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75  ;..ssize_t sigbu
321d0 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
321e0 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
321f0 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
32200 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
32210 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  t terminate_sign
32220 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78   = 1;..int mutex
32230 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
32240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
32250 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
32260 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
32270 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
32280 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
32290 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
322a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
322b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
322c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
322d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
322e0 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20  SignatureLen == 
322f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
32300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
32310 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75  rror. pulSignatu
32320 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  reLen is NULL.")
32330 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
32340 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
32350 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
32360 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
32370 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
32380 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
32390 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
323a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
323b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
323c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
323d0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
323e0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
323f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
32400 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
32410 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
32420 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
32430 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
32440 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
32450 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
32460 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
32470 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
32480 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
32490 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
324a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
324b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
324c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
324d0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
324e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
324f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
32500 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
32510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
32520 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
32530 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
32540 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
32550 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
32560 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
32570 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
32580 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
32590 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
325a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
325b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
325c0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
325d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
325e0 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
325f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
32600 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
32610 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
32620 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
32630 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32640 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
32650 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
32660 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
32670 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
32680 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
32690 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
326a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
326b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
326c0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
326d0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
326e0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
326f0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
32700 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
32710 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
32720 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
32730 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
32740 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
32750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32760 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
32770 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
32780 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
32790 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
327a0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
327b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
327c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
327d0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
327e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
327f0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
32800 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32810 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
32820 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
32830 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
32840 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
32850 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41  to sign */....CA
32860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32870 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67  F("Asking to sig
32880 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20  n from identity 
32890 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c  %p in session %l
328a0 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63  u", (void *) cac
328b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
328c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
328d0 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
328e0 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
328f0 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
32900 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
32910 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
32920 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
32930 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
32940 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
32950 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  y, cackey_sessio
32960 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
32970 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
32980 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
32990 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73  .sign_bufused, s
329a0 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
329b0 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
329c0 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
329d0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
329e0 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61  _NEEDLOGIN && ca
329f0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
32a00 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
32a10 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74 65 78  if (C_LoginMutex
32a20 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b  Arg(hSession, CK
32a30 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c  U_USER, NULL, 0,
32a40 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b   0) == CKR_OK) {
32a50 0a 09 09 09 09 09 73 69 67 62 75 66 6c 65 6e 20  ......sigbuflen 
32a60 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
32a70 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
32a80 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
32a90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32aa0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
32ab0 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ity, cackey_sess
32ac0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32ad0 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f  ign_buf, cackey_
32ae0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32af0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
32b00 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28   sigbuf, sizeof(
32b10 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a  sigbuf), 1, 0);.
32b20 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
32b30 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30  f (sigbuflen < 0
32b40 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69  ) {...../* Signi
32b50 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  ng failed. */...
32b60 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
32b70 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
32b80 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
32b90 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
32ba0 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
32bb0 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
32bc0 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
32bd0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
32be0 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
32bf0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44  ..retval = CKR_D
32c00 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09  EVICE_REMOVED;..
32c10 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
32c20 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45  .retval = CKR_GE
32c30 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
32c40 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  .}....} else if 
32c50 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
32c60 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a  ) sigbuflen) > *
32c70 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
32c80 26 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b  && pSignature) {
32c90 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64  ...../* Signed d
32ca0 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  ata too large */
32cb0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
32cc0 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c  G_PRINTF("retval
32cd0 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
32ce0 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66  O_SMALL;  sigbuf
32cf0 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69  len = %lu, pulSi
32d00 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75  gnatureLen = %lu
32d10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
32d20 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75  g) sigbuflen, (u
32d30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70  nsigned long) *p
32d40 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b  ulSignatureLen);
32d50 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
32d60 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
32d70 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e  ALL;......termin
32d80 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09  ate_sign = 0;...
32d90 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65  .} else {.....te
32da0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
32db0 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e  ;......if (pSign
32dc0 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65  ature) {......me
32dd0 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c  mcpy(pSignature,
32de0 20 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c   sigbuf, sigbufl
32df0 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69  en);.......termi
32e00 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
32e10 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69  ...}......*pulSi
32e20 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67  gnatureLen = sig
32e30 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74  buflen;......ret
32e40 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09  val = CKR_OK;...
32e50 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
32e60 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65  ...if (terminate
32e70 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63  _sign) {...if (c
32e80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
32e90 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
32ea0 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  f) {....free(cac
32eb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
32ec0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
32ed0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
32ee0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32ef0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
32f00 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
32f10 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
32f20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
32f30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
32f40 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
32f50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
32f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32f70 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
32f80 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
32f90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
32fa0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
32fb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32fc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
32fd0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
32fe0 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
32ff0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
33000 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
33010 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
33020 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
33030 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
33040 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
33050 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
33060 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
33070 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
33080 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
33090 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
330a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
330b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
330c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
330d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
330e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
330f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
33100 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
33110 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
33120 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
33130 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
33140 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
33150 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
33160 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33170 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
33180 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33190 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
331a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
331b0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
331c0 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  er)(CK_SESSION_H
331d0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
331e0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
331f0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
33200 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
33210 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
33220 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
33230 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
33240 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33250 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33260 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33270 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33290 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
332a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
332b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
332c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
332d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
332e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
332f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33300 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33310 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33320 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33330 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33340 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33350 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33360 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33370 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33380 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f  _VerifyInit)(CK_
33390 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
333a0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
333b0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
333c0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
333d0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
333e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
333f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33400 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33410 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33430 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33440 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33450 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33460 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33470 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33490 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
334a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
334b0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
334c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
334d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
334e0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
334f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33500 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33510 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33520 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53  _Verify)(CK_SESS
33530 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
33540 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
33550 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
33560 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
33570 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
33580 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
33590 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
335a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
335b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
335c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
335d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
335e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
335f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33600 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33610 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33620 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33630 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33650 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33660 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33670 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33680 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33690 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
336a0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
336b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
336c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
336d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
336e0 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  _VerifyUpdate)(C
336f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
33700 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
33710 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
33720 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
33730 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
33740 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
33750 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
33760 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
33770 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
33780 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
33790 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
337a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
337b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
337c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
337d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
337e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
337f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
33800 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
33810 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
33820 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
33830 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
33840 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
33850 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
33860 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
33870 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61  RV, C_VerifyFina
33880 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
33890 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
338a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
338b0 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
338c0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
338d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
338e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
338f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
33900 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
33910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33920 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
33930 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
33940 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
33950 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
33960 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
33970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
33980 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
33990 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
339a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
339b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
339c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
339d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
339e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
339f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
33a00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
33a10 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
33a20 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
33a30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33a40 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
33a50 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
33a60 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
33a70 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
33a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
33a90 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
33aa0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33ab0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33ad0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33ae0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33af0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33b00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33b10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33b20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33b30 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33b40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
33b50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
33b60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33b70 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
33b80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33b90 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
33ba0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33bb0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
33bc0 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  yRecover)(CK_SES
33bd0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
33be0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
33bf0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
33c00 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
33c10 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  reLen, CK_BYTE_P
33c20 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
33c30 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65  NG_PTR pulDataLe
33c40 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
33c50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
33c60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
33c70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
33c80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
33c90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
33ca0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
33cb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
33cc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
33cd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
33ce0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
33cf0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
33d00 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
33d10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
33d20 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
33d30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33d40 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
33d50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
33d60 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
33d70 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
33d80 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63  _RV, C_DigestEnc
33d90 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
33da0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
33db0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
33dc0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
33dd0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
33de0 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
33df0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
33e00 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
33e10 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
33e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
33e30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
33e40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
33e50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
33e60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
33e70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
33e80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
33e90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
33ea0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
33eb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
33ec0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
33ed0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
33ee0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
33ef0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
33f00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
33f10 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
33f20 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
33f30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
33f40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
33f50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
33f60 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70  _DecryptDigestUp
33f70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
33f80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
33f90 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
33fa0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
33fb0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
33fc0 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
33fd0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
33fe0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
33ff0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
34000 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
34010 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
34020 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
34030 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
34040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
34050 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
34060 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
34070 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
34080 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
34090 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
340a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
340b0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
340c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
340d0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
340e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
340f0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
34100 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34110 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
34120 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
34130 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45  N(CK_RV, C_SignE
34140 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
34150 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34160 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
34170 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
34180 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
34190 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
341a0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
341b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
341c0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
341d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
341e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
341f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
34200 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
34210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
34220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
34230 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
34240 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
34250 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
34260 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
34270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34280 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
34290 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
342a0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
342b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
342c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
342d0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
342e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
342f0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
34300 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
34310 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79   C_DecryptVerify
34320 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
34330 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
34340 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
34350 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
34360 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
34370 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
34380 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
34390 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
343a0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
343b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
343c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
343d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
343e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
343f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34400 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
34410 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
34420 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
34430 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
34440 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
34450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
34460 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
34470 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34480 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
34490 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
344a0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
344b0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
344c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
344d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
344e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
344f0 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53  erateKey)(CK_SES
34500 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
34510 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
34520 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
34530 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  m, CK_ATTRIBUTE_
34540 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
34550 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
34560 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
34570 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
34580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34590 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
345a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
345b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
345c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
345d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
345e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
345f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
34600 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
34610 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
34620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34630 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
34640 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34650 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
34660 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34670 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
34680 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
34690 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
346a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
346b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
346c0 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
346d0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
346e0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
346f0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
34700 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54  Mechanism, CK_AT
34710 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62  TRIBUTE_PTR pPub
34720 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  licKeyTemplate, 
34730 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69  CK_ULONG ulPubli
34740 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  cKeyAttributeCou
34750 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  nt, CK_ATTRIBUTE
34760 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79  _PTR pPrivateKey
34770 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
34780 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41  NG ulPrivateKeyA
34790 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
347a0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
347b0 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c  PTR phPublicKey,
347c0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
347d0 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b  E_PTR phPrivateK
347e0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
347f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
34800 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
34810 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
34820 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
34830 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
34840 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
34850 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
34860 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
34870 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
34880 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
34890 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
348a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
348b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
348c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
348d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
348e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
348f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34900 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
34910 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
34920 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29  K_RV, C_WrapKey)
34930 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
34940 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
34950 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
34960 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
34970 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70  ECT_HANDLE hWrap
34980 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  pingKey, CK_OBJE
34990 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20  CT_HANDLE hKey, 
349a0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
349b0 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
349c0 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64  G_PTR pulWrapped
349d0 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  KeyLen) {..CACKE
349e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
349f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
34a00 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
34a10 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
34a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
34a30 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
34a40 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
34a50 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
34a60 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
34a70 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
34a80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
34a90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
34aa0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
34ab0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
34ac0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
34ad0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
34ae0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
34af0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
34b00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
34b10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72  ON(CK_RV, C_Unwr
34b20 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
34b30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
34b40 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
34b50 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
34b60 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
34b70 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c   hUnwrappingKey,
34b80 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72   CK_BYTE_PTR pWr
34b90 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f  appedKey, CK_ULO
34ba0 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  NG ulWrappedKeyL
34bb0 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  en, CK_ATTRIBUTE
34bc0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
34bd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69  CK_ULONG ulAttri
34be0 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
34bf0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
34c00 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  phKey) {..CACKEY
34c10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
34c20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
34c30 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
34c40 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
34c50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
34c60 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
34c70 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
34c80 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
34c90 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
34ca0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
34cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
34cc0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
34cd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34ce0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
34cf0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34d00 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
34d10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34d20 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
34d30 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
34d40 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76  N(CK_RV, C_Deriv
34d50 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
34d60 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
34d70 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
34d80 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
34d90 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
34da0 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54  hBaseKey, CK_ATT
34db0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
34dc0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
34dd0 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
34de0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
34df0 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
34e00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34e10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
34e20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
34e30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
34e40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34e50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
34e60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
34e70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
34e80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
34e90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
34ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34eb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
34ec0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34ed0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
34ee0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34ef0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
34f00 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
34f10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
34f20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
34f30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
34f40 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f  _SeedRandom)(CK_
34f50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
34f60 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
34f70 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55  _PTR pSeed, CK_U
34f80 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20  LONG ulSeedLen) 
34f90 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
34fa0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
34fb0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
34fc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
34fd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34fe0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
34ff0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
35000 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
35010 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
35020 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
35030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35040 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
35050 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35060 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
35070 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
35080 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
35090 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
350a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
350b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
350c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
350d0 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  , C_GenerateRand
350e0 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
350f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
35100 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e  CK_BYTE_PTR pRan
35110 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  domData, CK_ULON
35120 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b  G ulRandomLen) {
35130 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35140 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
35150 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
35160 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
35170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35180 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
35190 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
351a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
351b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
351c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
351d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
351e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
351f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
35200 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
35210 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35220 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
35230 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
35240 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
35250 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63  D);.}../* Deprec
35260 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
35270 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
35280 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
35290 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28  FunctionStatus)(
352a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
352b0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
352c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
352d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
352e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
352f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
35300 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35310 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c  _PARALLEL (%i)",
35320 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35330 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72  T_PARALLEL);...r
35340 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
35350 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
35360 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68  ;...hSession = h
35370 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72  Session; /* Supr
35380 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
35390 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
353a0 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20  ../* Deprecated 
353b0 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44  Function */.CK_D
353c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
353d0 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75  K_RV, C_CancelFu
353e0 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  nction)(CK_SESSI
353f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
35400 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  on) {..CACKEY_DE
35410 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
35420 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ed.");...CACKEY_
35430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
35440 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
35450 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
35460 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  L (%i)", CKR_FUN
35470 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
35480 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  EL);...return(CK
35490 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
354a0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73  ARALLEL);...hSes
354b0 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b  sion = hSession;
354c0 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73   /* Supress unus
354d0 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e  ed variable warn
354e0 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46  ing */.}..CK_DEF
354f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
35500 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
35510 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49  nList)(CK_FUNCTI
35520 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20  ON_LIST_PTR_PTR 
35530 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20  ppFunctionList) 
35540 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 46 55 4e  {..static CK_FUN
35550 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 73  CTION_LIST_PTR s
35560 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
35570 4e 55 4c 4c 3b 0a 09 43 4b 5f 46 55 4e 43 54 49  NULL;..CK_FUNCTI
35580 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e  ON_LIST_PTR pFun
35590 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43  ctionList;...CAC
355a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
355b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
355c0 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  f (ppFunctionLis
355d0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
355e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
355f0 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e  TF("Error. ppFun
35600 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c  ctionList is NUL
35610 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
35620 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
35630 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 70 46  D);..}...if (spF
35640 75 6e 63 74 69 6f 6e 4c 69 73 74 20 21 3d 20 4e  unctionList != N
35650 55 4c 4c 29 20 7b 0a 09 09 2a 70 70 46 75 6e 63  ULL) {...*ppFunc
35660 74 69 6f 6e 4c 69 73 74 20 3d 20 73 70 46 75 6e  tionList = spFun
35670 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 09 43 41  ctionList;....CA
35680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
35690 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
356a0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
356b0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
356c0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  R_OK);..}...pFun
356d0 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
356e0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
356f0 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
35700 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
35710 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
35720 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
35730 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
35740 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
35750 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
35760 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
35770 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
35780 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
35790 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
357a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
357b0 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
357c0 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
357d0 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
357e0 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
357f0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35800 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
35810 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
35820 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
35830 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
35840 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
35850 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
35860 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
35870 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
35880 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
35890 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
358a0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
358b0 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
358c0 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
358d0 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
358e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
358f0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
35900 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
35910 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
35920 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
35930 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
35940 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
35950 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35960 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
35970 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
35980 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
35990 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
359a0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
359b0 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
359c0 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
359d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
359e0 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
359f0 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
35a00 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
35a10 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
35a20 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
35a30 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
35a40 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
35a50 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
35a60 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35a70 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
35a80 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
35a90 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
35aa0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
35ab0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
35ac0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
35ad0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35ae0 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
35af0 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
35b00 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
35b10 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
35b20 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
35b30 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35b40 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
35b50 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
35b60 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
35b70 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
35b80 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
35b90 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
35ba0 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
35bb0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
35bc0 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
35bd0 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
35be0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
35bf0 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
35c00 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
35c10 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
35c20 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
35c30 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
35c40 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
35c50 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
35c60 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
35c70 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
35c80 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
35c90 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35ca0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
35cb0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
35cc0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
35cd0 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
35ce0 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
35cf0 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
35d00 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
35d10 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
35d20 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
35d30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35d40 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
35d50 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
35d60 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
35d70 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
35d80 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
35d90 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
35da0 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
35db0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
35dc0 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
35dd0 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
35de0 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
35df0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
35e00 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
35e10 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
35e20 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
35e30 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
35e40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
35e50 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
35e60 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
35e70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35e80 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
35e90 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
35ea0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
35eb0 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
35ec0 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
35ed0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35ee0 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
35ef0 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
35f00 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
35f10 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
35f20 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
35f30 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
35f40 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
35f50 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35f60 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
35f70 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
35f80 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35f90 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
35fa0 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
35fb0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
35fc0 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
35fd0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
35fe0 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
35ff0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
36000 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
36010 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
36020 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
36030 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
36040 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
36050 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
36060 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
36070 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
36080 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
36090 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
360a0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
360b0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
360c0 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
360d0 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
360e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
360f0 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
36100 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
36110 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
36120 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
36130 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
36140 69 6f 6e 4c 69 73 74 2d 3e 43 5